From 20896e65c969a98b319ca59891da3b105ca34026 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 27 Feb 2023 13:43:39 +0900 Subject: [PATCH 001/962] =?UTF-8?q?feat:=20=E8=84=86=E5=BC=B1=E6=80=A7?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81=E3=83=AD?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 208 +++++++++--------- .../check-view-security-option/Pipfile.lock | 60 ++--- 2 files changed, 134 insertions(+), 134 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index b1423ff9..c014034a 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,19 +26,19 @@ }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", + "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" ], "index": "pypi", - "version": "==1.26.52" + "version": "==1.26.76" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", + "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" ], "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "version": "==1.29.76" }, "certifi": { "hashes": [ @@ -250,11 +250,11 @@ }, "platformdirs": { "hashes": [ - "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490", - "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2" + "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9", + "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567" ], "markers": "python_version >= '3.7'", - "version": "==2.6.2" + "version": "==3.0.0" }, "pyjwt": { "hashes": [ @@ -328,11 +328,11 @@ }, "tenacity": { "hashes": [ - "sha256:35525cd47f82830069f0d6b73f7eb83bc5b73ee2fff0437952cedf98b27653ac", - "sha256:e48c437fdf9340f5666b92cd7990e96bc5fc955e1298baf4a907e3972067a445" + "sha256:c7bb4b86425b977726a7b49971542d4f67baf72096597d283f3ffd01f33b92df", + "sha256:dd1b769ca7002fda992322939feca5bee4fa11f39146b0af14e0b8d9f27ea854" ], "index": "pypi", - "version": "==8.1.0" + "version": "==8.2.1" }, "urllib3": { "hashes": [ @@ -370,19 +370,19 @@ }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", + "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" ], "index": "pypi", - "version": "==1.26.52" + "version": "==1.26.76" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", + "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" ], "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "version": "==1.29.76" }, "certifi": { "hashes": [ @@ -560,89 +560,89 @@ "toml" ], "hashes": [ - "sha256:051afcbd6d2ac39298d62d340f94dbb6a1f31de06dfaf6fcef7b759dd3860c45", - "sha256:0a1890fca2962c4f1ad16551d660b46ea77291fba2cc21c024cd527b9d9c8809", - "sha256:0ee30375b409d9a7ea0f30c50645d436b6f5dfee254edffd27e45a980ad2c7f4", - "sha256:13250b1f0bd023e0c9f11838bdeb60214dd5b6aaf8e8d2f110c7e232a1bff83b", - "sha256:17e01dd8666c445025c29684d4aabf5a90dc6ef1ab25328aa52bedaa95b65ad7", - "sha256:19245c249aa711d954623d94f23cc94c0fd65865661f20b7781210cb97c471c0", - "sha256:1caed2367b32cc80a2b7f58a9f46658218a19c6cfe5bc234021966dc3daa01f0", - "sha256:1f66862d3a41674ebd8d1a7b6f5387fe5ce353f8719040a986551a545d7d83ea", - "sha256:220e3fa77d14c8a507b2d951e463b57a1f7810a6443a26f9b7591ef39047b1b2", - "sha256:276f4cd0001cd83b00817c8db76730938b1ee40f4993b6a905f40a7278103b3a", - "sha256:29de916ba1099ba2aab76aca101580006adfac5646de9b7c010a0f13867cba45", - "sha256:2a7f23bbaeb2a87f90f607730b45564076d870f1fb07b9318d0c21f36871932b", - "sha256:2c407b1950b2d2ffa091f4e225ca19a66a9bd81222f27c56bd12658fc5ca1209", - "sha256:30b5fec1d34cc932c1bc04017b538ce16bf84e239378b8f75220478645d11fca", - "sha256:3c2155943896ac78b9b0fd910fb381186d0c345911f5333ee46ac44c8f0e43ab", - "sha256:411d4ff9d041be08fdfc02adf62e89c735b9468f6d8f6427f8a14b6bb0a85095", - "sha256:436e103950d05b7d7f55e39beeb4d5be298ca3e119e0589c0227e6d0b01ee8c7", - "sha256:49640bda9bda35b057b0e65b7c43ba706fa2335c9a9896652aebe0fa399e80e6", - "sha256:4a950f83fd3f9bca23b77442f3a2b2ea4ac900944d8af9993743774c4fdc57af", - "sha256:50a6adc2be8edd7ee67d1abc3cd20678987c7b9d79cd265de55941e3d0d56499", - "sha256:52ab14b9e09ce052237dfe12d6892dd39b0401690856bcfe75d5baba4bfe2831", - "sha256:54f7e9705e14b2c9f6abdeb127c390f679f6dbe64ba732788d3015f7f76ef637", - "sha256:66e50680e888840c0995f2ad766e726ce71ca682e3c5f4eee82272c7671d38a2", - "sha256:790e4433962c9f454e213b21b0fd4b42310ade9c077e8edcb5113db0818450cb", - "sha256:7a38362528a9115a4e276e65eeabf67dcfaf57698e17ae388599568a78dcb029", - "sha256:7b05ed4b35bf6ee790832f68932baf1f00caa32283d66cc4d455c9e9d115aafc", - "sha256:7e109f1c9a3ece676597831874126555997c48f62bddbcace6ed17be3e372de8", - "sha256:949844af60ee96a376aac1ded2a27e134b8c8d35cc006a52903fc06c24a3296f", - "sha256:95304068686545aa368b35dfda1cdfbbdbe2f6fe43de4a2e9baa8ebd71be46e2", - "sha256:9e662e6fc4f513b79da5d10a23edd2b87685815b337b1a30cd11307a6679148d", - "sha256:a9fed35ca8c6e946e877893bbac022e8563b94404a605af1d1e6accc7eb73289", - "sha256:b69522b168a6b64edf0c33ba53eac491c0a8f5cc94fa4337f9c6f4c8f2f5296c", - "sha256:b78729038abea6a5df0d2708dce21e82073463b2d79d10884d7d591e0f385ded", - "sha256:b8c56bec53d6e3154eaff6ea941226e7bd7cc0d99f9b3756c2520fc7a94e6d96", - "sha256:b9727ac4f5cf2cbf87880a63870b5b9730a8ae3a4a360241a0fdaa2f71240ff0", - "sha256:ba3027deb7abf02859aca49c865ece538aee56dcb4871b4cced23ba4d5088904", - "sha256:be9fcf32c010da0ba40bf4ee01889d6c737658f4ddff160bd7eb9cac8f094b21", - "sha256:c18d47f314b950dbf24a41787ced1474e01ca816011925976d90a88b27c22b89", - "sha256:c76a3075e96b9c9ff00df8b5f7f560f5634dffd1658bafb79eb2682867e94f78", - "sha256:cbfcba14a3225b055a28b3199c3d81cd0ab37d2353ffd7f6fd64844cebab31ad", - "sha256:d254666d29540a72d17cc0175746cfb03d5123db33e67d1020e42dae611dc196", - "sha256:d66187792bfe56f8c18ba986a0e4ae44856b1c645336bd2c776e3386da91e1dd", - "sha256:d8d04e755934195bdc1db45ba9e040b8d20d046d04d6d77e71b3b34a8cc002d0", - "sha256:d8f3e2e0a1d6777e58e834fd5a04657f66affa615dae61dd67c35d1568c38882", - "sha256:e057e74e53db78122a3979f908973e171909a58ac20df05c33998d52e6d35757", - "sha256:e4ce984133b888cc3a46867c8b4372c7dee9cee300335e2925e197bcd45b9e16", - "sha256:ea76dbcad0b7b0deb265d8c36e0801abcddf6cc1395940a24e3595288b405ca0", - "sha256:ecb0f73954892f98611e183f50acdc9e21a4653f294dfbe079da73c6378a6f47", - "sha256:ef14d75d86f104f03dea66c13188487151760ef25dd6b2dbd541885185f05f40", - "sha256:f26648e1b3b03b6022b48a9b910d0ae209e2d51f50441db5dce5b530fad6d9b1", - "sha256:f67472c09a0c7486e27f3275f617c964d25e35727af952869dd496b9b5b7f6a3" + "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab", + "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851", + "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265", + "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0", + "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a", + "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5", + "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6", + "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311", + "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada", + "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f", + "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8", + "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc", + "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73", + "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf", + "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e", + "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352", + "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c", + "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c", + "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c", + "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda", + "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d", + "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0", + "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3", + "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d", + "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038", + "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c", + "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8", + "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa", + "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09", + "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b", + "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c", + "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a", + "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52", + "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3", + "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146", + "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a", + "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f", + "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4", + "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c", + "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75", + "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040", + "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063", + "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050", + "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7", + "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222", + "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912", + "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801", + "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d", + "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06", + "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8", + "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2" ], "markers": "python_version >= '3.7'", - "version": "==7.0.5" + "version": "==7.1.0" }, "cryptography": { "hashes": [ - "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b", - "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f", - "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190", - "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f", - "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f", - "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb", - "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c", - "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773", - "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72", - "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8", - "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717", - "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9", - "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856", - "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96", - "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288", - "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39", - "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e", - "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce", - "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1", - "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de", - "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df", - "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf", - "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458" + "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4", + "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f", + "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885", + "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502", + "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41", + "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965", + "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e", + "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc", + "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad", + "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505", + "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388", + "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6", + "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2", + "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef", + "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac", + "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695", + "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6", + "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336", + "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0", + "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c", + "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106", + "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a", + "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8" ], "markers": "python_version >= '3.6'", - "version": "==39.0.0" + "version": "==39.0.1" }, "exceptiongroup": { "hashes": [ @@ -758,11 +758,11 @@ }, "moto": { "hashes": [ - "sha256:12f231196ebf22d19774f2a75738fdedae10a8c82abb8fa0877e1819aa799f4f", - "sha256:e65a692df57abb631b06c8f3f7827c9deceae3416887527e266c775ad722a2fa" + "sha256:c8200ccaa9440c2e9daa0bd5e0bd768a719db5a2c82ea8d782f0e3fa09a3c5e2", + "sha256:dcd1d06662982cf3c94f36d6348251ccdcf62a1c5de5650425cb4e6f260ae7a0" ], "index": "pypi", - "version": "==4.1.0" + "version": "==4.1.3" }, "packaging": { "hashes": [ @@ -840,7 +840,7 @@ "sha256:acb739f89fabb3d798c099e9e0c035003062367a441910aaaf2281bc1972ee14", "sha256:fcc653f65fe3035b478820b5284fbf0f52803622ee3f60a2faed7a7d3ba1f41e" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==2.0.4" }, "python-dateutil": { @@ -901,10 +901,10 @@ }, "types-toml": { "hashes": [ - "sha256:171bdb3163d79a520560f24ba916a9fc9bff81659c5448a9fea89240923722be", - "sha256:b7b5c4977f96ab7b5ac06d8a6590d17c0bf252a96efc03b109c2711fb3e0eafd" + "sha256:2432017febe43174af0f3c65f03116e3d3cf43e7e1406b8200e106da8cf98992", + "sha256:bf80fce7d2d74be91148f47b88d9ae5adeb1024abef22aa2fdbabc036d6b8b3c" ], - "version": "==0.10.8.1" + "version": "==0.10.8.5" }, "urllib3": { "hashes": [ @@ -916,11 +916,11 @@ }, "werkzeug": { "hashes": [ - "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f", - "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5" + "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe", + "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612" ], "markers": "python_version >= '3.7'", - "version": "==2.2.2" + "version": "==2.2.3" }, "xmltodict": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index bb85058b..f3e6b234 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -43,19 +43,19 @@ }, "boto3": { "hashes": [ - "sha256:0b1f82d4565ed875c7975ac0be5665e8d948613c01bcb0e49df6d4f5af670cc8", - "sha256:319ddb274f8f83b035b88a3b127c465bf6fe3e3fc2d668869b489e992c47ca77" + "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", + "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" ], "index": "pypi", - "version": "==1.26.52" + "version": "==1.26.76" }, "botocore": { "hashes": [ - "sha256:a0b89a33305cfa6251c6e1142deb7567e216e37e25363159f45fb81dc5b474e5", - "sha256:de55b6333fb13c66da9055972d7e4efff5dcc5a087478a2b70e99d888b29a24c" + "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", + "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" ], "markers": "python_version >= '3.7'", - "version": "==1.29.52" + "version": "==1.29.76" }, "cffi": { "hashes": [ @@ -128,32 +128,32 @@ }, "cryptography": { "hashes": [ - "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b", - "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f", - "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190", - "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f", - "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f", - "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb", - "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c", - "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773", - "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72", - "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8", - "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717", - "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9", - "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856", - "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96", - "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288", - "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39", - "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e", - "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce", - "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1", - "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de", - "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df", - "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf", - "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458" + "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4", + "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f", + "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885", + "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502", + "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41", + "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965", + "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e", + "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc", + "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad", + "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505", + "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388", + "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6", + "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2", + "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef", + "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac", + "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695", + "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6", + "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336", + "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0", + "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c", + "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106", + "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a", + "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8" ], "index": "pypi", - "version": "==39.0.0" + "version": "==39.0.1" }, "jmespath": { "hashes": [ From b155e7cec45c67cd33446cfd07a0cb5849715934 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 23 Mar 2023 21:14:34 +0900 Subject: [PATCH 002/962] =?UTF-8?q?pipenv=20update=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E3=82=92=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check-view-security-option/Pipfile.lock | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index f3e6b234..91874a55 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -43,19 +43,19 @@ }, "boto3": { "hashes": [ - "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", - "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" + "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5", + "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046" ], "index": "pypi", - "version": "==1.26.76" + "version": "==1.26.97" }, "botocore": { "hashes": [ - "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", - "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" + "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", + "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" ], "markers": "python_version >= '3.7'", - "version": "==1.29.76" + "version": "==1.29.97" }, "cffi": { "hashes": [ @@ -128,32 +128,32 @@ }, "cryptography": { "hashes": [ - "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4", - "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f", - "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885", - "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502", - "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41", - "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965", - "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e", - "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc", - "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad", - "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505", - "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388", - "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6", - "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2", - "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef", - "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac", - "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695", - "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6", - "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336", - "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0", - "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c", - "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106", - "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a", - "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8" + "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" ], "index": "pypi", - "version": "==39.0.1" + "version": "==39.0.2" }, "jmespath": { "hashes": [ @@ -255,21 +255,21 @@ }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "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.14" + "version": "==1.26.15" } }, "develop": { "autopep8": { "hashes": [ - "sha256:be5bc98c33515b67475420b7b1feafc8d32c1a69862498eda4983b45bffd2687", - "sha256:d27a8929d8dcd21c0f4b3859d2d07c6c25273727b98afc984c039df0f0d86566" + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" ], "index": "pypi", - "version": "==2.0.1" + "version": "==2.0.2" }, "flake8": { "hashes": [ From 2ab184823778de7dc6fb4939caf093f5a3e37cbc Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 23 Mar 2023 21:28:21 +0900 Subject: [PATCH 003/962] =?UTF-8?q?CRM=E3=83=87=E3=83=BC=E3=82=BF=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E6=A9=9F=E8=83=BD=E3=81=AEpipenv=20update=E7=B5=90?= =?UTF-8?q?=E6=9E=9C=E3=82=82=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 634 +++++++++++++++++---------------- 1 file changed, 327 insertions(+), 307 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index c014034a..4ca22ac8 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,19 +26,19 @@ }, "boto3": { "hashes": [ - "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", - "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" + "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5", + "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046" ], "index": "pypi", - "version": "==1.26.76" + "version": "==1.26.97" }, "botocore": { "hashes": [ - "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", - "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" + "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", + "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" ], "markers": "python_version >= '3.7'", - "version": "==1.29.76" + "version": "==1.29.97" }, "certifi": { "hashes": [ @@ -50,97 +50,84 @@ }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" + "sha256: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_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.1.0" }, "idna": { "hashes": [ @@ -250,11 +237,11 @@ }, "platformdirs": { "hashes": [ - "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9", - "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567" + "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa", + "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8" ], "markers": "python_version >= '3.7'", - "version": "==3.0.0" + "version": "==3.1.1" }, "pyjwt": { "hashes": [ @@ -328,19 +315,19 @@ }, "tenacity": { "hashes": [ - "sha256:c7bb4b86425b977726a7b49971542d4f67baf72096597d283f3ffd01f33b92df", - "sha256:dd1b769ca7002fda992322939feca5bee4fa11f39146b0af14e0b8d9f27ea854" + "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", + "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" ], "index": "pypi", - "version": "==8.2.1" + "version": "==8.2.2" }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "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.14" + "version": "==1.26.15" }, "zeep": { "hashes": [ @@ -362,27 +349,27 @@ }, "autopep8": { "hashes": [ - "sha256:be5bc98c33515b67475420b7b1feafc8d32c1a69862498eda4983b45bffd2687", - "sha256:d27a8929d8dcd21c0f4b3859d2d07c6c25273727b98afc984c039df0f0d86566" + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" ], "index": "pypi", - "version": "==2.0.1" + "version": "==2.0.2" }, "boto3": { "hashes": [ - "sha256:30c7d967ed1c6b5a05643e42cae9d4d36c3f1cb6782637ddc7007a104cfd9027", - "sha256:b4c2969b7677762914394b8273cc1905dfe5b71f250741c1a575487ae357e729" + "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5", + "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046" ], "index": "pypi", - "version": "==1.26.76" + "version": "==1.26.97" }, "botocore": { "hashes": [ - "sha256:70735b00cd529f152992231ca6757e458e5ec25db43767b3526e9a35b2f143b7", - "sha256:c2f67b6b3f8acf2968eafca06526f07b9fb0d27bac4c68a635d51abb675134a7" + "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", + "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" ], "markers": "python_version >= '3.7'", - "version": "==1.29.76" + "version": "==1.29.97" }, "certifi": { "hashes": [ @@ -463,194 +450,189 @@ }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" + "sha256: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_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.1.0" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab", - "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851", - "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265", - "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0", - "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a", - "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5", - "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6", - "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311", - "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada", - "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f", - "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8", - "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc", - "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73", - "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf", - "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e", - "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352", - "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c", - "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c", - "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c", - "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda", - "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d", - "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0", - "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3", - "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d", - "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038", - "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c", - "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8", - "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa", - "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09", - "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b", - "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c", - "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a", - "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52", - "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3", - "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146", - "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a", - "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f", - "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4", - "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c", - "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75", - "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040", - "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063", - "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050", - "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7", - "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222", - "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912", - "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801", - "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d", - "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06", - "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8", - "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2" + "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" ], "markers": "python_version >= '3.7'", - "version": "==7.1.0" + "version": "==7.2.2" }, "cryptography": { "hashes": [ - "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4", - "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f", - "sha256:4789d1e3e257965e960232345002262ede4d094d1a19f4d3b52e48d4d8f3b885", - "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502", - "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41", - "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965", - "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e", - "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc", - "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad", - "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505", - "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388", - "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6", - "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2", - "sha256:c5caeb8188c24888c90b5108a441c106f7faa4c4c075a2bcae438c6e8ca73cef", - "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac", - "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695", - "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6", - "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336", - "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0", - "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c", - "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106", - "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a", - "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8" + "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" ], "markers": "python_version >= '3.6'", - "version": "==39.0.1" + "version": "==39.0.2" }, "exceptiongroup": { "hashes": [ - "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e", - "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23" + "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", + "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" ], "markers": "python_version < '3.11'", - "version": "==1.1.0" + "version": "==1.1.1" }, "flake8": { "hashes": [ @@ -758,11 +740,11 @@ }, "moto": { "hashes": [ - "sha256:c8200ccaa9440c2e9daa0bd5e0bd768a719db5a2c82ea8d782f0e3fa09a3c5e2", - "sha256:dcd1d06662982cf3c94f36d6348251ccdcf62a1c5de5650425cb4e6f260ae7a0" + "sha256:363577f7a0cdf639852420f6ba5caa9aa3c90a688feae6315f8ee4bf324b8c27", + "sha256:63542b7b9f307b00fae460b42d15cf9346de3ad3b1287fba38fc68f3c05e4da4" ], "index": "pypi", - "version": "==4.1.3" + "version": "==4.1.5" }, "packaging": { "hashes": [ @@ -813,11 +795,11 @@ }, "pytest": { "hashes": [ - "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5", - "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42" + "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", + "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" ], "index": "pypi", - "version": "==7.2.1" + "version": "==7.2.2" }, "pytest-cov": { "hashes": [ @@ -851,6 +833,52 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, + "pyyaml": { + "hashes": [ + "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0" + }, "requests": { "hashes": [ "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", @@ -861,11 +889,11 @@ }, "responses": { "hashes": [ - "sha256:396acb2a13d25297789a5866b4881cf4e46ffd49cc26c43ab1117f40b973102e", - "sha256:dcf294d204d14c436fddcc74caefdbc5764795a40ff4e6a7740ed8ddbf3294be" + "sha256:8a3a5915713483bf353b6f4079ba8b2a29029d1d1090a503c70b0dc5d9d0c7bd", + "sha256:c4d9aa9fc888188f0c673eff79a8dadbe2e75b7fe879dc80a221a06e0a68138f" ], "markers": "python_version >= '3.7'", - "version": "==0.22.0" + "version": "==0.23.1" }, "s3transfer": { "hashes": [ @@ -883,14 +911,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", @@ -899,20 +919,20 @@ "markers": "python_version < '3.11'", "version": "==2.0.1" }, - "types-toml": { + "types-pyyaml": { "hashes": [ - "sha256:2432017febe43174af0f3c65f03116e3d3cf43e7e1406b8200e106da8cf98992", - "sha256:bf80fce7d2d74be91148f47b88d9ae5adeb1024abef22aa2fdbabc036d6b8b3c" + "sha256:19304869a89d49af00be681e7b267414df213f4eb89634c4495fa62e8f942b9f", + "sha256:5314a4b2580999b2ea06b2e5f9a7763d860d6e09cdf21c0e9561daa9cbd60178" ], - "version": "==0.10.8.5" + "version": "==6.0.12.8" }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "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.14" + "version": "==1.26.15" }, "werkzeug": { "hashes": [ From 3620211434aef76acc1630b0dd4572cf8495035a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 27 Mar 2023 16:17:54 +0900 Subject: [PATCH 004/962] =?UTF-8?q?feat:=20CRM=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AB=E3=80=81Suggestion=E9=96=A2?= =?UTF-8?q?=E9=80=A3=E3=81=AE=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 227 ++++++++++++++++++ 1 file changed, 227 insertions(+) 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..9667e48e 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3002,6 +3002,233 @@ ], "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", + "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", + "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" + ], + "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" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true } ] } \ No newline at end of file From d75c2cae84faed91a2df381561f67002a356c42f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 27 Mar 2023 16:39:38 +0900 Subject: [PATCH 005/962] =?UTF-8?q?feat:=20=E6=9C=80=E7=B5=82=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E6=97=A5=E6=99=82=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=82=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/last_fetch_datetime/Event.json | 4 ++++ .../crm/last_fetch_datetime/Suggestion_Feedback_vod__c.json | 4 ++++ s3/config/crm/last_fetch_datetime/Suggestion_Tag_vod__c.json | 4 ++++ s3/config/crm/last_fetch_datetime/Suggestion_vod__c.json | 4 ++++ s3/config/crm/last_fetch_datetime/Task.json | 4 ++++ 5 files changed, 20 insertions(+) create mode 100644 s3/config/crm/last_fetch_datetime/Event.json create mode 100644 s3/config/crm/last_fetch_datetime/Suggestion_Feedback_vod__c.json create mode 100644 s3/config/crm/last_fetch_datetime/Suggestion_Tag_vod__c.json create mode 100644 s3/config/crm/last_fetch_datetime/Suggestion_vod__c.json create mode 100644 s3/config/crm/last_fetch_datetime/Task.json 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 From 68523938f4c1ce2f99f08421453fbe6b1dbc0752 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 27 Mar 2023 18:07:35 +0900 Subject: [PATCH 006/962] =?UTF-8?q?feat:=20=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E3=81=AB=E5=88=A9=E7=94=A8=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF=E8=A8=AD=E5=AE=9A=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Event.txt | 13 +++++++++++++ .../crm/settings/CRM_Suggestion_Feedback_vod__c.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_Suggestion_Tag_vod__c.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_Suggestion_vod__c.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_Task.txt | 13 +++++++++++++ s3/data/crm/settings/configmap.config | 5 +++++ 6 files changed, 70 insertions(+) create mode 100644 s3/data/crm/settings/CRM_Event.txt create mode 100644 s3/data/crm/settings/CRM_Suggestion_Feedback_vod__c.txt create mode 100644 s3/data/crm/settings/CRM_Suggestion_Tag_vod__c.txt create mode 100644 s3/data/crm/settings/CRM_Suggestion_vod__c.txt create mode 100644 s3/data/crm/settings/CRM_Task.txt diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt new file mode 100644 index 00000000..2400c584 --- /dev/null +++ b/s3/data/crm/settings/CRM_Event.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +58 +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 +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 +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..0b819bda --- /dev/null +++ b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +44 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,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,MSJ_Reason_unformatted__c,MSJ_Data_Id__c,MSJ_reason_id__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,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,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_Task.txt b/s3/data/crm/settings/CRM_Task.txt new file mode 100644 index 00000000..6070f54e --- /dev/null +++ b/s3/data/crm/settings/CRM_Task.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +49 +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 +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 +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 From 314342af6f9dff9c32746d1db4e9189cc295d46a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 14:14:38 +0900 Subject: [PATCH 007/962] =?UTF-8?q?feat:=20=E6=97=A5=E6=AC=A1=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=81=AE=E8=A9=A6=E4=BD=9C=E5=93=81=E3=82=92?= =?UTF-8?q?=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.dockerignore | 12 + ecs/jskult-batch-daily/.env.example | 6 + ecs/jskult-batch-daily/.gitignore | 4 + ecs/jskult-batch-daily/.vscode/launch.json | 16 + .../.vscode/recommended_settings.json | 18 ++ ecs/jskult-batch-daily/Dockerfile | 20 ++ ecs/jskult-batch-daily/Pipfile | 21 ++ ecs/jskult-batch-daily/Pipfile.lock | 278 ++++++++++++++++++ ecs/jskult-batch-daily/entrypoint.py | 10 + ecs/jskult-batch-daily/src/__init__.py | 0 .../src/batch/batch_functions.py | 56 ++++ .../src/batch/datachange/__init__.py | 0 .../src/batch/datachange/emp_chg_inst_lau.py | 210 +++++++++++++ .../src/batch/jissekiaraigae.py | 11 + ecs/jskult-batch-daily/src/db/__init__.py | 0 ecs/jskult-batch-daily/src/db/database.py | 150 ++++++++++ ecs/jskult-batch-daily/src/error/__init__.py | 0 .../src/error/exceptions.py | 14 + ecs/jskult-batch-daily/src/jobctrl_daily.py | 117 ++++++++ .../src/logging/get_logger.py | 29 ++ .../src/system_var/__init__.py | 0 .../src/system_var/environment.py | 13 + .../src/time/elapsed_time.py | 22 ++ 23 files changed, 1007 insertions(+) create mode 100644 ecs/jskult-batch-daily/.dockerignore create mode 100644 ecs/jskult-batch-daily/.env.example create mode 100644 ecs/jskult-batch-daily/.gitignore create mode 100644 ecs/jskult-batch-daily/.vscode/launch.json create mode 100644 ecs/jskult-batch-daily/.vscode/recommended_settings.json create mode 100644 ecs/jskult-batch-daily/Dockerfile create mode 100644 ecs/jskult-batch-daily/Pipfile create mode 100644 ecs/jskult-batch-daily/Pipfile.lock create mode 100644 ecs/jskult-batch-daily/entrypoint.py create mode 100644 ecs/jskult-batch-daily/src/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/batch_functions.py create mode 100644 ecs/jskult-batch-daily/src/batch/datachange/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py create mode 100644 ecs/jskult-batch-daily/src/batch/jissekiaraigae.py create mode 100644 ecs/jskult-batch-daily/src/db/__init__.py create mode 100644 ecs/jskult-batch-daily/src/db/database.py create mode 100644 ecs/jskult-batch-daily/src/error/__init__.py create mode 100644 ecs/jskult-batch-daily/src/error/exceptions.py create mode 100644 ecs/jskult-batch-daily/src/jobctrl_daily.py create mode 100644 ecs/jskult-batch-daily/src/logging/get_logger.py create mode 100644 ecs/jskult-batch-daily/src/system_var/__init__.py create mode 100644 ecs/jskult-batch-daily/src/system_var/environment.py create mode 100644 ecs/jskult-batch-daily/src/time/elapsed_time.py diff --git a/ecs/jskult-batch-daily/.dockerignore b/ecs/jskult-batch-daily/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-batch-daily/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example new file mode 100644 index 00000000..d1f4ddf4 --- /dev/null +++ b/ecs/jskult-batch-daily/.env.example @@ -0,0 +1,6 @@ +DB_HOST=************ +DB_PORT=************ +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 +LOG_LEVEL=INFO \ No newline at end of file diff --git a/ecs/jskult-batch-daily/.gitignore b/ecs/jskult-batch-daily/.gitignore new file mode 100644 index 00000000..705f2b57 --- /dev/null +++ b/ecs/jskult-batch-daily/.gitignore @@ -0,0 +1,4 @@ +__pycache__ + +.vscode/settings.json +.env diff --git a/ecs/jskult-batch-daily/.vscode/launch.json b/ecs/jskult-batch-daily/.vscode/launch.json new file mode 100644 index 00000000..2df4d8bf --- /dev/null +++ b/ecs/jskult-batch-daily/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Batch Sample", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json new file mode 100644 index 00000000..d5ce3e07 --- /dev/null +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -0,0 +1,18 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": ["--max-line-length=120"], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Args": ["--max-line-length", "120"] +} diff --git a/ecs/jskult-batch-daily/Dockerfile b/ecs/jskult-batch-daily/Dockerfile new file mode 100644 index 00000000..dd891d48 --- /dev/null +++ b/ecs/jskult-batch-daily/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile new file mode 100644 index 00000000..629e8690 --- /dev/null +++ b/ecs/jskult-batch-daily/Pipfile @@ -0,0 +1,21 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +boto3 = "*" +PyMySQL = "*" +sqlalchemy = "*" +tenacity = "*" +prettytable = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock new file mode 100644 index 00000000..fd935cf0 --- /dev/null +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -0,0 +1,278 @@ +{ + "_meta": { + "hash": { + "sha256": "38a488e60226a959c48dea23146954688e68eee8280a868998a2f659c2a46217" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "boto3": { + "hashes": [ + "sha256:7017102c58b9984749bef3b9f476940593c311504354b9ee9dd7bb0b4657a77d", + "sha256:f961aa704bd7aeefc186ede52cabc3ef4c336979bb4098d3aad7ca922d55fc27" + ], + "index": "pypi", + "version": "==1.26.96" + }, + "botocore": { + "hashes": [ + "sha256:b9781108810e33f8406942c3e3aab748650c59d5cddb7c9d323f4e2682e7b0b6", + "sha256:c449d7050e9bc4a8b8a62ae492cbdc931b786bf5752b792867f1276967fadaed" + ], + "markers": "python_version >= '3.7'", + "version": "==1.29.96" + }, + "greenlet": { + "hashes": [ + "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a", + "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a", + "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43", + "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33", + "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8", + "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088", + "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca", + "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343", + "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645", + "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db", + "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df", + "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3", + "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86", + "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2", + "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a", + "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf", + "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7", + "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394", + "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40", + "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3", + "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6", + "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74", + "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0", + "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3", + "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91", + "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5", + "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9", + "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8", + "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b", + "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6", + "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb", + "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73", + "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", + "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df", + "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9", + "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f", + "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0", + "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857", + "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a", + "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249", + "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30", + "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292", + "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b", + "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d", + "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b", + "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c", + "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca", + "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7", + "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75", + "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae", + "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b", + "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470", + "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564", + "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9", + "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099", + "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0", + "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5", + "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19", + "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1", + "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==2.0.2" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "prettytable": { + "hashes": [ + "sha256:2e0026af955b4ea67b22122f310b90eae890738c08cb0458693a49b6221530ac", + "sha256:3b767129491767a3a5108e6f305cbaa650f8020a7db5dfe994a2df7ef7bad0fe" + ], + "index": "pypi", + "version": "==3.6.0" + }, + "pymysql": { + "hashes": [ + "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641", + "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" + ], + "index": "pypi", + "version": "==1.0.2" + }, + "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" + }, + "s3transfer": { + "hashes": [ + "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd", + "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:013f4f330001e84a2b0ef1f2c9bd73169c79d582e54e1a144be1be1dbc911711", + "sha256:0789e199fbce8cb1775337afc631ed12bcc5463dd77d7a06b8dafd758cde51f8", + "sha256:0b698440c477c00bdedff87348b19a79630a235864a8f4378098d61079c16ce9", + "sha256:0eac488be90dd3f7a655d2e34fa59e1305fccabc4abfbd002e3a72ae10bd2f89", + "sha256:14854bdb2a35af536d14f77dfa8dbc20e1bb1972996d64c4147e0d3165c9aaf5", + "sha256:18795e87601b4244fd08b542cd6bff9ef674b17bcd34e4a3c9935398e2cc762c", + "sha256:32f508fef9c5a7d19411d94ef64cf5405e42c4689e51ddbb81ac9a7be045cce8", + "sha256:33f73cc45ffa050f5c3b60ff4490e0ae9e02701461c1600d5ede1b008076b1b9", + "sha256:38e26cf6b9b4c6c37846f7e31b42e4d664b35f055691265f07e06aeb6167c494", + "sha256:3da3dff8d9833a7d7f66a3c45a79a3955f775c79f47bb7eea266d0b4c267b17a", + "sha256:432cfd77642771ee7ea0dd0f3fb664f18506a3625eab6e6d5d1d771569171270", + "sha256:4339110be209fea37a2bb4f35f1127c7562a0393e9e6df5d9a65cc4f5c167cb6", + "sha256:486015a58c9a67f65a15b4f19468b35b97cee074ae55386a9c240f1da308fbfe", + "sha256:494db0026918e3f707466a1200a5dedbf254a4bce01a3115fd95f04ba8258f09", + "sha256:57b80e877eb6ec63295835f8a3b86ca3a44829f80c4748e1b019e03adea550fc", + "sha256:5f7c40ec2e3b31293184020daba95850832bea523a08496ac89b27a5276ec804", + "sha256:6d44ff7573016fc26311b5a5c54d5656fb9e0c39e138bc8b81cb7c8667485203", + "sha256:774965c41b71c8ebe3c5728bf5b9a948231fc3a0422d9fdace0686f5bb689ad6", + "sha256:7917632606fc5d4be661dcde45cc415df835e594e2c50cc999a44f24b6bf6d92", + "sha256:9020125e3be677c64d4dda7048e247343f1663089cf268a4cc98c957adb7dbe0", + "sha256:921485d1f69ed016e1f756de67d02ad4f143eb6b92b9776bfff78786d8978ab5", + "sha256:94556a2a7fc3de094ea056b62845e2e6e271e26d1e1b2540a1cd2d2506257a10", + "sha256:a4c1e1582492c66dfacc9eab52738f3e64d9a2a380e412668f75aa06e540f649", + "sha256:a65a8fd09bdffd63fa23b39cd902e6a4ca23d86ecfe129513e43767a1f3e91fb", + "sha256:a6f7d1debb233f1567d700ebcdde0781a0b63db0ef266246dfbf75ae41bfdf85", + "sha256:b0995b92612979d208189245bf87349ad9243b97b49652347a28ddee0803225a", + "sha256:b8ab8f90f4a13c979e6c41c9f011b655c1b9ae2df6cffa8fa2c7c4d740f3512e", + "sha256:bc370d53fee7408330099c4bcc2573a107757b203bc61f114467dfe586a0c7bd", + "sha256:c38641f5c3714505d65dbbd8fb1350408b9ad8461769ec8e440e1177f9c92d1d", + "sha256:cc337b96ec59ef29907eeadc2ac11188739281568f14c719e61550ca6d201a41", + "sha256:ce076e25f1170000b4ecdc57a1ff8a70dbe4a5648ec3da0563ef3064e8db4f15", + "sha256:cebd161f964af58290596523c65e41a5a161a99f7212b1ae675e288a4b5e0a7c", + "sha256:d2e7411d5ea164c6f4d003f5d4f5e72e202956aaa7496b95bb4a4c39669e001c", + "sha256:e735a635126b2338dfd3a0863b675437cb53d85885a7602b8cffb24345df33ed", + "sha256:e7e61e2e4dfe175dc3510889e44eda1c32f55870d6950ef40519640cb266704d", + "sha256:e90f0be674e0845c5c1ccfa5e31c9ee28fd406546a61afc734355cc7ea1f8f8b", + "sha256:ea1c63e61b5c13161c8468305f0a5837c80aae2070e33654c68dd12572b638eb", + "sha256:ea9461f6955f3cf9eff6eeec271686caed7792c76f5b966886a36a42ea46e6b2", + "sha256:f15c54713a8dd57a01c974c9f96476688f6f6374d348819ed7e459535844b614", + "sha256:fb649c5473f79c9a7b6133f53a31f4d87de14755c79224007eb7ec76e628551e", + "sha256:fc67667c8e8c04e5c3250ab2cd51df40bc7c28c7c253d0475b377eff86fe4bb0" + ], + "index": "pypi", + "version": "==2.0.7" + }, + "tenacity": { + "hashes": [ + "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", + "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" + ], + "index": "pypi", + "version": "==8.2.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", + "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" + ], + "markers": "python_version >= '3.7'", + "version": "==4.5.0" + }, + "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" + }, + "wcwidth": { + "hashes": [ + "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", + "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" + ], + "version": "==0.2.6" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-batch-daily/entrypoint.py b/ecs/jskult-batch-daily/entrypoint.py new file mode 100644 index 00000000..43a997dc --- /dev/null +++ b/ecs/jskult-batch-daily/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチのエントリーポイント""" +from src.jobctrl_daily import batch_process + +if __name__ == '__main__': + try: + exit(batch_process()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-batch-daily/src/__init__.py b/ecs/jskult-batch-daily/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py new file mode 100644 index 00000000..b6b06458 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -0,0 +1,56 @@ +"""バッチ処理の共通関数""" + +import textwrap +from datetime import datetime + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException + + +def get_syor_date() -> str: + """DBから処理日を取得します + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + str: hdke_tbl.syor_date + """ + db = Database.get_instance() + db.connect() + sql = 'SELECT syor_date FROM src05.hdke_tbl' + try: + syor_date_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + db.disconnect() + if len(syor_date_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + # 必ず一件取れる + syor_date_record = syor_date_result[0] + syor_date_str = syor_date_record['syor_date'] + return syor_date_str + + +def get_syor_date_as_date_format() -> str: + """DBから処理日を取得し、yyyy/mm/ddのフォーマットにして返します + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + str: hdke_tbl.syor_dateをyyyy/mm/ddにフォーマットした文字列 + """ + syor_date_str = get_syor_date() + syor_date = datetime.strptime(syor_date_str, '%Y%m%d') + return syor_date.strftime('%Y/%m/%d') + + +def logging_sql(logger, sql): + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}') \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/batch/datachange/__init__.py b/ecs/jskult-batch-daily/src/batch/datachange/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py new file mode 100644 index 00000000..db3c72da --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py @@ -0,0 +1,210 @@ +from prettytable import PrettyTable + +from src.batch.batch_functions import get_syor_date_as_date_format, logging_sql +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('48-施設担当者マスタ洗替') + +def batch_process(): + db = Database.get_instance() + db.connect() + logger.info('##########################') + logger.info('START Changing Employee in charge of institution PGM.') + # 日付テーブルを取得 + syor_date = get_syor_date_as_date_format(db) + # `emp_chg_inst_lau`をTruncate + truncate_emp_chg_inst_lau(db) + # emp_chg_inst から、`emp_chg_inst_lau`へInsert + insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) + # vop_hco_merge_vから、emp_chg_inst_lauをUpdate + update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) + # dcf_inst_mergeから、emp_chg_inst_lauをUpdate + update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) + db.disconnect() + logger.info('##########################') + logger.info('End All Processing PGM.') + + +def truncate_emp_chg_inst_lau(db: Database): + logger.info("##########################") + try: + db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") + except Exception as e: + logger.info("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") + raise BatchOperationException(e) + + logger.info("Table `emp_chg_inst_lau` was truncated!") + return + +def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): + logger.info("##########################") + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.emp_chg_inst_lau + SELECT + inst_cd, + ta_cd,emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date, + NULL -- lua_ope_dt + FROM + src05.emp_chg_inst + WHERE + enabled_flg = 'Y' + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.info("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") + raise BatchOperationException(e) + logger.info("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") + + return + +def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): + # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする + logger.info("##########################") + try: + select_result = db.execute_select( + """ + SELECT + COUNT(v_inst_cd) AS row_count + FROM + src05.vop_hco_merge_v + WHERE + STR_TO_DATE(apply_dt, '%Y-%m-%d') <= :syor_date + """, + {'syor_date': syor_date} + ) + except Exception as e: + logger.info("Error! `vop_hco_merge_v` Table count error!") + raise BatchOperationException(e) + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('vop_hco_merge_v Table Data is not exists!') + return + + logger.info('vop_hco_merge_v Table Data is exists!') + # vop_hco_merge_v から、emp_chg_inst_lauをUpdateします + result = db.execute_select( + """ + SELECT + v_inst_cd, + v_inst_cd_merg + FROM + src05.vop_hco_merge_v + WHERE + STR_TO_DATE(apply_dt, '%Y-%m-%d') <= :syor_date + ORDER BY + STR_TO_DATE(apply_dt, '%Y-%m-%d') ASC + """, + {'syor_date': syor_date} + ) + for row in result: + v_inst_cd = row['v_inst_cd'] + v_inst_cd_merge = row['v_inst_cd_merg'] + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + emp_chg_inst_lau + SET + inst_cd = :v_inst_merge, + lua_ope_dt = SYSDATE() + WHERE + inst_cd = :v_inst_cd; + """ + update_result = db.execute( + update_sql, + {'v_inst_cd': v_inst_cd, 'v_inst_cd_merg': v_inst_cd_merge} + ) + logging_sql(logger, update_sql) + logger.info(f'Query OK, {update_result.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.info(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") + raise BatchOperationException(e) + logger.info(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") + return + + +def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): + # dcf_inst_mergeから、emp_chg_inst_lauをUpdate + # Get count from DCF_INST_MERGE + logger.info("##########################") + try: + select_result = db.execute_select( + """ + SELECT + COUNT(dcf_inst_cd) AS row_count + FROM + src05.dcf_inst_merge + WHERE + muko_flg = '0' + AND dcf_inst_cd_new IS NOT NULL + AND enabled_flg = 'Y' + AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date -- TODO: tekiyo_monthはいっぴにする + """, + {'syor_date': syor_date} + ) + except Exception as e: + logger.info("Error! Getting Count of dcf_inst_merge was failed!") + raise BatchOperationException(e) + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('dcf_inst_merge Table Data is not exists!') + return + + logger.info('dcf_inst_merge Table Data is exists!') + # dcf_inst_mergeから、emp_chg_inst_lauをUpdate + logger.info("##########################") + logger.info("#### UPDATE DATA #########") + logger.info("##########################") + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.emp_chg_inst_lau el, + ( + SELECT + dcf_inst_cd, + dcf_inst_cd_new + FROM + src05.dcf_inst_merge + WHERE + muko_flg = '0' + AND dcf_inst_cd_new IS NOT NULL + AND enabled_flg = 'Y' + AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date + ) dm + SET + el.inst_cd = dm.dcf_inst_cd_new, + el.lua_ope_dt = SYSDATE() + WHERE + el.inst_cd = dm.dcf_inst_cd + """ + res = db.execute( + update_sql, + {'syor_date': syor_date} + ) + logging_sql(logger, update_sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.info("emp_chg_inst_lau.v_inst_cd could not set!") + raise BatchOperationException(e) + + logger.info("emp_chg_inst_lau.v_inst_cd was set!") + + return diff --git a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py b/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py new file mode 100644 index 00000000..7f5d9fcf --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py @@ -0,0 +1,11 @@ +from src.batch.datachange import emp_chg_inst_lau +from src.logging.get_logger import get_logger + +logger = get_logger('実績洗替') + + +def batch_process(): + """実績洗替処理""" + logger.info('Start Jisseki Araigae Batch PGM.') + # 施設担当者洗替 + emp_chg_inst_lau.batch_process() diff --git a/ecs/jskult-batch-daily/src/db/__init__.py b/ecs/jskult-batch-daily/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py new file mode 100644 index 00000000..7e8f845c --- /dev/null +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -0,0 +1,150 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.create import create_engine +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string:str = None + + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool, + isolation_level="AUTOCOMMIT" + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + self.__connection = self.__engine.connect() + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + try: + result = self.__connection.execute(text(select_query), parameters=parameters) + except Exception as e: + raise DBException(e) + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + raise DBException(e) + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None diff --git a/ecs/jskult-batch-daily/src/error/__init__.py b/ecs/jskult-batch-daily/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/error/exceptions.py b/ecs/jskult-batch-daily/src/error/exceptions.py new file mode 100644 index 00000000..612060c5 --- /dev/null +++ b/ecs/jskult-batch-daily/src/error/exceptions.py @@ -0,0 +1,14 @@ +from tenacity import RetryError + + +class MeDaCaException(Exception): + pass + +class DBException(MeDaCaException): + pass + +class BatchOperationException(MeDaCaException): + pass + +class MaxRetryExceededException(MeDaCaException, RetryError): + pass \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py new file mode 100644 index 00000000..7b8cfd38 --- /dev/null +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -0,0 +1,117 @@ +from src.batch import jissekiaraigae +from src.batch.batch_functions import get_syor_date +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('日次処理コントロール') # ここを処理IDとかにするといいかもしれない + +def batch_process(): + try: + logger.info('日次ジョブ:開始') + # logger.info('S3マウント状況確認') + # logger.error('S3マウントエラー:DWH(異常終了)') + # logger.error('S3マウントエラー:BIO(異常終了)') + # logger.info('データベース接続') # 実際には、ここでつなげているわけではないので、いらないと思う + # logger.error('データベース接続エラー(異常終了)') # 検査例外を捕まえて、共通的に出せばいいと思う + try: + logger.info('処理日取得') + syor_date = get_syor_date() + except BatchOperationException as e: + logger.error(f'処理日取得エラー(異常終了){e}') + logger.info(f'処理日={syor_date}') + # 休日判定ファイルを読み込み + logger.info('休日判定処理') + if True: # 休日判定 + logger.info('非営業日かつ月、火、水以外です。') # 分岐 + try: + # 処理中フラグ判定。ここでdumpのフラグも見る + logger.info('処理フラグ更新中') + logger.info('処理フラグ更新終了') + except BatchOperationException as e: + logger.error(f'処理フラグ更新処理エラー(異常終了){e}') + logger.info('日次ジョブ:終了(正常終了)') + try: + logger.info('日次ジョブ処理中判定') + if True: # 処理中判定 + logger.error('処理フラグ処理中(異常終了)') + logger.info('処理中フラグの更新:起動') + logger.info('処理中フラグの更新:終了') + except BatchOperationException as e: + logger.error(f'日次ジョブ処理中エラー(異常終了){e}') + # ↓ここから、やらない↓ + # logger.info('処理前バックアップ実行') + # logger.info('処理前バックアップ:起動') + # logger.info('処理前バックアップ:終了') + # logger.error('処理前バックアップ処理エラー(異常終了)', $ex->getMessage()) + # ↑ここまで↑ + logger.info('卸在庫データ取込判定') + if True: # 卸在庫日判定 + logger.info('卸在庫データ取込日です') + logger.debug('卸在庫データファイル名: {_PATH_OROSHI_ZAIKO}') + if True: # 卸在庫ファイル存在確認なければ異常終了 + logger.error('卸在庫データ存在確認エラー(異常終了)') + logger.info('卸在庫データ存在確認:取込処理開始') + logger.debug('卸在庫データファイル名作成: {read_filename}') + logger.debug('ファイル移動OK:{_MOVE_OROSHI_ZAIKO}') # S3からダウンロード + logger.debug('ファイル解凍OK:{sprintf(_ZIP_OROSHI_ZAIKO, $read_filename)}') # gunzip -fなので、gzipを使う + logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') #S3にアップロード + try: + logger.info('卸在庫データ取込:起動') + logger.info('卸在庫データ取込:終了') + except BatchOperationException as e: + logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') + logger.info('日次処理(アルトマーク)') + if True: # アルトマークなければ + logger.info('日次処理(アルトマーク)実行対象日でない為未実行') + try: + logger.info('アルトマーク取込:起動') + logger.info('アルトマーク取込:終了') + except BatchOperationException as e: + logger.error(f'アルトマーク取込処理エラー(異常終了){e}') + if True: # 休日判定 + try: + logger.info('メルク施設マスタ作成') + logger.info('メルク施設マスタ作成終了') + except BatchOperationException as e: + logger.error(f'メルク施設マスタ作成エラー(異常終了){e}') + try: + logger.info('DCF施設統合マスタ作成') + logger.info('DCF施設統合マスタ作成終了') + except BatchOperationException as e: + logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') + # if False: # ($holiday === FALSE) とにかく毎日動かす + logger.info('V実消化連携データ存在確認') + if True: + logger.error('V実消化連携データ存在確認(異常終了)') + + logger.info('日次処理(V実消化)') + try: + logger.info('V実消化取込:起動') + logger.info('V実消化取込:終了') + except BatchOperationException as e: + logger.exception(f'V実消化取込処理エラー(異常終了){e}') + logger.info('日次処理(実績更新)') + try: + logger.info('実績更新:起動') + jissekiaraigae.batch_process() + logger.info('実績更新:終了') + except BatchOperationException as e: + logger.exception(f'実績更新処理エラー(異常終了){e}') + # ↓以下、ファイルのバックアップ以外はやらない↓ + # logger.info('処理後バックアップ実行') + # logger.info('処理後バックアップ:起動') + # logger.info('処理後バックアップ:終了') + # logger.error('処理後バックアップ処理エラー(異常終了)', $ex->getMessage()) + # ↑ここまでやらない↑ + logger.info('処理中フラグの更新:非処理中') + try: + logger.info('処理中フラグの更新:起動') + logger.info('処理中フラグの更新:終了') + except BatchOperationException as e: + logger.exception(f'処理中フラグ更新エラー(異常終了){e}') + logger.info('ワークディレクトリクリーニング') + logger.info('日次ジョブ:終了(正常終了)') + + return 0 + except Exception as e: + raise e diff --git a/ecs/jskult-batch-daily/src/logging/get_logger.py b/ecs/jskult-batch-daily/src/logging/get_logger.py new file mode 100644 index 00000000..868ab5ea --- /dev/null +++ b/ecs/jskult-batch-daily/src/logging/get_logger.py @@ -0,0 +1,29 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + +# 共通ロガー +def get_logger(log_name): + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-batch-daily/src/system_var/__init__.py b/ecs/jskult-batch-daily/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py new file mode 100644 index 00000000..143d2d26 --- /dev/null +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -0,0 +1,13 @@ +import os + +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +LOG_LEVEL = os.environ['LOG_LEVEL'] +DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) +DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) diff --git a/ecs/jskult-batch-daily/src/time/elapsed_time.py b/ecs/jskult-batch-daily/src/time/elapsed_time.py new file mode 100644 index 00000000..c1432e91 --- /dev/null +++ b/ecs/jskult-batch-daily/src/time/elapsed_time.py @@ -0,0 +1,22 @@ +import time + + +class ElapsedTime: + """処理実行時間計測クラス""" + def __init__(self) -> None: + """このクラスの新たなインスタンスを初期化します。""" + self.__start = time.perf_counter() + + @property + def of(self): + """インスタンス化してからの経過時間をhh:mm:ssの形式にフォーマットして返す + Returns: + str: 時分秒形式の経過時間 + """ + elapsed_time = time.perf_counter() - self.__start + h, rem = divmod(elapsed_time, 3600) + m, s = divmod(rem, 60) + h_str = f'{h:02.0f} hour ' if h > 0.0 else '' + m_str = f'{m:02.0f} min ' if m > 0.0 else '' + s_str = f'{s:06.02f} sec' if s > 0.0 else '' + return f"{h_str}{m_str}{s_str}" From f0e7aec6d30931a89998e83818e8107f52986c5f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 14:16:36 +0900 Subject: [PATCH 008/962] =?UTF-8?q?feat:=20=E5=AE=9F=E6=B6=88=E5=8C=96&?= =?UTF-8?q?=E3=82=A2=E3=83=AB=E3=83=88=E3=83=9E=E3=83=BC=E3=82=AF=20Web?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E3=82=B1=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=81=AE=E8=A9=A6=E4=BD=9C=E5=93=81=E3=82=92=E7=99=BB?= =?UTF-8?q?=E9=8C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.dockerignore | 12 + ecs/jskult-webapp/.env.example | 24 + ecs/jskult-webapp/.gitignore | 6 + ecs/jskult-webapp/.vscode/launch.json | 17 + .../.vscode/recommended_settings.json | 18 + ecs/jskult-webapp/Dockerfile | 19 + ecs/jskult-webapp/Pipfile | 34 + ecs/jskult-webapp/Pipfile.lock | 765 ++++++++++++++++++ ecs/jskult-webapp/README.md | 192 +++++ ecs/jskult-webapp/src/__init__.py | 0 ecs/jskult-webapp/src/aws/__init__.py | 0 ecs/jskult-webapp/src/aws/aws_api_client.py | 5 + ecs/jskult-webapp/src/aws/cognito.py | 25 + ecs/jskult-webapp/src/aws/s3.py | 32 + ecs/jskult-webapp/src/controller/__init__.py | 0 ecs/jskult-webapp/src/controller/bio.py | 87 ++ .../src/controller/bio_download.py | 121 +++ .../src/controller/healthcheck.py | 10 + ecs/jskult-webapp/src/controller/login.py | 150 ++++ ecs/jskult-webapp/src/controller/logout.py | 41 + ecs/jskult-webapp/src/controller/menu.py | 55 ++ ecs/jskult-webapp/src/core/__init__.py | 0 ecs/jskult-webapp/src/core/tasks.py | 21 + ecs/jskult-webapp/src/db/__init__.py | 0 ecs/jskult-webapp/src/db/database.py | 71 ++ ecs/jskult-webapp/src/db/sql_condition.py | 35 + ecs/jskult-webapp/src/db/tasks.py | 22 + ecs/jskult-webapp/src/depends/__init__.py | 0 ecs/jskult-webapp/src/depends/auth.py | 48 ++ ecs/jskult-webapp/src/depends/database.py | 17 + ecs/jskult-webapp/src/depends/services.py | 16 + ecs/jskult-webapp/src/error/__init__.py | 0 .../src/error/exception_handler.py | 15 + ecs/jskult-webapp/src/error/exceptions.py | 33 + ecs/jskult-webapp/src/main.py | 40 + ecs/jskult-webapp/src/model/__init__.py | 0 ecs/jskult-webapp/src/model/db/__init__.py | 0 .../src/model/db/base_db_model.py | 5 + .../src/model/db/bio_sales_view.py | 74 ++ ecs/jskult-webapp/src/model/db/hdke_tbl.py | 8 + .../src/model/db/pharmacy_product_master.py | 5 + ecs/jskult-webapp/src/model/db/user_master.py | 36 + .../src/model/db/wholesaler_master.py | 8 + .../src/model/internal/jwt_token.py | 152 ++++ .../src/model/internal/session.py | 53 ++ .../src/model/request/__init__.py | 0 ecs/jskult-webapp/src/model/request/bio.py | 137 ++++ .../src/model/request/bio_download.py | 20 + ecs/jskult-webapp/src/model/request/login.py | 15 + ecs/jskult-webapp/src/model/view/__init__.py | 0 .../src/model/view/bio_disp_model.py | 19 + .../src/model/view/bio_view_model.py | 137 ++++ .../src/model/view/logout_view_model.py | 10 + .../src/model/view/mainte_login_view_model.py | 5 + .../src/model/view/menu_view_model.py | 26 + .../src/model/view/user_view_model.py | 26 + .../src/repositories/__init__.py | 0 .../src/repositories/base_repository.py | 43 + .../repositories/bio_sales_view_repository.py | 116 +++ .../src/repositories/hdke_tbl_repository.py | 18 + .../pharmacy_product_master_repository.py | 36 + .../repositories/user_master_repository.py | 27 + .../wholesaler_master_repository.py | 35 + ecs/jskult-webapp/src/router/__init__.py | 0 .../src/router/session_router.py | 125 +++ ecs/jskult-webapp/src/services/__init__.py | 0 .../src/services/base_service.py | 13 + .../src/services/batch_status_service.py | 41 + .../src/services/bio_view_service.py | 119 +++ .../src/services/login_service.py | 57 ++ .../src/services/session_service.py | 15 + ecs/jskult-webapp/src/static/__init__.py | 0 ecs/jskult-webapp/src/static/css/bioStyle.css | 291 +++++++ .../src/static/css/datepicker.css | 11 + .../src/static/css/menuStyle.css | 49 ++ .../src/static/css/pagenation.css | 65 ++ .../static/function/businessLogicScript.js | 213 +++++ .../src/static/img/icon_modal_confirm.png | Bin 0 -> 13691 bytes .../src/static/img/icon_modal_error.png | Bin 0 -> 17229 bytes .../src/static/lib/fixed_midashi.js | 165 ++++ ecs/jskult-webapp/src/system_var/__init__.py | 0 ecs/jskult-webapp/src/system_var/constants.py | 129 +++ .../src/system_var/environment.py | 22 + ecs/jskult-webapp/src/templates/__init__.py | 6 + ecs/jskult-webapp/src/templates/_header.html | 14 + ecs/jskult-webapp/src/templates/_modal.html | 40 + .../src/templates/bioSearchList.html | 462 +++++++++++ ecs/jskult-webapp/src/templates/logout.html | 75 ++ .../src/templates/maintlogin.html | 27 + ecs/jskult-webapp/src/templates/menu.html | 36 + ecs/jskult-webapp/src/util/sanitize.py | 14 + ecs/jskult-webapp/src/util/string_util.py | 10 + 92 files changed, 4941 insertions(+) create mode 100644 ecs/jskult-webapp/.dockerignore create mode 100644 ecs/jskult-webapp/.env.example create mode 100644 ecs/jskult-webapp/.gitignore create mode 100644 ecs/jskult-webapp/.vscode/launch.json create mode 100644 ecs/jskult-webapp/.vscode/recommended_settings.json create mode 100644 ecs/jskult-webapp/Dockerfile create mode 100644 ecs/jskult-webapp/Pipfile create mode 100644 ecs/jskult-webapp/Pipfile.lock create mode 100644 ecs/jskult-webapp/README.md create mode 100644 ecs/jskult-webapp/src/__init__.py create mode 100644 ecs/jskult-webapp/src/aws/__init__.py create mode 100644 ecs/jskult-webapp/src/aws/aws_api_client.py create mode 100644 ecs/jskult-webapp/src/aws/cognito.py create mode 100644 ecs/jskult-webapp/src/aws/s3.py create mode 100644 ecs/jskult-webapp/src/controller/__init__.py create mode 100644 ecs/jskult-webapp/src/controller/bio.py create mode 100644 ecs/jskult-webapp/src/controller/bio_download.py create mode 100644 ecs/jskult-webapp/src/controller/healthcheck.py create mode 100644 ecs/jskult-webapp/src/controller/login.py create mode 100644 ecs/jskult-webapp/src/controller/logout.py create mode 100644 ecs/jskult-webapp/src/controller/menu.py create mode 100644 ecs/jskult-webapp/src/core/__init__.py create mode 100644 ecs/jskult-webapp/src/core/tasks.py create mode 100644 ecs/jskult-webapp/src/db/__init__.py create mode 100644 ecs/jskult-webapp/src/db/database.py create mode 100644 ecs/jskult-webapp/src/db/sql_condition.py create mode 100644 ecs/jskult-webapp/src/db/tasks.py create mode 100644 ecs/jskult-webapp/src/depends/__init__.py create mode 100644 ecs/jskult-webapp/src/depends/auth.py create mode 100644 ecs/jskult-webapp/src/depends/database.py create mode 100644 ecs/jskult-webapp/src/depends/services.py create mode 100644 ecs/jskult-webapp/src/error/__init__.py create mode 100644 ecs/jskult-webapp/src/error/exception_handler.py create mode 100644 ecs/jskult-webapp/src/error/exceptions.py create mode 100644 ecs/jskult-webapp/src/main.py create mode 100644 ecs/jskult-webapp/src/model/__init__.py create mode 100644 ecs/jskult-webapp/src/model/db/__init__.py create mode 100644 ecs/jskult-webapp/src/model/db/base_db_model.py create mode 100644 ecs/jskult-webapp/src/model/db/bio_sales_view.py create mode 100644 ecs/jskult-webapp/src/model/db/hdke_tbl.py create mode 100644 ecs/jskult-webapp/src/model/db/pharmacy_product_master.py create mode 100644 ecs/jskult-webapp/src/model/db/user_master.py create mode 100644 ecs/jskult-webapp/src/model/db/wholesaler_master.py create mode 100644 ecs/jskult-webapp/src/model/internal/jwt_token.py create mode 100644 ecs/jskult-webapp/src/model/internal/session.py create mode 100644 ecs/jskult-webapp/src/model/request/__init__.py create mode 100644 ecs/jskult-webapp/src/model/request/bio.py create mode 100644 ecs/jskult-webapp/src/model/request/bio_download.py create mode 100644 ecs/jskult-webapp/src/model/request/login.py create mode 100644 ecs/jskult-webapp/src/model/view/__init__.py create mode 100644 ecs/jskult-webapp/src/model/view/bio_disp_model.py create mode 100644 ecs/jskult-webapp/src/model/view/bio_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/logout_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/mainte_login_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/menu_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/user_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/__init__.py create mode 100644 ecs/jskult-webapp/src/repositories/base_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/user_master_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py create mode 100644 ecs/jskult-webapp/src/router/__init__.py create mode 100644 ecs/jskult-webapp/src/router/session_router.py create mode 100644 ecs/jskult-webapp/src/services/__init__.py create mode 100644 ecs/jskult-webapp/src/services/base_service.py create mode 100644 ecs/jskult-webapp/src/services/batch_status_service.py create mode 100644 ecs/jskult-webapp/src/services/bio_view_service.py create mode 100644 ecs/jskult-webapp/src/services/login_service.py create mode 100644 ecs/jskult-webapp/src/services/session_service.py create mode 100644 ecs/jskult-webapp/src/static/__init__.py create mode 100644 ecs/jskult-webapp/src/static/css/bioStyle.css create mode 100644 ecs/jskult-webapp/src/static/css/datepicker.css create mode 100644 ecs/jskult-webapp/src/static/css/menuStyle.css create mode 100644 ecs/jskult-webapp/src/static/css/pagenation.css create mode 100644 ecs/jskult-webapp/src/static/function/businessLogicScript.js create mode 100644 ecs/jskult-webapp/src/static/img/icon_modal_confirm.png create mode 100644 ecs/jskult-webapp/src/static/img/icon_modal_error.png create mode 100644 ecs/jskult-webapp/src/static/lib/fixed_midashi.js create mode 100644 ecs/jskult-webapp/src/system_var/__init__.py create mode 100644 ecs/jskult-webapp/src/system_var/constants.py create mode 100644 ecs/jskult-webapp/src/system_var/environment.py create mode 100644 ecs/jskult-webapp/src/templates/__init__.py create mode 100644 ecs/jskult-webapp/src/templates/_header.html create mode 100644 ecs/jskult-webapp/src/templates/_modal.html create mode 100644 ecs/jskult-webapp/src/templates/bioSearchList.html create mode 100644 ecs/jskult-webapp/src/templates/logout.html create mode 100644 ecs/jskult-webapp/src/templates/maintlogin.html create mode 100644 ecs/jskult-webapp/src/templates/menu.html create mode 100644 ecs/jskult-webapp/src/util/sanitize.py create mode 100644 ecs/jskult-webapp/src/util/string_util.py diff --git a/ecs/jskult-webapp/.dockerignore b/ecs/jskult-webapp/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-webapp/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example new file mode 100644 index 00000000..73f72119 --- /dev/null +++ b/ecs/jskult-webapp/.env.example @@ -0,0 +1,24 @@ +#AWS +##Cognito +COGNITO_AUTH_DOMAIN=******* +AUTHORIZE_ENDPOINT=********* +TOKEN_ENDPOINT=*************** +COGNITO_IDENTITY_PROVIDER=********* +COGNITO_REDIRECT_URI=***************** +COGNITO_USER_POOL_ID=******************** +COGNITO_CLIENT_ID=********************** +COGNITO_CLIENT_SECRET=****************************** +##DynamoDB +AWS_REGION=************** +SESSION_TABLE_NAME=*********************** +##S3 +BIO_ACCESS_LOG_BUCKET=******************* +#MySQL +DB_HOST=************ +DB_PORT=************ +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=************ +#実装の設定 +BIO_SEARCH_RESULT_MAX_COUNT=35000 +SESSION_EXPIRE_MINUTE=20 \ No newline at end of file diff --git a/ecs/jskult-webapp/.gitignore b/ecs/jskult-webapp/.gitignore new file mode 100644 index 00000000..547e4960 --- /dev/null +++ b/ecs/jskult-webapp/.gitignore @@ -0,0 +1,6 @@ +__pycache__ + +.vscode/settings.json +.env +!src/data/BioData_template.xlsx +src/data/* diff --git a/ecs/jskult-webapp/.vscode/launch.json b/ecs/jskult-webapp/.vscode/launch.json new file mode 100644 index 00000000..a3a5a0b8 --- /dev/null +++ b/ecs/jskult-webapp/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch AP Server(FastAPI)", + "type": "python", + "request": "launch", + "module": "uvicorn", + "args": ["src.main:app","--reload", "--no-server-header"], + "justMyCode": true, + "envFile": "${workspaceFolder}/.env" + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-webapp/.vscode/recommended_settings.json b/ecs/jskult-webapp/.vscode/recommended_settings.json new file mode 100644 index 00000000..d5ce3e07 --- /dev/null +++ b/ecs/jskult-webapp/.vscode/recommended_settings.json @@ -0,0 +1,18 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": ["--max-line-length=120"], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Args": ["--max-line-length", "120"] +} diff --git a/ecs/jskult-webapp/Dockerfile b/ecs/jskult-webapp/Dockerfile new file mode 100644 index 00000000..ef14f718 --- /dev/null +++ b/ecs/jskult-webapp/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src + +CMD ["gunicorn", "src.main:app", "-w", "4", "-k" ,"uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:80"] diff --git a/ecs/jskult-webapp/Pipfile b/ecs/jskult-webapp/Pipfile new file mode 100644 index 00000000..7512a1dc --- /dev/null +++ b/ecs/jskult-webapp/Pipfile @@ -0,0 +1,34 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[scripts] +app = "uvicorn src.main:app --reload --no-server-header" + +[packages] +fastapi = "*" +uvicorn = "*" +gunicorn = "*" +boto3 = "*" +jinja2 = "*" +pyjwt = "*" +"pyjwt[crypto]" = "*" +requests = "*" +python-multipart = "*" +pynamodb = "*" +PyMySQL = "*" +pandas = "*" +openpyxl = "*" +xlrd = "*" +sqlalchemy = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock new file mode 100644 index 00000000..85633582 --- /dev/null +++ b/ecs/jskult-webapp/Pipfile.lock @@ -0,0 +1,765 @@ +{ + "_meta": { + "hash": { + "sha256": "d78a6bf1a96aa14c45431185961cae6d54ca1da8ea0319e1976bad4c2bebd673" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "anyio": { + "hashes": [ + "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421", + "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3" + ], + "markers": "python_full_version >= '3.6.2'", + "version": "==3.6.2" + }, + "boto3": { + "hashes": [ + "sha256:278d896e9090a976f41ec68da5c572bc4e5b7cb1e515f1898fee8cb2fadfb50d", + "sha256:3ce2225a61832d69831d669d912424ea3863268ca1cfa2a82203bb90952acefa" + ], + "index": "pypi", + "version": "==1.26.91" + }, + "botocore": { + "hashes": [ + "sha256:4ed6a488aee1b42367eace71f7d0993dda05b02eebd7dcdd78db5c9ce3d80da5", + "sha256:a8a800a2a945da807758cace539fc5b5ec1d5082ce363799d3a3870c2c4ed6fc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.29.91" + }, + "certifi": { + "hashes": [ + "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", + "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + ], + "markers": "python_version >= '3.6'", + "version": "==2022.12.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_version >= '3.7'", + "version": "==3.1.0" + }, + "click": { + "hashes": [ + "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", + "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.3" + }, + "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" + ], + "version": "==39.0.2" + }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_version >= '3.6'", + "version": "==1.1.0" + }, + "fastapi": { + "hashes": [ + "sha256:451387550c2d25a972193f22e408a82e75a8e7867c834a03076704fe20df3256", + "sha256:4a75936dbf9eb74be5eb0d41a793adefe9f3fc6ba66dbdabd160120fd3c2d9cd" + ], + "index": "pypi", + "version": "==0.94.1" + }, + "greenlet": { + "hashes": [ + "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a", + "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a", + "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43", + "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33", + "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8", + "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088", + "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca", + "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343", + "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645", + "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db", + "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df", + "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3", + "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86", + "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2", + "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a", + "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf", + "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7", + "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394", + "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40", + "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3", + "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6", + "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74", + "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0", + "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3", + "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91", + "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5", + "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9", + "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8", + "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b", + "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6", + "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb", + "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73", + "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", + "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df", + "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9", + "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f", + "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0", + "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857", + "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a", + "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249", + "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30", + "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292", + "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b", + "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d", + "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b", + "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c", + "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca", + "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7", + "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75", + "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae", + "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b", + "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470", + "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564", + "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9", + "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099", + "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0", + "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5", + "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19", + "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1", + "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==2.0.2" + }, + "gunicorn": { + "hashes": [ + "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", + "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" + ], + "index": "pypi", + "version": "==20.1.0" + }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "index": "pypi", + "version": "==3.1.2" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "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" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.2" + }, + "numpy": { + "hashes": [ + "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22", + "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f", + "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9", + "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96", + "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0", + "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a", + "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281", + "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04", + "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468", + "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253", + "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756", + "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a", + "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb", + "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d", + "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0", + "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910", + "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978", + "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5", + "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f", + "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a", + "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5", + "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2", + "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d", + "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95", + "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5", + "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d", + "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780", + "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa" + ], + "markers": "python_version < '3.10'", + "version": "==1.24.2" + }, + "openpyxl": { + "hashes": [ + "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", + "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" + ], + "index": "pypi", + "version": "==3.1.2" + }, + "pandas": { + "hashes": [ + "sha256:008aa9843e92753d1345353e643c51017d8a9e303041db3165b683fc16a4d380", + "sha256:1f060ae468cb24e1ab42c6344b097375b24a902d3cefb5524f93ef0cd0db5f4b", + "sha256:2379d66055592480aab24cda5b1543539302e0f85e9a33538e9e4fd309b3063e", + "sha256:26a507e14dc9a5ef29239b85d0ef5f01a7e308b88781b451a415d9d15e2d1a61", + "sha256:314bc00a0575151d3ec3124af23bf2ef7533b0e160fb138007a4ef1b3c6a0e63", + "sha256:3935c394e1b10d5c311bd9378018a468283adfe8469dc8084e21d55ca06be979", + "sha256:47f116fcb3aa533ab6661ca391136a643e25d1387dae989ed3e5b9248b98e2e9", + "sha256:4e99adf0a3b4e040fad8823567b52eacfd48db50d11024244a60197430ec74b8", + "sha256:67a5251a821b5af1c5aefe5a610a7758fae04693434fb98b2ebad10349cd727a", + "sha256:7bb2d670c1f7de9bcef0986ae9f832fbd99acc43db1d5fe22f2f06bda8a67d43", + "sha256:7fc7c85fcf27726633751d064f4d115dbccb202b0b6ea2909b6d89ca071115e3", + "sha256:8010e4c988c2c2ed1f5763a6e579448a13a7c87b810400124bb872121c9ca3f9", + "sha256:867fd5c3325c302e8feaaa7ec2d99c224be38551d8a9e1ae5d15be7e04424172", + "sha256:8cb4789c8b1f361d7b07a25002e871546b108519af9c176f8a5ca66316c09d90", + "sha256:8ce8603f8cf07044458914b81bb7445b6cc31d381657e0fac21b3eee40f404d0", + "sha256:adc1e91f282426d37830837f108747f0628e7635b1e83b2401b4f7e2a0068a82", + "sha256:b72ba4e9553645c0bfd688a4e89efe9694fb2936adb5c6295d31626233cb674a", + "sha256:c3c3be69e186d12a94004b0c76bb390e26b48e4b444f3adc86d2cf6506c71d99", + "sha256:cf960fc1f2545114b9ed1a0f025d6de63c891df31640e454e333e3b38504d36b", + "sha256:dc45eb7f23c92e0aa5278bb210fb30136e6e0b760636cf18874cdf2d6448df0f", + "sha256:e5ebb19a66d8c4a4563e6cb628a23ee6898dc50e5dfe8b73c692cd7ea81def0a", + "sha256:e817d97597be5c21b1a66cbecadd0d0242482b72f6f5b60129fce5cec329e274", + "sha256:e829b927b156f85432390580d8799dfee59db0be3954235cf5f5df8a42eaaacd", + "sha256:ebc301fb34185275d9ad57838f533d5413a02b434174d1be89785141f785b226", + "sha256:f082e075aeac904db0e69d8b8acc1d610362e3d823ace3af029622b24b105900" + ], + "index": "pypi", + "version": "==2.0.0rc0" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" + }, + "pydantic": { + "hashes": [ + "sha256:012c99a9c0d18cfde7469aa1ebff922e24b0c706d03ead96940f5465f2c9cf62", + "sha256:0abd9c60eee6201b853b6c4be104edfba4f8f6c5f3623f8e1dba90634d63eb35", + "sha256:12e837fd320dd30bd625be1b101e3b62edc096a49835392dcf418f1a5ac2b832", + "sha256:163e79386c3547c49366e959d01e37fc30252285a70619ffc1b10ede4758250a", + "sha256:189318051c3d57821f7233ecc94708767dd67687a614a4e8f92b4a020d4ffd06", + "sha256:1c84583b9df62522829cbc46e2b22e0ec11445625b5acd70c5681ce09c9b11c4", + "sha256:3091d2eaeda25391405e36c2fc2ed102b48bac4b384d42b2267310abae350ca6", + "sha256:32937835e525d92c98a1512218db4eed9ddc8f4ee2a78382d77f54341972c0e7", + "sha256:3a2be0a0f32c83265fd71a45027201e1278beaa82ea88ea5b345eea6afa9ac7f", + "sha256:3ac1cd4deed871dfe0c5f63721e29debf03e2deefa41b3ed5eb5f5df287c7b70", + "sha256:3ce13a558b484c9ae48a6a7c184b1ba0e5588c5525482681db418268e5f86186", + "sha256:415a3f719ce518e95a92effc7ee30118a25c3d032455d13e121e3840985f2efd", + "sha256:43cdeca8d30de9a897440e3fb8866f827c4c31f6c73838e3a01a14b03b067b1d", + "sha256:476f6674303ae7965730a382a8e8d7fae18b8004b7b69a56c3d8fa93968aa21c", + "sha256:4c19eb5163167489cb1e0161ae9220dadd4fc609a42649e7e84a8fa8fff7a80f", + "sha256:4ca83739c1263a044ec8b79df4eefc34bbac87191f0a513d00dd47d46e307a65", + "sha256:528dcf7ec49fb5a84bf6fe346c1cc3c55b0e7603c2123881996ca3ad79db5bfc", + "sha256:53de12b4608290992a943801d7756f18a37b7aee284b9ffa794ee8ea8153f8e2", + "sha256:587d92831d0115874d766b1f5fddcdde0c5b6c60f8c6111a394078ec227fca6d", + "sha256:60184e80aac3b56933c71c48d6181e630b0fbc61ae455a63322a66a23c14731a", + "sha256:6195ca908045054dd2d57eb9c39a5fe86409968b8040de8c2240186da0769da7", + "sha256:61f1f08adfaa9cc02e0cbc94f478140385cbd52d5b3c5a657c2fceb15de8d1fb", + "sha256:72cb30894a34d3a7ab6d959b45a70abac8a2a93b6480fc5a7bfbd9c935bdc4fb", + "sha256:751f008cd2afe812a781fd6aa2fb66c620ca2e1a13b6a2152b1ad51553cb4b77", + "sha256:89f15277d720aa57e173954d237628a8d304896364b9de745dcb722f584812c7", + "sha256:8c32b6bba301490d9bb2bf5f631907803135e8085b6aa3e5fe5a770d46dd0160", + "sha256:acc6783751ac9c9bc4680379edd6d286468a1dc8d7d9906cd6f1186ed682b2b0", + "sha256:b1eb6610330a1dfba9ce142ada792f26bbef1255b75f538196a39e9e90388bf4", + "sha256:b243b564cea2576725e77aeeda54e3e0229a168bc587d536cd69941e6797543d", + "sha256:b41822064585fea56d0116aa431fbd5137ce69dfe837b599e310034171996084", + "sha256:bbd5c531b22928e63d0cb1868dee76123456e1de2f1cb45879e9e7a3f3f1779b", + "sha256:cf95adb0d1671fc38d8c43dd921ad5814a735e7d9b4d9e437c088002863854fd", + "sha256:e277bd18339177daa62a294256869bbe84df1fb592be2716ec62627bb8d7c81d", + "sha256:ea4e2a7cb409951988e79a469f609bba998a576e6d7b9791ae5d1e0619e1c0f2", + "sha256:f9289065611c48147c1dd1fd344e9d57ab45f1d99b0fb26c51f1cf72cd9bcd31", + "sha256:fd9b9e98068fa1068edfc9eabde70a7132017bdd4f362f8b4fd0abed79c33083" + ], + "markers": "python_version >= '3.7'", + "version": "==1.10.6" + }, + "pyjwt": { + "extras": [ + "crypto" + ], + "hashes": [ + "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", + "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + ], + "index": "pypi", + "version": "==2.6.0" + }, + "pymysql": { + "hashes": [ + "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641", + "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" + ], + "index": "pypi", + "version": "==1.0.2" + }, + "pynamodb": { + "hashes": [ + "sha256:3c4d10867d59e6d7a2b54ee4ae213f1021d6f50ff93145e3909784bfc2b7560e", + "sha256:e09c39880560e10251778185b3d0c7a97ee8f42ab363a940c674e9330b61bf9d" + ], + "index": "pypi", + "version": "==5.4.1" + }, + "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" + }, + "python-multipart": { + "hashes": [ + "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132", + "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18" + ], + "index": "pypi", + "version": "==0.0.6" + }, + "pytz": { + "hashes": [ + "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", + "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + ], + "version": "==2022.7.1" + }, + "requests": { + "hashes": [ + "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", + "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + ], + "index": "pypi", + "version": "==2.28.2" + }, + "s3transfer": { + "hashes": [ + "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd", + "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.0" + }, + "setuptools": { + "hashes": [ + "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077", + "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2" + ], + "markers": "python_version >= '3.7'", + "version": "==67.6.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sniffio": { + "hashes": [ + "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", + "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:1df00f280fcf7628379c6838d47ac6abd2319848cb02984af313de9243994db8", + "sha256:1fd154847f2c77128e16757e3fd2028151aa8208dd3b9a5978918ea786a15312", + "sha256:20f36bff3b6c9fa94e40114fda4dc5048d40fd665390f5547b456a28e8059ee8", + "sha256:224c817e880359d344a462fc4dd94a233804f371aa290b024b6b976a2f5ade36", + "sha256:2ad44f45526411bebbf427cf858955a35f3a6bfd7db8f4314b12da4c0d1a4fd2", + "sha256:2c4c64f321080c83a3f0eed11cc9b73fe2a574f6b8339c402861274165c24cf6", + "sha256:3625a52fae744cff6f9beb6ed0775468b9eb7e6e8f6730676dfc49aa77d98b4e", + "sha256:3be54b3825512b3de5698ae04bf4aad6ea60442ac0f6b91ee4b8fa4db5c2dccd", + "sha256:4100c80070a66b042f1010b29b29a88d1d151c27a5e522c95ec07518b361a7a3", + "sha256:47e96be3e8c9c0f2c71ec87599be4bb8409d61841b66964a36b2447bec510b3b", + "sha256:483712fce53e2f7ec95ed7d106cd463f9fc122c28a7df4aaf2bc873d0d2a901f", + "sha256:48824b989a0e4340cd099dd4539702ddb1a5ce449f8a7355124e40a4935a95fa", + "sha256:4d653962da384a1d99795dbd8aac4a7516071b2f2984ed2aa25545fae670b808", + "sha256:5b067b2eaf3d97a49f3f6217981efa7b45d5726c2142f103712b020dd250fd98", + "sha256:5c35175b74cbcfe9af077bd13e87cfab13239e075c0e1e920095082f9377f0ed", + "sha256:61abff42e44e5daf17372cb8baa90e970dc647fc5f747e2caa9f9768acf17be8", + "sha256:6987f658389ad8bb6257db91551e7fde3e904974eef6f323856260907ef311d7", + "sha256:709f1ecb5dcea59f36fa0f485e09e41ff313b2d62c83a6f99b36870b0d6e42fa", + "sha256:7635cd38e3ea8522729b14451157104fce2117c44e7ba6a14684ed153d71b567", + "sha256:778db814cc21eff200c8bd42b4ffe976fa3378d10fb84d2c164d3c6a30bb38ee", + "sha256:81d4fc8f5c966677a3a2f39eb8e496442269d8c7d285b28145f7745fcc089d63", + "sha256:82691d3539023c3cee5ae055c47bf873728cd6b33bfaa7b916bea5a99b92f700", + "sha256:8ef7c56c74f4420b2c4a148d2531ba7f99b946cbf438a2bbcb2435fb4938a08d", + "sha256:9310666251385e4374c6f0bae6d69e62bc422021298ceb8669bf6ff56957ff37", + "sha256:ac6274dd530b684cca8cbb774e348afac6846f15d1694a56954413be6e2e8dcd", + "sha256:b7be0e6a4061d28b66ca4b4eb24558dd8c6386d3bcd2d6d7ef247be27cf1281b", + "sha256:bea2c1341abe9bc6f30071b8ada1a3c44f24ec0fe1b9418e9c1112ed32057c9e", + "sha256:bfcadfb8f0a9d26a76a5e2488cedd2e7cf8e70fe76d58aeb1c85eb83b33cbc5c", + "sha256:bfce790746d059af6d0bc68b578ba20d50a63c71a3db16edce7aa8eccdd73796", + "sha256:bfde1d7cf8b9aa6bbd0d53946cd508d76db7689afd442e2289642cdc8908b7b7", + "sha256:c343f0b546495f5d7a239c70bf50a99a48d7321c165b82afafa8483b9ebebf6e", + "sha256:c5d754665edea1ecdc79e3023659cb5594372e10776f3b3734d75c2c3ce95013", + "sha256:c76caced0c8e9129810895f71954c72f478e30bea7d0bba7130bade396be5048", + "sha256:ca147d9cde38b481085408e1d4277ee834cb88bcc31bc01933bc6513340071bc", + "sha256:d7bd001a40997f0c9a9ac10a57663a9397959966a5a365bb24a4d1a17aa60175", + "sha256:db91fe985f2264ab49b3450ab7e2a59c34f7eaf3bf283d6b9e2f9ee02b29e533", + "sha256:e0e270a4f5b42c67362d9c6af648cb86f6a00b20767553cfd734c914e1e2a5e0", + "sha256:ed714b864349704a7a719ec7199eec3f9cd15c190ecf6e10c34b5a0c549c5c18", + "sha256:edc16c8e24605d0a7925afaf99dbcbdc3f98a2cdda4622f1ea34482cb3b91940", + "sha256:f47709c98544384d390aed34046f0573df5725d22861c0cd0a5c151bc22eedff", + "sha256:ff10ad2d74a9a79c2984a2c709943e5362a1c898d8f3414815ea57515ae80c84" + ], + "index": "pypi", + "version": "==2.0.6" + }, + "starlette": { + "hashes": [ + "sha256:41da799057ea8620e4667a3e69a5b1923ebd32b1819c8fa75634bbe8d8bea9bd", + "sha256:e87fce5d7cbdde34b76f0ac69013fd9d190d581d80681493016666e6f96c6d5e" + ], + "markers": "python_version >= '3.7'", + "version": "==0.26.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", + "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" + ], + "markers": "python_version >= '3.7'", + "version": "==4.5.0" + }, + "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" + }, + "uvicorn": { + "hashes": [ + "sha256:8635a388062222082f4b06225b867b74a7e4ef942124453d4d1d1a5cb3750932", + "sha256:e69e955cb621ae7b75f5590a814a4fcbfb14cb8f44a36dfe3c5c75ab8aee3ad5" + ], + "index": "pypi", + "version": "==0.21.0" + }, + "xlrd": { + "hashes": [ + "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", + "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" + ], + "index": "pypi", + "version": "==2.0.1" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md new file mode 100644 index 00000000..23a796e6 --- /dev/null +++ b/ecs/jskult-webapp/README.md @@ -0,0 +1,192 @@ +# FastAPI 試作プロジェクト + +## 概要 + +PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のWebアプリケーションを開発してみるサンプルのリポジトリです。 +新名称はMeDaCA(Merck Database for Commercial Application)を表示する。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.x +- VSCode +- その他ライブラリ Pipfileを参照 + +## 環境構築 + +- Pythonの構築 + - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenvの導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する + - `pipenv install` + - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく + +- MySQLの環境構築 + - Windowsの場合、以下のリンクからダウンロードする + - + - Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Dockerの構築手順は、[Dockerのセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysqlコマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください +- VSCodeの設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode上で「F5」キーを押下すると、Webアプリケーションのサーバーが起動する +- 「」にアクセスし、ログイン画面が表示されていれば成功 + +## フォルダ構成 + +```text +. +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md +├── auth_flow.drawio -- 認証フローの説明図 +└── src -- ソースコードの保管場所 + ├── aws -- AWSリソース操作用のコード + │   ├── aws_api_client.py + │   ├── cognito.py + │   └── s3.py + ├── controller -- ルーティング層。基本的に1画面1つ + │   ├── bio.py + │   ├── bio_download.py + │   ├── login.py + │   ├── logout.py + │   └── menu.py + ├── core -- APサーバーのコア設定。 + │   └── tasks.py -- 起動・終了時に実行するタスクを設定。 + ├── data -- 生物由来照会のエクセルファイルテンプレート。これはS3に持っていくかも。 + │   └── BioData_template.xlsx + ├── db -- データベース関連処理。 + │   ├── database.py -- データベース接続、クエリ発行の共通モジュール。 + │   ├── sql_condition.py -- SQLの条件式を組み立てるためのモジュール + │   └── tasks.py -- coreに渡すタスク。サーバー起動時にDBとの接続モジュールの初期化、終了時にインスタンス破棄を行っている。 + ├── depends -- FastAPIの依存性注入(DI)使用するモジュールの置き場。Dependsで利用想定。 + │   ├── auth.py -- セッション等の認証関連 + │   ├── database.py -- リポジトリ層をコントローラーにDIするためのもの + │   └── services.py -- サービス層をコントローラーにDIするためのもの + ├── error -- エラー処理関連のモジュール置き場 + │   ├── exception_handler.py -- FastAPI内部でエラー発生時のハンドリング + │   └── exceptions.py -- カスタム例外クラス + ├── main.py -- APサーバーのエントリーポイント。ここでルーターやハンドラーの登録を行う + ├── model -- モデル層(MVCのM) + │   ├── db -- リポジトリから返されるDBレコードのモデル + │   │   ├── base_db_model.py + │   │   ├── bio_sales_view.py + │   │   ├── hdke_tbl.py + │   │   ├── pharmacy_product_master.py + │   │   ├── user_master.py + │   │   └── wholesaler_master.py + │   ├── jwt_token.py -- 認証用JWTトークンのモデル + │   ├── request -- 画面からのリクエストを受け付けるモデル + │   │   ├── bio.py + │   │   ├── bio_download.py + │   │   └── login.py + │   ├── session.py -- セッションデータのモデル + │   └── view -- ビューモデル。画面に対応したモデル。 + │   ├── bio_disp_model.py + │   ├── bio_view_model.py + │   ├── logout_view_model.py + │   ├── mainte_login_view_model.py + │   ├── menu_view_model.py + │   └── user_view_model.py + ├── repositories -- リポジトリ層。DB操作モジュール置き場。 + │   ├── base_repository.py + │   ├── bio_sales_view_repository.py + │   ├── hdke_tbl_repository.py + │   ├── pharmacy_product_master_repository.py + │   ├── user_master_repository.py + │   └── wholesaler_master_repository.py + ├── router -- コントローラー層の共通ルーティングの定義 + │   └── session_router.py + ├── services -- サービス層。ビジネスロジックはできる限りここに押し込む + │   ├── base_service.py + │   ├── batch_status_service.py + │   ├── bio_view_service.py + │   ├── login_service.py + │   └── session_service.py + ├── static -- 静的ファイルの配信ルートディレクトリ + │   ├── css + │   │   ├── bioStyle.css + │   │   ├── datepicker.css + │   │   ├── menuStyle.css + │   │   └── pagenation.css + │   ├── function + │   │   └── businessLogicScript.js + │   ├── img + │   │   ├── icon_modal_confirm.png + │   │   └── icon_modal_error.png + │   ├── lib + │   │   └── fixed_midashi.js + │   ├── sample.css + │   └── sample.js + ├── system_var -- システム変数 + │   ├── constants.py -- 定数 + │   └── environment.py -- 環境変数 + ├── templates -- ビューテンプレートエンジンの格納場所(Jinja2) + │   ├── _header.html -- 共通ヘッダー + │   ├── _modal.html -- モーダルの部品 + │   ├── bioSearchList.html + │   ├── logout.html + │   ├── maintlogin.html + │   ├── menu.html + └── util -- ユーティリティ関数置き場 + ├── sanitize.py -- モデルクラスのサニタイズを行うデコレータ + └── string_util.py -- 文字列操作関連のユーティリティ +``` + +## (参考)ファイルの追いかけ方 + +- APサーバーそのものは「src/main」にある。 + - ルーター、例外処理ハンドラ、開始終了タスクの設定、静的ファイルディレクトリのマウントを行っている +- URLパスに対する操作の実装は、「controller」フォルダを見る + - `@router.xxx`の`xxx`の部分がHTTPメソッドに相当する。このデコレータが付与された関数が、HTTPメソッドを処理するパスオペレーション関数となる + - パスオペレーション関数の引数には、リクエストで受け取るパラメータと、その関数内で使用できる依存関係を注入できる + - Request型と、Response型の引数は、その名の通り。 + - str型, int型などの引数を指定した場合、その引数はクエリストリングを意味する + - Dependsで初期値が設定される引数は、Depends関数に渡した関数が処理されてから代入される + - たとえば、`get_service`関数にサービスクラスの型を渡すと、get_service関数でサービスクラスのインスタンスを作成して返してくれる + - サービスクラスはリポジトリクラスに依存しているので、自分でインスタンスを組み立てる手間が省ける + - formやリクエストボディのJSONを受け取る場合、リクエスト用のモデルクラスに「as_form」や「as_body」などの関数を実装し、リクエストを受け取れるようにする + - ビジネスロジックは基本的にサービスクラスに押し込む。コントローラーではそのサービスクラスをDependsで依存して利用すること +- ビジネスロジックに相当するサービスクラスは「services」フォルダに格納する。共通実装は以下。 + - REPOSITORIES定数に、依存するリポジトリクラスを辞書形式で指定する + - CLIENTS定数に、依存するAWS APIクライアントクラスを辞書形式で指定する + - `__init__`コンストラクタ内で、2つの定数に指定したキーに紐付いたインスタンスが渡ってくるため、インスタンス変数として登録する + - あとは、ビジネスロジックにあたる関数を生やしていくだけ +- DBへのアクセスを行うリポジトリクラスは「repositories」フォルダに格納する。 + - SQL文を用意し、`_db`インスタンス変数のメソッドを利用してクエリを実行する。 + - 必要に応じて条件設定をする。条件設定には`SQLCondition`クラスを使用する。 + - `BioSalesViewRepository`のやり方が参考になる + - リポジトリクラスは、サービスクラスで利用するようにする(そのために、サービスクラス側に依存関係を書いている) +- モデルクラスは、「models」フォルダに格納する + - HTTPリクエスト用のモデルクラスは「request」フォルダへ + - ビュー表示用のモデルクラス(View Model)は「view」フォルダへ + - 画面への項目埋め込みや、非表示の制御を行うため、View Modelに値を詰めて、テンプレート側で操作するようにする + - DBから取得したレコードのモデルクラスは「db」フォルダへ + - 内部処理に利用するモデルクラスは「internal」フォルダへ +- 「static」フォルダは、静的ファイルの置き場所 + - CSS, JS、画像ファイルを置く。 + - 画面の細かな制御は「BusinessLogicScript.js」で行っている。現行からちょこちょこ変える必要がある。 + - CSSも、現行は画面ごとに分かれているが、一つのベーススタイルにまとめたい +- 「templates」フォルダは、テンプレートエンジンを格納する + - 各画面1つのテンプレートエンジンを用意する + - 内部で使う変数は、コントローラーで「templates.TemplateResponse」」に詰めて渡す + - テンプレート内でincludeする用途のテンプレートは先頭に「_」をつける + - `_header.html`は、``タグ内に記載する部品。共通的に読み込むCSS等のファイルを指定する。 + - PHPでは分岐などをベタ書きしているが、View Modelに宣言的な関数を用意して、可読性を向上させている。 +- コントローラーの共通処理は、「router」フォルダ内のモジュールで実装している + - コントローラーのrouter変数が、`router.route_class = AfterSetCookieSessionRoute`となっている場合、レスポンス時、クッキーにセッションキーを登録する動きをする + - コントローラーのrouter変数が、`router.route_class = Authenticate`となっている場合、以下の動きをする + - リクエスト到達時にセッションの有無をチェックする + - レスポンス時、クッキーにセッションキーを登録する diff --git a/ecs/jskult-webapp/src/__init__.py b/ecs/jskult-webapp/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/aws/__init__.py b/ecs/jskult-webapp/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/aws/aws_api_client.py b/ecs/jskult-webapp/src/aws/aws_api_client.py new file mode 100644 index 00000000..06143bcf --- /dev/null +++ b/ecs/jskult-webapp/src/aws/aws_api_client.py @@ -0,0 +1,5 @@ +from abc import ABCMeta + + +class AWSAPIClient(metaclass=ABCMeta): + pass diff --git a/ecs/jskult-webapp/src/aws/cognito.py b/ecs/jskult-webapp/src/aws/cognito.py new file mode 100644 index 00000000..c80f5bac --- /dev/null +++ b/ecs/jskult-webapp/src/aws/cognito.py @@ -0,0 +1,25 @@ +import boto3 + +from src.aws.aws_api_client import AWSAPIClient +from src.system_var import environment + + +class CognitoClient(AWSAPIClient): + def __init__(self) -> None: + self.__client = boto3.client('cognito-idp') + + def login_by_user_password_flow(self, username: str, password: str, secret_hash: str): + + auth_response = self.__client.admin_initiate_auth( + UserPoolId=environment.COGNITO_USER_POOL_ID, + ClientId=environment.COGNITO_CLIENT_ID, + AuthFlow='ADMIN_USER_PASSWORD_AUTH', + AuthParameters={ + 'USERNAME': username, + 'PASSWORD': password, + 'SECRET_HASH': secret_hash + }, + ) + authentication_result = auth_response['AuthenticationResult'] + + return authentication_result['IdToken'], authentication_result['RefreshToken'], diff --git a/ecs/jskult-webapp/src/aws/s3.py b/ecs/jskult-webapp/src/aws/s3.py new file mode 100644 index 00000000..852c7ceb --- /dev/null +++ b/ecs/jskult-webapp/src/aws/s3.py @@ -0,0 +1,32 @@ +from urllib.parse import quote + +import boto3 + +from src.aws.aws_api_client import AWSAPIClient + + +class S3Client(AWSAPIClient): + __s3_client = boto3.client('s3') + + def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): + self.__s3_client.upload_file( + local_file_path, + Bucket=bucket_name, + Key=file_key + ) + + def generate_presigned_url(self, bucket_name: str, file_key: str, download_filename: str=''): + # presigned_urlを生成 + presigned_url = self.__s3_client.generate_presigned_url( + 'get_object', + Params={ + 'Bucket': bucket_name, + 'Key': file_key, + # 別ファイル名に変更するための仕掛け。Unicode文字はquoteでエスケープが必要 + 'ResponseContentDisposition': f'attachment; filename="{quote(download_filename)}"' + }, + # 有効期限20分 + ExpiresIn=1200 + ) + + return presigned_url diff --git a/ecs/jskult-webapp/src/controller/__init__.py b/ecs/jskult-webapp/src/controller/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py new file mode 100644 index 00000000..cf191331 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -0,0 +1,87 @@ +from typing import Optional + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.exceptions import HTTPException +from starlette import status + +from src.depends.services import get_service +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_view_model import BioViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.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('/bio/BioSearchList') +def bio_view( + request: Request, + batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), + bio_service: BioViewService=Depends(get_service(BioViewService)) +): + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + # 検索項目の取得 + bio = bio_service.prepare_bio_view(session) + # セッション書き換え + 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( + 'bioSearchList.html', { + 'request': request, + 'bio': bio, + }, + headers={'session_key': session_key} + ) + return templates_response + +@router.post('/bio/BioSearchList') +def search_bio( + request: Request, + bio_form: Optional[BioModel] = Depends(BioModel.as_form), + bio_service: BioViewService=Depends(get_service(BioViewService)), + batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)) +): + # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 生物由来データを検索 + bio_sales_view_data = bio_service.search_bio_data(bio_form) + # 検索項目などのデータを取得 + bio: BioViewModel = bio_service.prepare_bio_view(session) + bio.bio_data = bio_sales_view_data + bio.form_data = bio_form + # セッション書き換え + 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( + 'bioSearchList.html', { + 'request': request, + 'bio': bio + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py new file mode 100644 index 00000000..576e7a83 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -0,0 +1,121 @@ +"""生物由来ファイルダウンロード APIRoute""" +from datetime import datetime +from typing import Union + +from fastapi import APIRouter, Depends, HTTPException +from fastapi.exceptions import HTTPException +from fastapi.responses import JSONResponse +from starlette import status + +from src.depends.auth import verify_session +from src.depends.services import get_service +from src.error.exceptions import DBException +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.request.bio_download import BioDownloadModel +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.services.session_service import set_session +from src.system_var import constants + +router = APIRouter() + +######################### +# APIs # +######################### +@router.post('/api/bio/download') +async def download_bio_data( + search_param: BioModel=Depends(BioModel.as_body), + download_param: BioDownloadModel=Depends(BioDownloadModel.as_body), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + session: Union[UserSession, None]=Depends(verify_session) + ): + # 通常のビューとはルーティングの扱いを変えるために、個別のルーターで登録する + # error_log(date("Y/m/d H:i:s") . " [INFO] getBioData start" . "\r\n", 3, "$execLog"); + # 改修後のパラメータを打ち出すようにする + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] param:szConditions=" . htmlspecialchars($_POST["szConditions"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] param:pageNum=" . htmlspecialchars($_POST["pageNum"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] szUser=" . htmlspecialchars($_POST["szUser"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] szfilename=" . htmlspecialchars($_POST["szfilename"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] extension=" . htmlspecialchars($_POST["extension"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] sql=" . htmlspecialchars($_POST["sql"], ENT_QUOTES) . "\r\n", 3, "$execLog"); + # いらない error_log(date("Y/m/d H:i:s") . " [INFO] arrayPrepare=" . $_POST["arrayPrepare"] . "\r\n", 3, "$execLog"); + # ファイル名に使用するタイムスタンプを初期化しておく + now = datetime.now() + if session is None: + return {'status': 'session_expired'} + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + return {'status': 'batch_processing'} + try: + # 生物由来データを検索 + search_result_df = bio_service.search_download_bio_data(search_param) + except DBException as e: + # error_log(date("Y/m/d H:i:s") . " [ERROR] " . "\r\n", 3, "$execLog"); + print('DB Error', e.args) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + if search_result_df.size < 1: + # 検索結果が0件の場合、download_urlを返さない + print('Bio data not found') + return {'status': 'ok', 'download_url': None} + + # ファイルに打ち出すカラムを抽出 + extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] + + # 値を変換 + # データ種別の正式名を設定 + extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply(lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) + # データ区分の区分の日本語名を設定 + extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) + # ロット番号エラーフラグの日本語名を設定 + extract_df.loc[:, 'lot_no_err_flg'] = extract_df['lot_no_err_flg'].apply(lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_no'].apply(lambda bef_slip_mgt_no:extract_df['ins_dt'] if bef_slip_mgt_no is not None else '') + extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_no'].apply(lambda bef_slip_mgt_no:extract_df['ins_usr'] if bef_slip_mgt_no is not None else '') + + # 種別によって出力を変える + local_file_path = '' + if download_param.kind == 'xlsx': + # error_log(date("Y/m/d H:i:s") . " [INFO] 今回はExcelファイルに出力する" . "\r\n", 3, "$execLog"); + local_file_path = bio_service.write_excel_file(extract_df, download_param.user_id, timestamp=now) + elif download_param.kind == 'csv': + # error_log(date("Y/m/d H:i:s") . " [INFO] 今回はCSVファイルに出力する" . "\r\n", 3, "$execLog"); + local_file_path = bio_service.write_csv_file(extract_df, download_param.user_id, header=constants.BIO_CSV_HEADER, timestamp=now) + + # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する + try: + bio_service.upload_bio_data_file(local_file_path) + download_file_url = bio_service.generate_download_file_url(local_file_path, download_param.user_id, download_param.kind) + except Exception as e: + print('S3 access error', e.args) + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'aws_error', 'message': e.args} + ) + + # セッション書き換え + session.update( + actions=[ + UserSession.last_access_time.set(UserSession.new_last_access_time()), + UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()), + ] + ) + set_session(session) + + # クッキーも書き換え + json_response = JSONResponse(content={ + 'status': 'ok', + 'download_url': download_file_url + }) + json_response.set_cookie( + key='session', + value=session.session_key, + max_age=20*60, + secure=True, + httponly=True + ) + return json_response diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py new file mode 100644 index 00000000..b36abc8d --- /dev/null +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -0,0 +1,10 @@ +from fastapi import APIRouter + +router = APIRouter() + +######################### +# Views # +######################### +@router.get('/healthcheck') +def healthcheck(): + return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py new file mode 100644 index 00000000..35550850 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/login.py @@ -0,0 +1,150 @@ +import os.path as path +import secrets +import urllib.parse as parse +from typing import Union + +from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi.responses import RedirectResponse +from starlette import status + +from src.depends.auth import code_security +from src.depends.services import get_service +from src.error.exceptions import JWTTokenVerifyException, NotAuthorizeException +from src.model.internal.session import UserSession +from src.model.request.login import LoginModel +from src.model.view.mainte_login_view_model import MainteLoginViewModel +from src.router.session_router import AfterSetCookieSessionRoute +from src.services.login_service import LoginService +from src.services.session_service import set_session +from src.system_var import constants, environment +from src.templates import templates + +router = APIRouter() +router.route_class = AfterSetCookieSessionRoute + +######################### +# Views # +######################### +@router.get('/userlogin') +def login_user_redirect_view(): + auth_query_string = parse.urlencode( + { + 'response_type': 'code', + 'identity_provider': environment.COGNITO_IDENTITY_PROVIDER, + 'client_id': environment.COGNITO_CLIENT_ID, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + ) + authorize_endpoint_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.AUTHORIZE_ENDPOINT}?{auth_query_string}' + + return RedirectResponse(url=authorize_endpoint_url, status_code=status.HTTP_303_SEE_OTHER) + +@router.get('/maintlogin') +def login_maintenance_view(request: Request): + mainte_login = MainteLoginViewModel() + return templates.TemplateResponse( + 'maintlogin.html', + { + 'request': request, + 'mainte_login': mainte_login + } + ) + +######################### +# APIs # +######################### +@router.post('/login') +def sso_authorize( + response: Response, + request: LoginModel = Depends(LoginModel.as_form), + login_service: LoginService = Depends(get_service(LoginService)) + ): + try: + jwt_token = login_service.login(request.username, request.password) + except NotAuthorizeException as e: + print(e) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + except JWTTokenVerifyException as 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 not user_record.is_enable_user(): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # メンテユーザーではない場合、ログアウトにリダイレクトする + if user_record is None or not user_record.is_maintenance_user(): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # CSRFトークンを生成 + csrf_token = secrets.token_urlsafe(32) + # DynamoDBにトークンIDを設定する + session_model: UserSession = UserSession.new( + user_id=user_id, + id_token=verified_token.id_token, + refresh_token=verified_token.refresh_token, + csrf_token=csrf_token, + bio_flg=user_record.auth_flg1, + doc_flg=user_record.auth_flg2, + inst_flg=user_record.auth_flg3, + master_mainte_flg=user_record.auth_flg4, + user_flg=user_record.mntuser_flg + ) + session_key = set_session(session_model) + + response = RedirectResponse( + url='/menu', + status_code=status.HTTP_303_SEE_OTHER, + headers={'session_key': session_key} + ) + return response + + +@router.get('/authorize') +def sso_authorize( + code:Union[str, None]=Depends(code_security), + login_service: LoginService=Depends(get_service(LoginService)) + ) -> Response: + if not code: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_NOT_LOGIN) + + # トークン取得 + jwt_token = login_service.login_with_security_code(code) + try: + # トークン検証 + verified_token = jwt_token.verify_token() + except JWTTokenVerifyException as e: + 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 not user_record.is_enable_user(): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + # Merckユーザーではない場合、ログアウトにリダイレクトする + if user_record is None or not user_record.is_groupware_user(): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + + # CSRFトークンを生成 + csrf_token = secrets.token_urlsafe(32) + # DynamoDBにトークンIDを設定する + session_model: UserSession = UserSession.new( + user_id=user_id, + id_token=verified_token.id_token, + refresh_token=verified_token.refresh_token, + csrf_token=csrf_token, + bio_flg=user_record.auth_flg1, + doc_flg=user_record.auth_flg2, + inst_flg=user_record.auth_flg3, + master_mainte_flg=user_record.auth_flg4, + user_flg=user_record.mntuser_flg + ) + session_key = set_session(session_model) + response = RedirectResponse( + url='/menu', + status_code=status.HTTP_303_SEE_OTHER, + headers={'session_key': session_key} + ) + return response diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py new file mode 100644 index 00000000..252e2a01 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -0,0 +1,41 @@ +from typing import Optional, Union + +from fastapi import APIRouter, Depends, Request +from fastapi.responses import HTMLResponse + +from src.depends.auth import verify_session +from src.model.internal.session import UserSession +from src.model.view.logout_view_model import LogoutViewModel +from src.system_var import constants +from src.templates import templates + +router = APIRouter() + +######################### +# Views # +######################### +@router.get('/logout', response_class=HTMLResponse) +def logout_view( + request: Request, + reason: Optional[str] = None, + session: Union[UserSession, None]=Depends(verify_session) + ): + redirect_to = '/userlogin' + link_text = 'MeDaCA機能メニューへ' + if session is not None and session.user_flg == '1': + redirect_to = '/maintlogin' + link_text = 'Login画面に戻る' + logout = LogoutViewModel() + logout.redirect_to = redirect_to + logout.reason = constants.LOGOUT_REASON_MESSAGE_MAP.get(reason, '') + logout.link_text = link_text + template_response = templates.TemplateResponse( + 'logout.html', + { + 'request': request, + 'logout': logout, + } + ) + # クッキーを削除 + template_response.delete_cookie('session') + return template_response diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py new file mode 100644 index 00000000..26cf9482 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -0,0 +1,55 @@ +from fastapi import APIRouter, Depends, Request +from fastapi.responses import HTMLResponse + +from src.depends.services import get_service +from src.model.internal.session import UserSession +from src.model.view.menu_view_model import MenuViewModel +from src.model.view.user_view_model import UserViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.session_service import set_session +from src.templates import templates + +router = APIRouter() +router.route_class = AuthenticatedRoute + +######################### +# Views # +######################### +@router.get('/menu', response_class=HTMLResponse) +def menu_view( + request: Request, + batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)) + ): + session: UserSession = request.session + # 日付マスターからバッチ情報を取得する + hdke_tbl_record = batch_status_service.hdke_table_record + + batch_status = hdke_tbl_record.bch_actf + user = UserViewModel( + doc_flg=session.doc_flg, + inst_flg=session.inst_flg, + bio_flg=session.bio_flg, + master_mainte_flg=session.master_mainte_flg + ) + menu = MenuViewModel( + batch_status=batch_status, + user_model=user + ) + # セッション書き換え + 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( + 'menu.html', + { + 'request': request, + 'menu': menu + }, + headers={'session_key': session.session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/core/__init__.py b/ecs/jskult-webapp/src/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/core/tasks.py b/ecs/jskult-webapp/src/core/tasks.py new file mode 100644 index 00000000..42352465 --- /dev/null +++ b/ecs/jskult-webapp/src/core/tasks.py @@ -0,0 +1,21 @@ +"""FastAPIサーバーの起動・終了イベントのラッパー""" + +from typing import Callable + +from fastapi import FastAPI + +from src.db.tasks import close_db, init_db + + +def create_start_app_handler(app: FastAPI) -> Callable: + def start_app() -> None: + init_db(app) + + return start_app + + +def create_stop_app_handler(app: FastAPI) -> Callable: + def stop_app() -> None: + close_db(app) + + return stop_app \ No newline at end of file diff --git a/ecs/jskult-webapp/src/db/__init__.py b/ecs/jskult-webapp/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py new file mode 100644 index 00000000..2f941663 --- /dev/null +++ b/ecs/jskult-webapp/src/db/database.py @@ -0,0 +1,71 @@ +from sqlalchemy import Engine, create_engine, text +from sqlalchemy.engine.url import URL + +from src.error.exceptions import DBException + + +class Database: + + __engine: Engine = None + __host: str = None + __port: str = None + __user: str = None + __password: str = None + __schema: str = None + __connection_string:str = None + + def __init__(self, host: str, port: int, user: str, password: str, schema: str) -> None: + self.__host = host + self.__port = int(port) + self.__user = user + self.__password = password + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__user, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + @property + def connection(self): + return self.__engine + + def engine_init(self): + engine = create_engine( + self.__connection_string, + pool_timeout=5 + ) + self.__engine = engine + + def execute_query(self, select_query: str, parameters=None) -> list[dict]: + if self.__engine is None: + raise DBException('データベースが初期化されていません') + + with self.__engine.begin() as trx: + try: + result = trx.execute(text(select_query), parameters=parameters) + except Exception as e: + trx.rollback() + raise DBException(e) + return result.mappings().all() + + def execute(self, query: str, parameters=None) -> None: + if self.__engine is None: + raise DBException('データベースが初期化されていません') + + with self.__engine.begin() as trx: + try: + trx.execute(text(query), parameters=parameters) + except Exception as e: + trx.rollback() + raise DBException(e) + + def close(self): + if self.__engine is not None: + self.__engine.dispose(close=True) + self.__engine = None diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py new file mode 100644 index 00000000..dfd73858 --- /dev/null +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -0,0 +1,35 @@ +class SQLCondition: + column: str + operator: str + param: str + literal: bool + + def __init__(self, column: str, operator: str, param: str, literal=False) -> None: + """ + Args: + column (str): カラム名 + operator (str): 比較演算子 + param (str): パラメータ(プレースホルダーかリテラル値か) + literal (bool, optional): リテラル値を埋め込むかどうか。 + 画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。 + """ + self.column = column + self.operator = operator + self.param = param + self.literal=literal + + def apply(self): + # literalがFalseならプレースホルダー。Trueだったならは固定値。 + param = f':{self.param}' if self.literal is False else self.param + return f' {self.column} {self.operator} {param}' + +# 定数 +EQ = '=' +NE = '<>' +GT = '>' +LT = '<' +GE = '>=' +LE = '<=' +LIKE = 'LIKE' +IS = 'IS' +IS_NOT = 'IS NOT' \ No newline at end of file diff --git a/ecs/jskult-webapp/src/db/tasks.py b/ecs/jskult-webapp/src/db/tasks.py new file mode 100644 index 00000000..9da8d300 --- /dev/null +++ b/ecs/jskult-webapp/src/db/tasks.py @@ -0,0 +1,22 @@ +from fastapi import FastAPI + +from src.db.database import Database +from src.system_var import environment + + +def init_db(app: FastAPI) -> None: + # DB接続モジュールを初期化 + database = Database( + host=environment.DB_HOST, + port=environment.DB_PORT, + user=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + schema=environment.DB_SCHEMA + ) + database.engine_init() + # FastAPI App内で使える変数として追加 + app.state._db = database + + +def close_db(app: FastAPI) -> None: + app.state._db.close() diff --git a/ecs/jskult-webapp/src/depends/__init__.py b/ecs/jskult-webapp/src/depends/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/depends/auth.py b/ecs/jskult-webapp/src/depends/auth.py new file mode 100644 index 00000000..3310df6f --- /dev/null +++ b/ecs/jskult-webapp/src/depends/auth.py @@ -0,0 +1,48 @@ +import datetime +from typing import Union + +from fastapi import Depends +from fastapi.security import APIKeyCookie, APIKeyQuery + +from src.error.exceptions import JWTTokenVerifyException +from src.model.internal.jwt_token import JWTToken +from src.model.internal.session import UserSession +from src.services.session_service import get_session +from src.system_var import environment + +cookie_security = APIKeyCookie(name='session', auto_error=False) +code_security = APIKeyQuery(name='code', auto_error=False) + + +def get_current_session(session_key=Depends(cookie_security)): + if session_key is None: + return None + + session = get_session(session_key) + + # sessionが存在しない場合はNoneが返る + return session + + +def check_session_expired(session:Union[UserSession, None]=Depends(get_current_session)): + """セッションの最後にアクセスした時間が、セッション有効期限切れであるかどうかをチェックする""" + if session is None: + return None + + last_access_time = session.last_access_time + session_expired_period = datetime.datetime.fromtimestamp(last_access_time) + datetime.timedelta(minutes=environment.SESSION_EXPIRE_MINUTE) + if session_expired_period < datetime.datetime.now(): + return None + + return session + +def verify_session(session:Union[UserSession, None]=Depends(check_session_expired)): + if session is None: + return None + jwt_token = JWTToken(session.id_token, session.refresh_token) + try: + jwt_token.verify_token() + except JWTTokenVerifyException as e: + print(e) + return None + return session diff --git a/ecs/jskult-webapp/src/depends/database.py b/ecs/jskult-webapp/src/depends/database.py new file mode 100644 index 00000000..f764d5c5 --- /dev/null +++ b/ecs/jskult-webapp/src/depends/database.py @@ -0,0 +1,17 @@ +from typing import Callable, Type + +from fastapi import Depends +from starlette.requests import Request + +from src.db.database import Database +from src.repositories.base_repository import BaseRepository + + +def get_database(request: Request) -> Database: + return request.app.state._db + + +def get_repository(Repo_type: Type[BaseRepository]) -> Callable: + def get_repo(db: Database = Depends(get_database)) -> Type[BaseRepository]: + return Repo_type(db) + return get_repo \ No newline at end of file diff --git a/ecs/jskult-webapp/src/depends/services.py b/ecs/jskult-webapp/src/depends/services.py new file mode 100644 index 00000000..d93a0c97 --- /dev/null +++ b/ecs/jskult-webapp/src/depends/services.py @@ -0,0 +1,16 @@ +from typing import Callable, Type + +from fastapi import Depends +from starlette.requests import Request + +from src.db.database import Database +from src.depends.database import get_database +from src.services.base_service import BaseService + + +def get_service(Service_type: Type[BaseService]) -> Callable: + def get_service(db: Database=Depends(get_database)) -> Type[BaseService]: + repositories = {key: repository(db) for key, repository in Service_type.REPOSITORIES.items()} + clients = {key: client() for key, client in Service_type.CLIENTS.items()} + return Service_type(repositories=repositories, clients=clients) + return get_service \ No newline at end of file diff --git a/ecs/jskult-webapp/src/error/__init__.py b/ecs/jskult-webapp/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/error/exception_handler.py b/ecs/jskult-webapp/src/error/exception_handler.py new file mode 100644 index 00000000..679f7ebd --- /dev/null +++ b/ecs/jskult-webapp/src/error/exception_handler.py @@ -0,0 +1,15 @@ +from urllib import parse + +from fastapi import Request +from fastapi.exceptions import HTTPException +from fastapi.responses import RedirectResponse +from starlette import status + + +def http_exception_handler(request: Request, exc: HTTPException): + # 非同期API呼び出しの場合、detailにdictが入ってくるため、そのまま流す + if hasattr(exc, 'detail') is True and type(exc.detail) == dict: + raise exc + error_detail = exc.detail if hasattr(exc, 'detail') else '' + reason = parse.quote(error_detail) + return RedirectResponse(f'/logout?reason={reason}', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/error/exceptions.py b/ecs/jskult-webapp/src/error/exceptions.py new file mode 100644 index 00000000..53b299db --- /dev/null +++ b/ecs/jskult-webapp/src/error/exceptions.py @@ -0,0 +1,33 @@ +from typing import Union + +from starlette import status + + +class MeDaCaException(Exception): + """Webアプリの共通例外""" + pass + +class NotAuthorizeException(MeDaCaException): + """認証失敗の例外""" + pass + +class JWTTokenVerifyException(MeDaCaException): + """トークン検証失敗の例外""" + pass + +class DBException(MeDaCaException): + """DB関連の例外""" + pass + +class UnexpectedException(MeDaCaException): + """予期しない例外""" + + # デフォルトを500エラーとする + default_status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + + def __init__( + self, + detail: Union[str, dict], + ) -> None: + self.status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + self.detail = detail diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py new file mode 100644 index 00000000..fbc990cf --- /dev/null +++ b/ecs/jskult-webapp/src/main.py @@ -0,0 +1,40 @@ +import os.path as path + +from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles +from starlette import status + +import src.static as static +from src.controller import bio, bio_download, healthcheck, login, logout, menu +from src.core import tasks +from src.error.exception_handler import http_exception_handler +from src.error.exceptions import UnexpectedException + +app = FastAPI() + +# 静的ファイルをマウント +app.mount('/static', StaticFiles(directory=path.dirname(static.__file__)), name='static') +# ログイン関連のルーター +app.include_router(login.router) +# ログアウト関連のルーター +app.include_router(logout.router) +# メニュー画面関連のルーター +app.include_router(menu.router) +# 生物由来関連のルーター +app.include_router(bio.router) +# 生物由来のダウンロード用APIルーター。 +# クライアントから非同期呼出しされるため、共通ルーターとは異なる扱いとする。 +app.include_router(bio_download.router) +# ヘルスチェック用のルーター +app.include_router(healthcheck.router) + +# エラー発生時にログアウト画面に遷移させるハンドラー +app.add_exception_handler(status.HTTP_401_UNAUTHORIZED, http_exception_handler) +app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) + +# サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 +app.add_exception_handler(UnexpectedException, http_exception_handler) + +# サーバー起動・終了イベントを登録 +app.add_event_handler('startup', tasks.create_start_app_handler(app)) +app.add_event_handler('shutdown', tasks.create_stop_app_handler(app)) diff --git a/ecs/jskult-webapp/src/model/__init__.py b/ecs/jskult-webapp/src/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/db/__init__.py b/ecs/jskult-webapp/src/model/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/db/base_db_model.py b/ecs/jskult-webapp/src/model/db/base_db_model.py new file mode 100644 index 00000000..0f817d91 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/base_db_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class BaseDBModel(BaseModel): + pass diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py new file mode 100644 index 00000000..92288443 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -0,0 +1,74 @@ +from datetime import date, datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class BioSalesViewModel(BaseDBModel): + conv_cd: Optional[int] + rec_data: Optional[str] + rec_whs_cd: Optional[str] + rec_whs_sub_cd: Optional[str] + rec_whs_org_cd: Optional[str] + rec_cust_cd: Optional[str] + rec_comm_cd: Optional[str] + rec_tran_kbn: Optional[str] + rev_hsdnymd_wrk: Optional[str] + rev_hsdnymd_srk: Optional[str] + rec_urag_no: Optional[str] + rec_comm_nm: Optional[str] + rec_nnskfcl_nm: Optional[str] + rec_nnsk_fcl_addr: Optional[str] + rec_lot_num: Optional[str] + rec_amt: Optional[str] + rec_ymd: Optional[str] + sale_data_cat: Optional[str] + slip_file_nm: Optional[str] + slip_mgt_no: Optional[str] + row_num: Optional[int] + hsdn_ymd: Optional[str] + exec_dt: Optional[str] + v_tran_cd: Optional[int] + tran_kbn_nm: Optional[str] + whs_org_cd: Optional[str] + v_whsorg_cd: Optional[str] + whs_org_nm: Optional[str] + whs_org_kn: Optional[str] + v_whs_cd: Optional[int] + whs_nm: Optional[str] + nnsk_cd: Optional[str] + v_inst_cd: Optional[str] + v_inst_kn: Optional[str] + v_inst_nm: Optional[str] + v_inst_addr: Optional[str] + comm_cd: Optional[str] + comm_nm: Optional[str] + whs_rep_comm_nm: Optional[str] + whs_rep_nnskfcl_nm: Optional[str] + whs_rep_nnsk_fcl_addr: Optional[str] + mkr_inf_1: Optional[str] + mkr_cd: Optional[str] + htdnymd_err_kbn: Optional[str] + prd_exis_kbn: Optional[str] + fcl_exis_kbn: Optional[str] + amt: Optional[int] + slip_org_kbn: Optional[str] + bef_slip_mgt_no: Optional[str] + lot_no_err_flg: Optional[str] + iko_flg: Optional[str] + kjyo_ym: Optional[str] + tksnbk_kbn: Optional[str] + fcl_exec_kbn: Optional[str] + rec_sts_kbn: Optional[str] + ins_dt: Optional[datetime] + ins_usr: Optional[str] + dcf_inst_cd: Optional[str] + inst_cd: Optional[str] + inst_name_form: Optional[str] + address: Optional[str] + tel_no: Optional[str] + data_kbn: Optional[str] + ser_no: Optional[str] + lot_num: Optional[str] + expr_dt: Optional[date] + amt_fugo: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/hdke_tbl.py b/ecs/jskult-webapp/src/model/db/hdke_tbl.py new file mode 100644 index 00000000..920cb2e3 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/hdke_tbl.py @@ -0,0 +1,8 @@ +from datetime import datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class HdkeTblModel(BaseDBModel): + bch_actf: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py new file mode 100644 index 00000000..e26f4381 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -0,0 +1,5 @@ +from src.model.db.base_db_model import BaseDBModel + + +class PharmacyProductMasterModel(BaseDBModel): + mkr_cd_nm: str diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py new file mode 100644 index 00000000..5b55c014 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -0,0 +1,36 @@ +from datetime import datetime +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class UserMasterModel(BaseDBModel): + user_id: Optional[str] + mail_adr: Optional[str] + user_nm: Optional[str] + auth_flg1: Optional[str] + auth_flg2: Optional[str] + auth_flg3: Optional[str] + auth_flg4: Optional[str] + auth_flg5: Optional[str] + auth_flg6: Optional[str] + auth_flg7: Optional[str] + auth_flg8: Optional[str] + auth_flg9: Optional[str] + auth_flg10: Optional[str] + pwd: Optional[str] + enabled_flg: Optional[str] + creater: Optional[str] + create_date: Optional[datetime] + updater: Optional[str] + update_date: Optional[datetime] + mntuser_flg: Optional[str] + + def is_enable_user(self): + return self.enabled_flg == 'Y' + + def is_maintenance_user(self): + return self.mntuser_flg == '1' + + def is_groupware_user(self): + return self.mntuser_flg == '0' diff --git a/ecs/jskult-webapp/src/model/db/wholesaler_master.py b/ecs/jskult-webapp/src/model/db/wholesaler_master.py new file mode 100644 index 00000000..90cccc3f --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/wholesaler_master.py @@ -0,0 +1,8 @@ +from src.model.db.base_db_model import BaseDBModel + + +class WholesalerMasterModel(BaseDBModel): + rec_whs_cd: str + rec_whs_sub_cd: str + nm: str + whs_nm: str diff --git a/ecs/jskult-webapp/src/model/internal/jwt_token.py b/ecs/jskult-webapp/src/model/internal/jwt_token.py new file mode 100644 index 00000000..a10635ad --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/jwt_token.py @@ -0,0 +1,152 @@ +import base64 +import json +from typing import Optional + +import jwt +import requests +from starlette import status + +from src.error.exceptions import JWTTokenVerifyException +from src.system_var import environment + + +class JWTToken: + id_token: str + refresh_token: str + verified_jwt: Optional[dict] + + def __init__(self, id_token: str, refresh_token: str, verified_jwt: dict=None) -> None: + self.id_token = id_token + self.refresh_token = refresh_token + self.verified_jwt = verified_jwt + + @property + def verified_token(self): + if self.verified_jwt is None: + raise JWTTokenVerifyException('検証されていないトークン') + return self.verified_jwt + + @property + def user_id(self): + verified_token = self.verified_token + + user_id: str = None + identities: dict = verified_token.get('identities') + if identities is not None: + # 一般ユーザーログインによる(SSO経由) + user_id = identities[0]['userId'] + # <社員番号>@<ドメイン名>となっているため、@で分割 + user_id = user_id.split('@')[0] + else: + # メンテユーザーによるログイン + user_id = verified_token.get('cognito:username') + + return user_id + + @classmethod + def request(cls, code: str): + """JWTをリクエストし、新たなインスタンスを返す + + Args: + code (str): セキュリティコード + + Raises: + JWTTokenVerifyException: 認証失敗 + + Returns: + JWTToken: JWTTokenのモデルクラス + """ + token_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.TOKEN_ENDPOINT}' + request_params = { + 'grant_type': 'authorization_code', + 'client_id': environment.COGNITO_CLIENT_ID, + 'code': code, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') + auth_header_value = base64.b64encode(message).decode() + request_headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {auth_header_value}' + } + + res = requests.post(token_url, params=request_params, headers=request_headers) + if res.status_code != status.HTTP_200_OK: + raise JWTTokenVerifyException(res.text) + + token_response = json.loads(res.text) + + return cls(id_token=token_response['id_token'], refresh_token=token_response['refresh_token']) + + @classmethod + def refresh(cls, refresh_token: str): + """JWTをリフレッシュし、新たなインスタンスを返す + + Args: + refresh_token (str): リフレッシュトークン + + Raises: + JWTTokenVerifyException: 認証失敗 + + Returns: + JWTToken: JWTTokenのモデルクラス + """ + token_url = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.TOKEN_ENDPOINT}' + request_params = { + 'grant_type': 'refresh_token', + 'client_id': environment.COGNITO_CLIENT_ID, + 'refresh_token': refresh_token, + 'redirect_uri': environment.COGNITO_REDIRECT_URI + } + + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') + auth_header_value = base64.b64encode(message).decode() + request_headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Basic {auth_header_value}' + } + + res = requests.post(token_url, params=request_params, headers=request_headers) + if res.status_code != status.HTTP_200_OK: + raise JWTTokenVerifyException(res.text) + + token_response = json.loads(res.text) + return cls(id_token=token_response['id_token'], refresh_token=refresh_token) + + def verify_token(self): + if self.id_token is None: + raise Exception('アクセストークンがない') + + issuer = f'https://cognito-idp.{environment.AWS_REGION}.amazonaws.com/{environment.COGNITO_USER_POOL_ID}' + jwks_url = f'{issuer}/.well-known/jwks.json' + + jwks_client = jwt.PyJWKClient(jwks_url) + signing_key = jwks_client.get_signing_key_from_jwt(self.id_token) + + try: + verified_jwt = jwt.decode( + self.id_token, + signing_key.key, + algorithms=['RS256'], + audience=environment.COGNITO_CLIENT_ID, + issuer=issuer, + # Cognitoのサーバー時間とのズレにより、Issued atクレームの検証に失敗するパターンに対処する + options={'verify_iat': False} + ) + # 有効期限(exp)が切れた場合、トークンをリフレッシュする + except jwt.ExpiredSignatureError: + refreshed_jwt_token = JWTToken.refresh(self.refresh_token) + return refreshed_jwt_token.verified_token() + # 有効期限以外の検証に失敗した場合は例外とする + except jwt.InvalidTokenError as e: + raise JWTTokenVerifyException('Invalid token', e) + # IDトークンを使用していることを検証する + if verified_jwt['token_use'] != 'id': + raise JWTTokenVerifyException('Invalid `token_use` claim, should be `id`.') + + return JWTToken( + id_token=self.id_token, + refresh_token=self.refresh_token, + verified_jwt=verified_jwt + ) diff --git a/ecs/jskult-webapp/src/model/internal/session.py b/ecs/jskult-webapp/src/model/internal/session.py new file mode 100644 index 00000000..5235d0f3 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/session.py @@ -0,0 +1,53 @@ +import datetime +import uuid + +from pynamodb.attributes import NumberAttribute, UnicodeAttribute +from pynamodb.models import Model as DynamoDBTableModel + +from src.system_var import environment + + +class UserSession(DynamoDBTableModel): + class Meta: + table_name = environment.SESSION_TABLE_NAME + region = environment.AWS_REGION + session_key = UnicodeAttribute(hash_key=True) + user_id = UnicodeAttribute() + id_token = UnicodeAttribute() + doc_flg = UnicodeAttribute() + inst_flg = UnicodeAttribute() + bio_flg = UnicodeAttribute() + master_mainte_flg = UnicodeAttribute() + user_flg = UnicodeAttribute() + refresh_token = UnicodeAttribute() + csrf_token = UnicodeAttribute() + last_access_time = NumberAttribute() + record_expiration_time = NumberAttribute() + + @classmethod + def new_last_access_time(cls): + return datetime.datetime.now().timestamp() + + @classmethod + def new_record_expiration_time(cls, expire=environment.SESSION_EXPIRE_MINUTE): + last_access_time = datetime.datetime.fromtimestamp(cls.new_last_access_time()) + return (last_access_time + datetime.timedelta(minutes=expire)).timestamp() + + @classmethod + def new( + cls, user_id, id_token, refresh_token, csrf_token, doc_flg, inst_flg, bio_flg, master_mainte_flg, user_flg + ): + return cls( + session_key=str(uuid.uuid4()), + user_id=user_id, + id_token=id_token, + refresh_token=refresh_token, + csrf_token=csrf_token, + doc_flg=doc_flg, + inst_flg=inst_flg, + bio_flg=bio_flg, + master_mainte_flg=master_mainte_flg, + user_flg=user_flg, + last_access_time=cls.new_last_access_time(), + record_expiration_time=cls.new_record_expiration_time() + ) diff --git a/ecs/jskult-webapp/src/model/request/__init__.py b/ecs/jskult-webapp/src/model/request/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/request/bio.py b/ecs/jskult-webapp/src/model/request/bio.py new file mode 100644 index 00000000..a32bb2f2 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/bio.py @@ -0,0 +1,137 @@ +from typing import Optional + +from fastapi import Body, Form +from pydantic import BaseModel + +from src.util.sanitize import sanitize +from src.util.string_util import is_not_empty + + +@sanitize +class BioModel(BaseModel): + wholesaler_code: Optional[str] + wholesaler_sub_code: Optional[str] + wholesaler_name: Optional[str] + org_kbn: Optional[str] + rec_ymd_from: Optional[str] + rec_ymd_to: Optional[str] + rec_lot_num: Optional[str] + data_kbn: Optional[str] + maker_cd: Optional[str] + rev_hsdnymd_srk_from: Optional[str] + rev_hsdnymd_srk_to: Optional[str] + ikoFlg: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_wholesaler: str = Form(None), + ctrl_org_kbn: str = Form(None), + ctrl_rec_ymd_from: str = Form(None), + ctrl_rec_ymd_to: str = Form(None), + ctrl_rec_lot_num: str = Form(None), + ctrl_data_kbn: str = Form(None), + ctrl_maker_cd: str = Form(None), + ctrl_rev_hsdnymd_srk_from: str = Form(None), + ctrl_rev_hsdnymd_srk_to: str = Form(None), + ikoFlg: str = Form(None) + ): + + return cls.__convert_request_param( + cls, + ctrl_wholesaler, + ctrl_org_kbn, + ctrl_rec_ymd_from, + ctrl_rec_ymd_to, + ctrl_rec_lot_num, + ctrl_data_kbn, + ctrl_maker_cd, + ctrl_rev_hsdnymd_srk_from, + ctrl_rev_hsdnymd_srk_to, + ikoFlg + ) + + @classmethod + def as_body( + cls, + ctrl_wholesaler: str = Body(None), + ctrl_org_kbn: str = Body(None), + ctrl_rec_ymd_from: str = Body(None), + ctrl_rec_ymd_to: str = Body(None), + ctrl_rec_lot_num: str = Body(None), + ctrl_data_kbn: str = Body(None), + ctrl_maker_cd: str = Body(None), + ctrl_rev_hsdnymd_srk_from: str = Body(None), + ctrl_rev_hsdnymd_srk_to: str = Body(None), + ikoFlg: str = Body(None) + ): + + return cls.__convert_request_param( + cls, + ctrl_wholesaler, + ctrl_org_kbn, + ctrl_rec_ymd_from, + ctrl_rec_ymd_to, + ctrl_rec_lot_num, + ctrl_data_kbn, + ctrl_maker_cd, + ctrl_rev_hsdnymd_srk_from, + ctrl_rev_hsdnymd_srk_to, + ikoFlg + ) + + + def __convert_request_param( + cls, + ctrl_wholesaler: str, + ctrl_org_kbn: str, + ctrl_rec_ymd_from: str, + ctrl_rec_ymd_to: str, + ctrl_rec_lot_num: str, + ctrl_data_kbn: str, + ctrl_maker_cd: str, + ctrl_rev_hsdnymd_srk_from: str, + ctrl_rev_hsdnymd_srk_to: str, + ikoFlg: str + ): + wholesaler_code = None + wholesaler_sub_code = None + wholesaler_name = None + # 卸コード・卸サブコード + if is_not_empty(ctrl_wholesaler): + # 卸コードは`020-01:卸名`という感じのデータで来るので、分割 + wholesaler_without_name = ctrl_wholesaler.split(':')[0] + wholesaler_name = ctrl_wholesaler.split(':')[1] + wholesaler_code = wholesaler_without_name.split('-')[0] + wholesaler_sub_code = wholesaler_without_name.split('-')[1] + + # 処理日 + rec_ymd_from = None + rec_ymd_to = None + if is_not_empty(ctrl_rec_ymd_from): + rec_ymd_from = ctrl_rec_ymd_from.replace('/', '') + if is_not_empty(ctrl_rec_ymd_to): + rec_ymd_to = ctrl_rec_ymd_to.replace('/', '') + + # 発伝年月日 + rev_hsdnymd_srk_from = None + rev_hsdnymd_srk_to = None + if is_not_empty(ctrl_rev_hsdnymd_srk_from): + rev_hsdnymd_srk_from = ctrl_rev_hsdnymd_srk_from.replace('/', '') + if is_not_empty(ctrl_rev_hsdnymd_srk_to): + rev_hsdnymd_srk_to = ctrl_rev_hsdnymd_srk_to.replace('/', '') + + return cls( + wholesaler_code=wholesaler_code, + wholesaler_sub_code=wholesaler_sub_code, + wholesaler_name=wholesaler_name, + org_kbn=ctrl_org_kbn, + rec_ymd_from=rec_ymd_from, + rec_ymd_to=rec_ymd_to, + rec_lot_num=ctrl_rec_lot_num, + data_kbn=ctrl_data_kbn, + maker_cd=ctrl_maker_cd, + rev_hsdnymd_srk_from=rev_hsdnymd_srk_from, + rev_hsdnymd_srk_to=rev_hsdnymd_srk_to, + ikoFlg=ikoFlg + ) \ No newline at end of file diff --git a/ecs/jskult-webapp/src/model/request/bio_download.py b/ecs/jskult-webapp/src/model/request/bio_download.py new file mode 100644 index 00000000..8b4b5ae9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/bio_download.py @@ -0,0 +1,20 @@ +from typing import Optional + +from fastapi import Body +from pydantic import BaseModel + + +class BioDownloadModel(BaseModel): + user_id: str + kind: str + + @classmethod + def as_body( + cls, + user_id: str = Body(), + kind: str = Body() + ): + return cls( + user_id=user_id, + kind=kind + ) diff --git a/ecs/jskult-webapp/src/model/request/login.py b/ecs/jskult-webapp/src/model/request/login.py new file mode 100644 index 00000000..f0c431ab --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/login.py @@ -0,0 +1,15 @@ +from fastapi import Form +from pydantic import BaseModel + + +class LoginModel(BaseModel): + username: str + password: str + + @classmethod + def as_form( + cls, + ctrl_username: str = Form(), + ctrl_password: str = Form() + ): + return cls(username=ctrl_username, password=ctrl_password) diff --git a/ecs/jskult-webapp/src/model/view/__init__.py b/ecs/jskult-webapp/src/model/view/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py new file mode 100644 index 00000000..0f1a11fd --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -0,0 +1,19 @@ +from src.model.db.bio_sales_view import BioSalesViewModel +from src.system_var import constants +from src.util.sanitize import sanitize + + +@sanitize +class BisDisplayModel(BioSalesViewModel): + def __init__(self, param: BioSalesViewModel) -> None: + super().__init__(**param.dict()) + + # 区分・フラグの正式名称を設定 + self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) + self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) + self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) + + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + if (self.bef_slip_mgt_no is None): + self.ins_dt = "" + self.ins_usr = "" diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py new file mode 100644 index 00000000..0657bd3c --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -0,0 +1,137 @@ +import json +from collections import OrderedDict +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.pharmacy_product_master import PharmacyProductMasterModel +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.system_var import environment + + +class BioViewModel(BaseModel): + subtitle: str = '生物由来検索一覧' + user_id: Optional[str] + batch_status: Optional[str] + whs_models: list[WholesalerMasterModel] + phm_models: list[PharmacyProductMasterModel] + bio_data: Optional[list[BisDisplayModel]] = [] + form_data: Optional[BioModel] + + def display_wholesaler_names(self): + display_names = [ + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' + for whs_model in self.whs_models + ] + return display_names + + def display_org_kbn(self): + return OrderedDict( + { + '': '', + 'J': 'JD-NET', + 'N': 'NHI', + 'H': '手入力' + } + ) + + def display_data_kbn(self): + return OrderedDict( + { + '' : '', + '0': '正常', + '1': 'ロットエラー', + '3': 'ロット不明', + '9': 'エラー(解消済)', + '2': '除外' + } + ) + + def bio_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.bio_data], ensure_ascii=False, default=date_handler) + + def is_selected_whs_name(self, selected_wholesaler): + if not self.is_form_submitted(): + return '' + + form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' + return self._selected_value(form_wholesaler_full_name, selected_wholesaler) + + def is_selected_org_kbn(self, selected_org_kbn): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.org_kbn, selected_org_kbn) + + def is_input_rec_ymd_from(self): + if not self.is_form_submitted(): + return '' + + return self._format_date_string(self.form_data.rec_ymd_from) + + def is_input_rec_ymd_to(self): + if not self.is_form_submitted(): + return '' + + return self._format_date_string(self.form_data.rec_ymd_to) + + def is_input_lot_num(self): + if not self.is_form_submitted(): + return '' + + return self.form_data.rec_lot_num or '' + + def is_selected_data_kbn(self, selected_data_kbn): + if not self.is_form_submitted(): + return '' + + return self._selected_value(self.form_data.data_kbn, selected_data_kbn) + + def is_selected_maker_cd(self, selected_maker_cd): + if not self.is_form_submitted(): + return '' + + return self._selected_value(self.form_data.maker_cd, selected_maker_cd) + + def is_input_rev_hsdnymd_srk_from(self): + if not self.is_form_submitted(): + return '' + + return self._format_date_string(self.form_data.rev_hsdnymd_srk_from) + + def is_input_rev_hsdnymd_srk_to(self): + if not self.is_form_submitted(): + return '' + + return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) + + def is_checked_iko_flg(self): + if not self.is_form_submitted(): + return '' + + return 'checked' if self.form_data.ikoFlg else '' + + 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.bio_data) == 0 + + def is_data_overflow_max_length(self): + return len(self.bio_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT + + def _format_date_string(self, date_string): + if date_string is None: + return '' + date = datetime.strptime(date_string, '%Y%m%d') + return date.strftime('%Y/%m/%d') + + 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/logout_view_model.py b/ecs/jskult-webapp/src/model/view/logout_view_model.py new file mode 100644 index 00000000..b219918a --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/logout_view_model.py @@ -0,0 +1,10 @@ +from typing import Optional + +from pydantic import BaseModel + + +class LogoutViewModel(BaseModel): + subtitle: str = 'MeDaCA Logout' + redirect_to: Optional[str] + reason: Optional[str] + link_text:Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py b/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py new file mode 100644 index 00000000..6d4f9108 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/mainte_login_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class MainteLoginViewModel(BaseModel): + subtitle: str = 'MeDaCA Mainte Login' diff --git a/ecs/jskult-webapp/src/model/view/menu_view_model.py b/ecs/jskult-webapp/src/model/view/menu_view_model.py new file mode 100644 index 00000000..647bdec9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/menu_view_model.py @@ -0,0 +1,26 @@ +from typing import Optional + +from pydantic import BaseModel + +from src.model.view.user_view_model import UserViewModel + + +class MenuViewModel(BaseModel): + subtitle: str = 'MeDaCA 機能メニュー' + batch_status: Optional[str] + user_model: UserViewModel + + def is_batch_processing(self): + return self.batch_status == '1' + + def is_available_ult_doctor_menu(self): + return self.user_model.has_ult_doctor_permission() + + def is_available_ult_inst_menu(self): + return self.user_model.has_ult_inst_permission() + + def is_available_bio_menu(self): + return self.user_model.has_bio_permission() + + def is_available_master_maintenance_menu(self): + return self.user_model.has_master_maintenance_permission() diff --git a/ecs/jskult-webapp/src/model/view/user_view_model.py b/ecs/jskult-webapp/src/model/view/user_view_model.py new file mode 100644 index 00000000..7d36fba2 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/user_view_model.py @@ -0,0 +1,26 @@ +from typing import Optional + +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 + user_flg: Optional[str] # MNTUSER_FLG + + def has_ult_doctor_permission(self): + return self.doc_flg == '1' + + def has_ult_inst_permission(self): + return self.inst_flg == '1' + + def has_bio_permission(self): + return self.bio_flg == '1' + + def has_master_maintenance_permission(self): + return self.master_mainte_flg == '1' + + def is_maintenance_user(self): + return self.user_flg == '1' diff --git a/ecs/jskult-webapp/src/repositories/__init__.py b/ecs/jskult-webapp/src/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/repositories/base_repository.py b/ecs/jskult-webapp/src/repositories/base_repository.py new file mode 100644 index 00000000..bb15148f --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/base_repository.py @@ -0,0 +1,43 @@ +from abc import ABCMeta + +import pandas as pd +from sqlalchemy import text + +from src.db.database import Database +from src.model.db.base_db_model import BaseDBModel + + +class BaseRepository(metaclass=ABCMeta): + + _database: Database + def __init__(self, db: Database) -> None: + self._database = db + + def fetch_all(self) -> list[BaseDBModel]: + """データ全件取得メソッド""" + pass + + def fetch_one(self, parameter: dict) -> BaseDBModel: + """データ1件取得メソッド""" + pass + + def fetch_many(self, parameter: dict) -> list[BaseDBModel]: + """条件付きデータ取得メソッド""" + pass + + def fetch_as_data_frame(self, parameter: dict) -> pd.DataFrame: + pass + + + def _to_data_frame(self, query, parameter: BaseDBModel): + params = params=parameter.dict() + + sql_query = pd.read_sql( + text(query), + con=self._database.connection, + params=params) + df = pd.DataFrame( + sql_query, + index=None + ) + return df diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py new file mode 100644 index 00000000..73667cc4 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -0,0 +1,116 @@ +from src.db import sql_condition as condition +from src.db.sql_condition import SQLCondition +from src.model.db.bio_sales_view import BioSalesViewModel +from src.model.request.bio import BioModel +from src.repositories.base_repository import BaseRepository +from src.util.string_util import is_not_empty + + +class BioSalesViewRepository(BaseRepository): + FETCH_SQL = """\ + SELECT + ( + CASE + WHEN LEFT(bs.v_tran_cd, 1) = 2 + AND bs.amt >= 1 THEN CONCAT('-', bs.amt) + ELSE bs.amt + END + ) AS amt_fugo, + bs.*, + ln.ser_no, + ln.lot_num, + ln.expr_dt + FROM + src05.bio_sales_view bs + LEFT OUTER JOIN + src05.lot_num_mst ln + ON bs.mkr_cd = ln.ser_no + AND bs.rec_lot_num = ln.lot_num + WHERE + {where_clause} + ORDER BY + bs.rec_whs_cd, + bs.rec_whs_sub_cd, + bs.rev_hsdnymd_srk, + bs.slip_mgt_no + ASC\ + """ + + def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: + try: + where_clause = self.__build_condition(parameter) + # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); + # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); + query = self.FETCH_SQL.format(where_clause=where_clause) + # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); + result = self._database.execute_query(query, parameter.dict()) + models = [BioSalesViewModel(**r) for r in result] + # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + + def fetch_as_data_frame(self, parameter: BioModel): + try: + where_clause = self.__build_condition(parameter) + # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); + # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); + query = self.FETCH_SQL.format(where_clause=where_clause) + # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); + # result = self._database.execute_query(query, parameter.dict()) + # models = [BioSalesViewModel(**r) for r in result] + # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); + df = self._to_data_frame(query, parameter) + return df + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + + def __build_condition(self, parameter: BioModel): + where_clauses: list[SQLCondition] = [] + + # 卸(コード/サブコード) + if is_not_empty(parameter.wholesaler_code) and is_not_empty(parameter.wholesaler_sub_code): + where_clauses.append(SQLCondition('rec_whs_cd', condition.EQ, 'wholesaler_code')) + where_clauses.append(SQLCondition('rec_whs_sub_cd', condition.EQ, 'wholesaler_sub_code')) + # データ種別 + if is_not_empty(parameter.org_kbn): + where_clauses.append(SQLCondition('slip_org_kbn', condition.EQ, 'org_kbn')) + # 処理日 開始日 + if is_not_empty(parameter.rec_ymd_from): + where_clauses.append(SQLCondition('rec_ymd', condition.GE, 'rec_ymd_from')) + # 処理日 終了日 + if is_not_empty(parameter.rec_ymd_to): + where_clauses.append(SQLCondition('rec_ymd', condition.LE, 'rec_ymd_to')) + # ロット番号 + if is_not_empty(parameter.rec_lot_num): + rec_lot_num = parameter.rec_lot_num + # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 + rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ + where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) + # データ区分 + if is_not_empty(parameter.data_kbn): + where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn')) + # 製品 + if is_not_empty(parameter.maker_cd): + where_clauses.append(SQLCondition('mkr_cd', condition.EQ, 'maker_cd')) + # 発伝年月日 開始日 + if is_not_empty(parameter.rev_hsdnymd_srk_from): + where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.GE, 'rev_hsdnymd_srk_from')) + # 発伝年月日 終了日 + if is_not_empty(parameter.rev_hsdnymd_srk_to): + where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.LE, 'rev_hsdnymd_srk_to')) + # 移行フラグ + # チェックが入っていない場合、移行対象(IKO_FLG = '*')を省く + if parameter.ikoFlg is None: + where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True)) + # 固定条件 + # Viewで返されるロット番号9件をNull以外で抽出 + where_clauses.append(SQLCondition('LENGTH(TRIM(rec_lot_num))', condition.GT, '0', literal=True)) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + # error_log(date("Y/m/d H:i:s") . " [INFO] 条件設定終了:" . $szConditions . "\r\n", 3, "$execLog"); + return where_clauses_str diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py new file mode 100644 index 00000000..586000e6 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -0,0 +1,18 @@ +from src.model.db.hdke_tbl import HdkeTblModel +from src.model.request.bio import BioModel +from src.repositories.base_repository import BaseRepository + + +class HdkeTblRepository(BaseRepository): + FETCH_SQL = "SELECT bch_actf FROM src05.hdke_tbl" + + def fetch_all(self) -> list[HdkeTblModel]: + try: + query = self.FETCH_SQL + result = self._database.execute_query(query) + models = [HdkeTblModel(**r) for r in result] + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py new file mode 100644 index 00000000..bfcbe286 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -0,0 +1,36 @@ +from src.model.db.pharmacy_product_master import PharmacyProductMasterModel +from src.repositories.base_repository import BaseRepository + + +class PharmacyProductMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + CONCAT(IFNULL(mkr_cd, ''), ' ', IFNULL(mkr_inf_1, '')) AS mkr_cd_nm + FROM + src05.phm_prd_mst_v t1 + INNER JOIN + ( + SELECT + prd_cd,MAX(sub_no) AS sno + FROM + src05.phm_prd_mst_v + WHERE rec_sts_kbn <> '9' + GROUP BY prd_cd + ) fmv2 + ON t1.prd_cd = fmv2.prd_cd AND t1.sub_no = fmv2.sno + WHERE + mkr_cd IS NOT NULL + ORDER BY mkr_cd + """ + + def fetch_all(self) -> list[PharmacyProductMasterModel]: + try: + result = self._database.execute_query(self.FETCH_SQL) + models = [PharmacyProductMasterModel(**r) for r in result] + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] getOroshiData DB Error. ") + print(f"[ERROR] ErrorMessage: {e.args}") + raise e diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py new file mode 100644 index 00000000..788a6172 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -0,0 +1,27 @@ +from src.model.db.user_master import UserMasterModel +from src.model.request.bio import BioModel +from src.repositories.base_repository import BaseRepository + + +class UserMasterRepository(BaseRepository): + FETCH_SQL = """\ + SELECT + * + FROM + src05.user_mst + WHERE + LOWER(user_id) = LOWER(:user_id)\ + """ + + def fetch_one(self, parameter: dict) -> UserMasterModel: + try: + query = self.FETCH_SQL + result = self._database.execute_query(query, parameter) + models = [UserMasterModel(**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 diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py new file mode 100644 index 00000000..b472fac5 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -0,0 +1,35 @@ +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.repositories.base_repository import BaseRepository + + +class WholesalerMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT DISTINCT + b.rec_whs_cd, + b.rec_whs_sub_cd, + v2.nm, + b.whs_nm + FROM src05.bio_sales b + LEFT OUTER JOIN + ( + SELECT sub_no, nm, v_whs_cd, rec_sts_kbn + FROM src05.whs_mst_v + WHERE (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM src05.hdke_tbl) BETWEEN start_date AND end_date + ) v2 + ON b.v_whs_cd = v2.v_whs_cd + AND v2.rec_sts_kbn <> '9' + ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_nm DESC + """ + + def fetch_all(self) -> list[WholesalerMasterModel]: + try: + result = self._database.execute_query(self.FETCH_SQL) + result_data = [res for res in result] + models = [WholesalerMasterModel(**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 diff --git a/ecs/jskult-webapp/src/router/__init__.py b/ecs/jskult-webapp/src/router/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py new file mode 100644 index 00000000..7a4ada09 --- /dev/null +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -0,0 +1,125 @@ +import logging +from typing import Callable + +from fastapi import Request, Response +from fastapi.exceptions import HTTPException +from fastapi.routing import APIRoute +from starlette import status + +from src.depends.auth import (check_session_expired, get_current_session, + verify_session) +from src.error.exceptions import UnexpectedException +from src.system_var import constants, environment + +logger = logging.getLogger('uvicorn') + +class MeDaCaRoute(APIRoute): + """アプリケーションのカスタムルーター + + Args: + APIRoute (APIRoute): FastAPIの標準APIRoute + """ + def get_route_handler(self) -> Callable: + """前後処理を付加するルートハンドラーを返す + + Raises: + e: HTTPException + UnexpectedException: HTTPException以外の例外をカスタム例外にする + + Returns: + Callable: カスタムルートハンドラー + """ + original_route_handler = super().get_route_handler() + + # 返却するルートハンドラーを定義。必ず非同期関数にする必要がある。 + async def custom_route_handler(request: Request) -> Response: + try: + logger.info('pre routing process') + # 事前処理 + request = await self.pre_process_route(request) + # 本来のルーティング処理 + logger.info('routing process') + response = await original_route_handler(request) + # 事後処理 + logger.info('post routing process') + return await self.post_process_route(request, response) + except HTTPException as e: + raise e + except Exception as e: + logger.exception(e) + raise UnexpectedException(detail=constants.LOGOUT_REASON_UNEXPECTED) + return custom_route_handler + + async def pre_process_route(self, request: Request) -> Request: + """ルートハンドラーの事前処理 + + Args: + request (Request): FastAPIのリクエストクラス + + Returns: + Request: 加工後のRequestインスタンス + """ + return request + async def post_process_route(self, request: Request, response: Response) -> Response: + """ルートハンドラーの事後処理 + + Args: + request (Request): FastAPIのリクエストインスタンス + response (Response): FastAPIのレスポンスインスタンス(original_route_handlerのレスポンス) + Returns: + Response: 加工後のResponseインスタンス + """ + return response + +class BeforeCheckSessionRoute(MeDaCaRoute): + """事前処理として、セッションチェックを行うルートハンドラー + + Args: + MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + """ + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + # セッションを取得 + session_key = request.cookies.get('session') + current_session = get_current_session(session_key) + checked_session = check_session_expired(current_session) + verified_session = verify_session(checked_session) + # セッションが有効でない場合、エラーにする + if verified_session is None: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) + scope = request.scope + scope['session'] = verified_session + session_request = Request(receive=request.receive, scope=scope) + return session_request + +class AfterSetCookieSessionRoute(MeDaCaRoute): + """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー + + Args: + MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + """ + async def post_process_route(self, request: Request, response: Response): + response = await super().post_process_route(request, response) + session_key = response.headers.get('session_key', None) + # セッションキーがない場合はセットせずに返す + if session_key is None: + return response + + del response.headers['session_key'] + # クッキーにセッションを設定 + response.set_cookie( + key='session', + value=session_key, + max_age=environment.SESSION_EXPIRE_MINUTE * 60, # cookieの有効期限は秒数指定なので、60秒をかける + secure=True, + httponly=True + ) + return response + +class AuthenticatedRoute(BeforeCheckSessionRoute, AfterSetCookieSessionRoute): + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + return request + async def post_process_route(self, request: Request, response: Response): + response = await super().post_process_route(request, response) + return response diff --git a/ecs/jskult-webapp/src/services/__init__.py b/ecs/jskult-webapp/src/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/services/base_service.py b/ecs/jskult-webapp/src/services/base_service.py new file mode 100644 index 00000000..a2669225 --- /dev/null +++ b/ecs/jskult-webapp/src/services/base_service.py @@ -0,0 +1,13 @@ +from abc import ABCMeta + +from src.aws.aws_api_client import AWSAPIClient +from src.repositories.base_repository import BaseRepository + + +class BaseService(metaclass=ABCMeta): + # 各サービスが依存するrepositoryクラスのマップ + REPOSITORIES: dict[str, BaseRepository] = {} + # 各サービスが依存するAWS APIクライアントクラスのマップ + CLIENTS: dict[str, AWSAPIClient] = {} + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + pass diff --git a/ecs/jskult-webapp/src/services/batch_status_service.py b/ecs/jskult-webapp/src/services/batch_status_service.py new file mode 100644 index 00000000..e30f0bed --- /dev/null +++ b/ecs/jskult-webapp/src/services/batch_status_service.py @@ -0,0 +1,41 @@ +from src.aws.aws_api_client import AWSAPIClient +from src.error.exceptions import DBException +from src.model.db.hdke_tbl import HdkeTblModel +from src.repositories.base_repository import BaseRepository +from src.repositories.hdke_tbl_repository import HdkeTblRepository +from src.services.base_service import BaseService + + +class BatchStatusService(BaseService): + + REPOSITORIES = { + 'hdke_table_repository': HdkeTblRepository + } + hdke_table_repository: HdkeTblRepository + __hdke_table_record: list[HdkeTblModel] = [] + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.hdke_table_repository = repositories['hdke_table_repository'] + # サービスインスタンス生成時に日付テーブルを取得する。取得できない場合は例外とする + try: + self.__hdke_table_record = self.hdke_table_repository.fetch_all() + except Exception as e: + raise DBException(e) + + @property + def hdke_table_record(self) -> HdkeTblModel: + # 日付マスタのレコードがあることを確認 + self.__assert_record_exists() + # 日付テーブルのレコードは必ず1件 + return self.__hdke_table_record[0] + + def is_batch_processing(self): + # 日付マスタのレコードがあることを確認 + self.__assert_record_exists() + return self.hdke_table_record.bch_actf == '1' # TODO: 定数化する + + def __assert_record_exists(self): + # 日付マスタのレコードがない場合は例外とする + if len(self.__hdke_table_record) == 0: + raise DBException('日付テーブルのレコードが存在しません') + diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py new file mode 100644 index 00000000..c1c2f5c1 --- /dev/null +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -0,0 +1,119 @@ +import os.path as path +import shutil +from datetime import datetime + +import pandas as pd + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.model.view.bio_view_model import BioViewModel +from src.repositories.base_repository import BaseRepository +from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.pharmacy_product_master_repository import \ + PharmacyProductMasterRepository +from src.repositories.wholesaler_master_repository import \ + WholesalerMasterRepository +from src.services.base_service import BaseService +from src.system_var import constants, environment + + +class BioViewService(BaseService): + REPOSITORIES = { + 'whs_repository': WholesalerMasterRepository, + 'phm_repository': PharmacyProductMasterRepository, + 'bio_sales_repository': BioSalesViewRepository + } + + CLIENTS = { + 's3_client': S3Client + } + + whs_repository: WholesalerMasterRepository + phm_repository: PharmacyProductMasterRepository + bio_sales_repository: BioSalesViewRepository + s3_client: S3Client + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.whs_repository = repositories['whs_repository'] + self.phm_repository = repositories['phm_repository'] + self.bio_sales_repository = repositories['bio_sales_repository'] + self.s3_client = clients['s3_client'] + + def prepare_bio_view( + self, + session: UserSession + ) ->BioViewModel: + # 卸リストを取得 + wholesalers = self.whs_repository.fetch_all() + # 製品リストを取得 + products = self.phm_repository.fetch_all() + bio = BioViewModel( + whs_models=wholesalers, + phm_models=products, + user_id=session.user_id + ) + return bio + + def search_bio_data(self, search_params: BioModel): + # 生物由来データを検索 + bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params) + # 画面表示用に加工 + display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data] + + return display_bio_data + + def search_download_bio_data(self, search_params: BioModel): + # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 + bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) + return bio_sales_data_frame + + def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): + # Excelに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id.upper()}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + + # テンプレートファイルをコピーして出力ファイルの枠だけを作る + shutil.copyfile( + src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, + dst=output_file_path + ) + # ExcelWriterの追記モード(`mode`='a')でファイルを開く + # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) + # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する + with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: + # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 + # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 + # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 + data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) + + return output_file_path + + def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): + # csvに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id.upper()}_{timestamp:%Y%m%d%H%M%S%f}.csv') + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + output_df.to_csv(output_file_path, index=False, header=False) + + return output_file_path + + def upload_bio_data_file(self, local_file_path: str) -> None: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key =f'bio/{path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + def generate_download_file_url(self, local_file_path:str, user_id: str, kind: str) -> str: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key = f'bio/{path.basename(local_file_path)}' + download_filename = f'{user_id.upper()}_生物由来卸販売データ.{kind}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py new file mode 100644 index 00000000..6442c82a --- /dev/null +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -0,0 +1,57 @@ +import base64 +import hashlib +import hmac + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.cognito import CognitoClient +from src.error.exceptions import NotAuthorizeException +from src.model.db.user_master import UserMasterModel +from src.model.internal.jwt_token import JWTToken +from src.repositories.base_repository import BaseRepository +from src.repositories.user_master_repository import UserMasterRepository +from src.services.base_service import BaseService +from src.system_var import environment + + +class LoginService(BaseService): + REPOSITORIES = { + 'user_repository': UserMasterRepository + } + + CLIENTS = { + 'cognito_client': CognitoClient + } + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.user_repository = repositories['user_repository'] + self.cognito_client = clients['cognito_client'] + + def login(self, username: str, password: str) -> JWTToken: + try: + id_token, refresh_token = self.cognito_client.login_by_user_password_flow( + username, + password, + self.__secret_hash(username) + ) + except Exception as e: + if e.response['Error']['Code'] == 'NotAuthorizedException': + raise NotAuthorizeException(e) + else: + raise e + + return JWTToken(id_token, refresh_token) + + def login_with_security_code(self, code: str) -> JWTToken: + return JWTToken.request(code) + + def logged_in_user(self, user_id): + user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) + return user_record + + def __secret_hash(self, username: str): + # see - https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/ # noqa + message = bytes(username + environment.COGNITO_CLIENT_ID, 'utf-8') + key = bytes(environment.COGNITO_CLIENT_SECRET, 'utf-8') + digest = hmac.new(key, message, digestmod=hashlib.sha256).digest() + return base64.b64encode(digest).decode() diff --git a/ecs/jskult-webapp/src/services/session_service.py b/ecs/jskult-webapp/src/services/session_service.py new file mode 100644 index 00000000..92a7a193 --- /dev/null +++ b/ecs/jskult-webapp/src/services/session_service.py @@ -0,0 +1,15 @@ + +from src.model.internal.session import UserSession + + +def set_session(session: UserSession) -> str: + session.save() + return session.session_key + +def get_session(key: str) -> UserSession: + try: + session = UserSession.get(hash_key=key, consistent_read=True) + return session + except UserSession.DoesNotExist as e: + print(e) + return None diff --git a/ecs/jskult-webapp/src/static/__init__.py b/ecs/jskult-webapp/src/static/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css new file mode 100644 index 00000000..8bc72999 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -0,0 +1,291 @@ +body { + white-space: nowrap; + background-color: LightCyan; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; +} + +h1 { + font-size: 155%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; +} + +.title { + width: 800px; +} + +table{ + border-collapse : collapse; +} + +.search_table { + margin-bottom: 30px; + padding-bottom: 15px; + border-bottom: solid 1px gray; + width: 1132px; +} + +._form { + width: 1132px; + margin-left: 10px; + margin-right: 20px; +} + +.back_bt { + padding-bottom: 10px; +} + +._form input[type=text] { + width: 193px; + height: 25px; +} +._form input[type=checkbox] { + width: 13px; + height: 13px; +} + +._form select { + width: 193px; + height: 25px; +} + +.result_info { + text-align: right; +} + + +.search_tb { + padding-right: 25px; +} + +.search_bt { + /* width: 60px; */ + margin-left: 10px; +} + +.clear_bt{ + margin-left: 120px; + /* width: 60px */ +} + +.search_dropdown { + width: 175px; +} + +.bioScroll_div { + overflow: auto; + padding-top: 10px; + height: 250px; + width: 1132px; +} + +.noLine{ + text-decoration: none; +} + +.resultAreaMsg { + margin-top: 5%; + text-align: center; + font-size: 150%; +} + +.search_btTd { + text-align: right; +} + +.selection { + display: none; +} + +#page-1 { + display: block; +} + +.search_middleTd { + padding-right: 25px; + width : 450px; +} + +.docSearchScroll_div { + overflow: auto; + height: 200px; + width: 1132px; +} + +.transition{ + text-align: right; + margin-right: 60px; +} + +.transition_bt{ + width: 110px; + height: 40px; + margin-left: 15px; + margin-right: 15px; +} + +.instutionInfo_table{ + width: 1132px; + margin-bottom: 50px; +} + +.institution_column { + width : 160px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.institution_data { + background : rgb(244, 244, 244); + border : solid 1px; + padding-left : 0.5em; + padding-right : 0.5em; +} + +.data_width_long { + width : 500px; +} + +.data_width_middle { + width : 300px; +} + +.data_width_short { + width : 100px; +} + +.checkbox_margin { + margin-left : 20px; +} + +.border_top_none { + border-top-style:none; +} + +.border_bottom_none { + border-bottom-style:none; +} + +.textbox_margin { + margin-left : 20px; +} + +.textbox_margin_short { + margin-left : 5px; +} + +.label_margin { + margin-left: 10px; + margin-right: 10px; +} + +.trt_course{ + width: 70px; +} + +.small_tb{ + width: 100px; +} + +.docBelongScroll_div { + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; +} + +.rightPadding_table{ + padding-right: 50px; +} + +.verticalBar_td{ + width: 1px; + height: 150px; + background-color: gray; +} + +.docPlaceScroll_div { + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; +} + +.result_tr{ + overflow-y: scroll; + overflow-x: scroll; + +} + +.result_data{ + overflow-y: scroll; + overflow-x: scroll; + width: 50px; +} + +/* tablesoter */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; +} + +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 12pt; + padding: 4px; + padding-right: 20px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; +} +table.tablesorter tbody td div{ + float: right; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { + background-color: #8dbdd8; +} + +#loading { + z-index: 10000; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #FFF; + overflow-x: hidden; + overflow-y: auto; + outline: 0; + text-align: center; + display: none; + opacity: 0.7; +} + +#loading_content { + position: absolute; + top: 50%; + left: 50%; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/datepicker.css b/ecs/jskult-webapp/src/static/css/datepicker.css new file mode 100644 index 00000000..fb2f5217 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/datepicker.css @@ -0,0 +1,11 @@ +/* 日曜日:赤 */ +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-weekdays .flatpickr-weekday:nth-child(7n + 1), +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-days .flatpickr-day:not(.flatpickr-disabled):not(.prevMonthDay):not(.nextMonthDay):nth-child(7n + 1) { + color: red; +} + +/* 土曜日:青 */ +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-weekdays .flatpickr-weekday:nth-child(7), +.flatpickr-calendar .flatpickr-innerContainer .flatpickr-days .flatpickr-day:not(.flatpickr-disabled):not(.prevMonthDay):not(.nextMonthDay):nth-child(7n) { + color: blue; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/menuStyle.css b/ecs/jskult-webapp/src/static/css/menuStyle.css new file mode 100644 index 00000000..b1920070 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/menuStyle.css @@ -0,0 +1,49 @@ +body{ + background-color: LightCyan; + background-size: 220%,220%; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; +} + +.background{ + margin-top: 5%; + padding: 2%; + background-color: white; + width: 40%; + border-radius: 25px; + box-shadow:5px 5px rgba(0,0,0,0.4);; +} + +.btn_width { + width: 80%; +} + +.form_login{ + width: 80%; + font-size: 180%; + margin: 1%; +} + +.form_login::-webkit-input-placeholder{ + color: gray; +} +.form_login:-ms-input-placeholder{ + color: gray; +} +.form_login::-moz-placeholder{ + color: gray; +} + +.logout_p{ + font-size: 160%; +} + +.notUseBioMsg{ + font-size: 143%; + color: red; +} + +.batchMsg{ + color: red; + font-size: 120%; + text-align: center; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/pagenation.css b/ecs/jskult-webapp/src/static/css/pagenation.css new file mode 100644 index 00000000..3edbf3b2 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/pagenation.css @@ -0,0 +1,65 @@ +.pagination { + position: relative; + padding-top: 10px; +} + +/* .paginationjs { + width: 100%; +} */ + +.paginationjs > .paginationjs-nav.J-paginationjs-nav{ + position: absolute; + right: 0; +} + +div.paginationjs-pages ul { + list-style: none; + padding: 0; + margin: 0; +} + +.paginationjs-pages > ul > li > a { + padding: 6px 18px; + color: white; + background-color: gainsboro; + border: 1px solid; +} +.paginationjs-pages > ul > li > a:hover { + color: black; + background-color: white; + cursor: pointer; +} +.paginationjs-pages > ul > li.active > a { + color: white; + background-color: gray; +} +.paginationjs-pages > ul > li.active > a:hover { + color: white; + background-color: gray; + cursor: text; +} +.paginationjs-pages > ul > li.disabled > a { + color: white; + background-color: gray; + cursor: text; +} +.paginationjs-pages > ul > li.disabled > a:hover { + color: white; + background-color: gray; + cursor: text; +} + +.paginationjs-page { + margin: 0 4px; +} +.paginationjs-pages > ul { + display: flex; + align-items: baseline; +} +.paginationjs-pages > ul > li.paginationjs-ellipsis.disabled > a { + border: none; + background-color: LightCyan; + color: black; + margin: 0 4px; + padding: 0; +} diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js new file mode 100644 index 00000000..90ecc18b --- /dev/null +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -0,0 +1,213 @@ +// 検索フォーム + +// 戻るボタンの関数 +// 機能概要:メニュー画面に遷移する +function backToMenu(){ + location.href = "/menu"; +} + +// クリアボタンの関数 +// 利用条件1:form名がsearch +// 利用条件2:form入力値名がctrl_で始まる +function clr() { + const formElement = document.search + const formInputElements = Array.from(formElement.elements) + for (const formInput of formInputElements) { + if (formInput.name.startsWith('ctrl_')) { + formInput.value = ""; + } + } + + // 検索ボタンを再度非活性にする + formBtDisabled(); +} + +/** + * ボタンの活性非活性関数 + * @param {*} buttonId ボタンのID デフォルトは`search_bt` + * @param {*} formId フォームのname デフォルトは`search` + * @param {*} all 全インプットが入力されている場合に活性化するかどうか + */ +function formBtDisabled(buttonId='search_bt', formId='search', all=false) { + const formElement = document[formId] + const formInputElements = Array.from(formElement.elements) + // 検査対象を + const checkTargetValueLength = formInputElements + .filter((elem) => elem.name.startsWith('ctrl_')) + .map((elem) => elem.value.length) + + // 活性、非活性の判断 + let validFlg = false; + if (all) { + validFlg = checkTargetValueLength.every((num) => num !== 0) + } else { + validFlg = checkTargetValueLength.some((num) => num !== 0) + } + + if (validFlg == true) { + $(`#${buttonId}`).removeAttr('disabled'); + // クリアボタンはあれば活性化する + if ($('#clear')) { + $('#clear').removeAttr('disabled'); + } + } + else { + $(`#${buttonId}`).attr('disabled', 'disabled'); + // クリアボタンはあれば非活性化する + if ($('#clear')) { + $('#clear').attr('disabled', 'disabled'); + } + } +} + +// ドロップダウンリスト再選択の関数 +// 引数:ドロップダウンリストのID +// 引数:選択したいリスト選択表示文字列 +function selectDropDowList(id, selectedName){ + // 以前の検索条件再読み込み + var select = document.getElementById(id); + select = select.children[0]; + var options = select.options; + if (options != null) + { + for(var i = 0; i < options.length; i++){ + if(options[i].text === selectedName){ + options[i].selected = true; + } + }; + } +} + +/** + * DatePickerを設定 + */ +function enableDatePicker() { + // カレンダーの表示を日曜日始まりに変更 + flatpickr.l10ns.ja.firstDayOfWeek = 0; + $('.date_picker').flatpickr( + { + locale: 'ja', // 日本語カレンダー + allowInput: true, // 入力可能にする + dateFormat: 'Y/m/d' // 日付のフォーマットを修正 + } + ) +} + +// 日付入力チェック +// 引数:チェックするテキストボックスNo +function autoModifyDate($this){ + // 日付フォーマットチェック + + if($this.value === "" || + (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) + { + $this.value = ""; + return; + } + + /** @type { string }*/ + let strFormat = $this.value;; + // yyyyMMddの場合→yyyy/MM/dd + const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); + if (datePatternMatches){ + strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; + } + // yyyy/00/00~yyyy/00/00の場合→yyyy/01/01~yyyy/12/31 + // yyyy/MM/00~yyyy/MM/01の場合→yyyy/MM/01~yyyy/MM/末日 + // 開始日の場合 + if ($this.name.includes('from')){ + strFormat = strFormat.replace("00/00", "01/01"); + strFormat = strFormat.replace("00", "01"); + } + // 終了日の場合 + else if ($this.name.includes('to')){ + strFormat = strFormat.replace("00/00", "12/31"); + const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); + strFormat = strFormat.replace("00", date.toString()); + } + $this.value = strFormat; +} + +// 他のページで共通化しよう +// ページが読み込まれたときにsendクラスのボタンを押せないようにする +// 初期値をdisabledにしときゃいい +$(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 がついていること +function resultBtDisablead(){ + var selected = ".selected" + tableCurrentPage; + var cnt1 = $(selected + ' :checked').length; + selected += " input.checkbox"; + + if(cnt1 == 0) { + $(".send").prop('disabled',true); + } + else { + $(".send").prop('disabled',false); + } +} + +// 前のスペースを許さない入力チェック +function checkSpaceForm($this) +{ + var str=$this.value; + + while(str.match(/(^\s+)/g)) + { + str=str.replace(/(^\s+)/g, ""); + } + + $this.value=str; +} + +// あいまい検索用に半角の英数字と%以外を許さない入力チェック +function checkAimaiSearhForm($this) +{ + var str=$this.value; + while(str.match(/[^A-Z^a-z^0-9\%]/)) + { + str=str.replace(/[^A-Z^a-z^0-9\%]/,""); + } + $this.value=str; +} + +// 大文字小文字-以外を許さない入力チェック +function checkPassForm($this) +{ + var str=$this.value; + while(str.match(/[^ -\~]/)) + { + str=str.replace(/[^ -\~]/,""); + } + $this.value=str; +} + +// 廃止予定 +function DisplayErrorDialog(strMesssage) { + $("#errorTxt").html(strMesssage); + $("#error").dialog("open"); +} diff --git a/ecs/jskult-webapp/src/static/img/icon_modal_confirm.png b/ecs/jskult-webapp/src/static/img/icon_modal_confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c68f4d65ff568596586486b85c4589ebab310f GIT binary patch literal 13691 zcma)@Ra6~3u&8l&hXTd5xVsd0E4p!aclV7KcXu!DPJ!a??(VR04*$7p-KYC-*NQyO zBs0k*lP?iU3X;eO1PEYYV93%^Vk%#K*jEjPgZXNu8jZ=oz(~NP#YEIRvM#zjlT0-{ zmtWV8*6S+l&Q(|NWjFMIhKVNyk2X*1 z2q@aRwOcORyx$%-w?0Y)2$utp|NjbMnezk<*;&M}B9hs6A#QjQvUpKTFcC7a&{>F? z%9<6|UFwKEuOJn3&i!J<=wU<%v+sP|&x75@8baPKAG_hXf{(Yp;kb_<$J1}cS_mAF z))+5U27GEE-}JkVx;NH_Q30K{Z!1fkMxYk6noSOnu|E~(=RMb!FR1%xl(&c(SV8M}34=F&=JLPgCk46%7(;&`(cLu{ zoD8kZL7E^T{0N0aJHM>$Jc$wVwOG*#yOaf;_niu zqF07d6*ir>26}uz`V*UGqVsY9x(3TTVk)jHL#MeMz!+Afik5QCkXi*LUDGm#h#2jV z6O1H7vu;ADwXzEztu|tpf=q4d>_rg;QA`LxGH=e3)%^`Wme4Q6&HGaBOf zKTmTzFSkB+6@kKfP9ctG7rC8x-LScB(po`jt6r2HCHmsUoL0ZU@>OE+@vBw7(<;-6 zuT-JVPt3rmjWV;C1xXHL9W2kYSiEVdhpK-QW@*XOvZY#3SP+LU(3ZlVvtv7*h@JJO&4$*d+|^_VL+U$^t@GORpGr2Km`DnYoy<(r^;@BbE+XHavs8P1q{ap z-5hS4w?5A|U~_cRV9W>#*V^t!m%M{$lF116euYU?hNu+iMJ+drFV_he*+41Lm9igV zjX*wVRell)~1Y4hA!cAS{mo3=W7H7i~*wXBh!oy#MUZYLCYg9}IT8Ri1Tf;x8~ zueu(>rn2R~XCro&!SDTa-}~TlO^Zk8I=Q9xLK@BRhD;?9V@PVYF-e zPXX~&Or@c>4bZ%XmNq{Gv-ifYHR6{&(C4gBkB`@BkYgM!r6GUQ=kw_6$9ApITT9&c zHsZ9E<~!5#)pxprRwJ6QNZMosJ0MsB6i#OUTTn^ck9&-? z%q8xA^cfNb$~uCmVQ*iOUc$4u zdZsRpLi5aOk-(Qfpa{GYxnxY^l?z@E_q^X-btnn`#w9Xbe@&LGdB=74{TP@ym^|B4 z3GGVl$%**40j6e!o>_V-Rt%R^fHjbun!H>$VG)C1iY*{Z05O5R(^g39e3x+;NuvD? zVj7_uQ%pE2%Mq5QSP3DCm0Qd)L?!ZH1Tf+TSU$lLW0=h4$v^>5$erY{Z6K47#$6p+ z{ERXdrHf|ap5k$MQac0ShbUWF+q@a=xO%H@@pIATZJCZ`lX0)XuA(;NhQ^$iGq#~m z)%C@61dzoV4{xwnFbukEjM^dKnby zcq7BrGRz6>(76-{Y3 z6CArLP`!g5;|m(ST!1(H<8bJwT3OF#IuL1v}y z(N~`heEtWE53_uFSRsyg-j^TCKNShPP}0)7@0)CL+K~cwW)O@M%?vBmRL-**8_o)x z80{0_U{NXgy~|`10u*A*XHO74i>Ez#S?dblR;B#pi*kSWb0o>7jx3t#IGnW0tl630yqkd;F`MWd;cUqgc>hdR?7sgLqDIag<6OQ zZ-S_iB(WR;=_^e~UYxdV(cJ3nR24`uN$7bj7>*Ylu2#Pe>VEb14G275T+N=r13AS= zSE=B&T1^bCElWgJ$!5|58TT3Rs0DrTa0ewFqa%$^n}7my*lsoqp))_25aWbaj6DBt zZ=Ds53v7|eLub1^_ZjD!yPC$yh2V-h8+95A*z1xF0?yoiv z_hcFAXZ}~zMxH-C#`RW)AJ3fGH4>$<+=uwKYQ#_d{!dN0d>V=;hzZP_pI4uU0^dK+ z-R&VcoL3gOW-V;UBgv^st&&F34^#$oWY28YGEOj~5NYFtnnjsrfQv=thHb(4p}(#X zP9guAZvi`1(i~I9WiwC{^QwBc;z9NYmi5Af5QBAOkwz6wz*Jp-E#MW^oiTmRZpC>L=G*REOZFAv9YD=;KFbGax7u z8&d~KIY}l`qths9XJ^FyJ`mD2$G6#ZP@*DUjWyc&To8$Hp5m$tAx9SwACBc0{#=i6 zLOs!xH_~onQKaMu1(yn79iPm`&iz=v)6Ma6g02hU@~@Jgm6xX6nOT|oU9#cKX{xUj za+5ubV)xOu^){ssW!8MrnR0>K1%XXF)S_0dMz*VYb89_}N6gArn%bMF$gTxwEFgDG zk>Hjc5FuvgwnmTQ5`v&Km?lA;rdUD}LUu$}^O5_eW}`Vizetd(FStJ^=wCIas+cY> zR1o^SN0g9L(!@J87v~?(elfB67@OYU7L-kEC|0WI^x-hp^L8)LJHCG?yWD+;O~TBn zoR3BCLI-eMpn1s0W0=0^BS&SbXWkMo4Z5^+*t7#j;4vWMkGy3TcJH|T`^=G$59!cF5XMmHrSEYVlYoVrj&A2sX+$ALlb2Yr z8CG{TZrmSB*-$maiQ**59wEt=%z`R~osu+M9Y37#T%*?4jqi-$xW`Q9)vOa4kx)A; z?nBB>2U>uMmRFv<9Fpv2^~GDKxbPk!#TLZ!u<{FzW}E85rV=%Eq_`oV!iwh%eL1T9 zpZW9XO|Mt#E5KDP1>@W>2M8idGD>$s4;48 z(V8qey2>!^IariGqu+R5TO%*fSh&4ubk;hlmQoQIe5zI14d4$Ggjq^Nm(Q>gLmV5^ zCHD1*)kAHhVa%~p`p%dyu1XY1t6?l=0HXBI`k zj!e4{Elg4t2$xw>V_;ztdFbSQ-{tOe_8693@B_j`$%Z&lQ9-uzb~yPg24P@kkhGQQR8YK^c;v8{~;@T2XbncSvl*w4GI3 zZu5?&ftks80g6T_ea|rPaUw7{tWkUett}Z7E@d-cz9g+wwz&>-h$*MbFp$w@qHK80 z;L#X*whcE3Ww0F*AT%bo(E?$zcVV?kQ|@>#&vq}a*s<>jLmp1PmB(*T^%#|5+)Vi! z-X>k75vZ!kUR&F*rtDyE?>Jy(|2={D@U;xS=ZVmwk)6%s2WOyt%@GvoD5Om$=d`!R zbJi9yrI9G@e~i+TCQNR-T6?u?2hqpnwAdT#!tasie!S?UWL(TRxdLw@EQQNZ@QdwR zl}(NA(8&ILo?voc2s+tl;Zq`>w_rF+NlD|>)^p?5L_@?Qx*O7|$|xy6zR}kb=_IO# zILw%dYYd++t4)r!WQmBIJV2XP!fnMe%Rk+m&~9r3HR5%vFr~a`r}$kVz?*gF^HgHc z^Hem%C~1;Mh(h&A<-ie+H+hQrT z8ms`D4Q<#bTyAYDqn81ffR;+t6Sx^s=ls8Sk{Z$&%k{p5GXZeP?V{FS8|T5GWBPZZ zj2@TAy5Lf?h|)k;^5~wAQSv25jjb2RI2C zM5_`tI6koIvxmO0PcDarwijB&S6p}`OW=<-^lWN;cV>u6k+OpRdc*K%vwildiE@&p z^YkxweEo2)bf0yy5ZWOFQ(1Yb{ZA>Rqu6sj2Nh(Iq_MKmu~$%OZD*MJ0!+Hb8*qE% z{?8Ym$n)ce6RG47#TBBoKOa^3sHY*qb9qpV)@S26s3yjT{ewLp1z|E_Y^bfjeV^nV z#tw1<5ThRu$&vLdJ&b4i9GjTY;bpBGm_L}tvWe%`Qv6}>oKyoYk%3<(Sa&Qozk^}q zizVJ;#1d!yEM<0`2}vg`p#3G+!KJ7RO>_Rd=^W-t8eRG*r0;orL%tNq%vtv>K;|!d zqZ+NUy_yB1n-=fN-~>f+@=-E+P(A-IE#lMepTt#Sh0H|xXri`ChVOWSiX}4-&-{~M zk3@4ns-P@gPv5E04SjLUvuoK9_H*ydX&V1d{pH(=T6W{{Y2a*oi>LP5dD`*hB{H;` zV^+3-YX-1UsMR3N;ccL#ZGet=OU^{`{9iOsKa35`e4JKof*9Zj&BCJXiKrJG?pH92 zw53$RZ68SkNDz9;OvJ(_2cbP5BSAlxxv}|m9QPQh;0BPbIayv~-7H)cZ!RFz*|g+b!p#T3V6F zGH(7wiIn4aynbXE=)&#gFbO##_Fj*uH^LP=Q3(xm#?*IC8+tnab&swu5Vkh2)bS5C z9#e>g?FL@&?M3D?^V3Me_M~d4e(YM)^WXUhIaW39z=m^xgtC59Jdt``|9ckJLUK?* z+-gQ9RxA~R;XWp-Nw|X5&|6%TL&_(u2N-`mL$@;+8d>$9krh{HX4~<_M{3zL5BI!m zqn1vY%1ymGHNz77czM;W5XTj;#?%pkiDCb2i@AX**dB~e)KiY8MZIrnul58YMSq7A zO>yhh%WB%*v?n%i)jP`n4xczcW!M56Rmtdm7?Y)MbrT#s7K})s)PfW#l1iHnfa_bCjF?+|T9baCcVIb6=&{n9Vi(v^W5(2RY6z z(UOn0n~?b|>gy9?C)vQ>vai)~i=h2c7-cj_Z=CP-8)WgQ^W77@ezA0J&gbRhokGCF z4?Ra83rD@Hw;mEKYRpy;bYToRns?2=j6jg(*L%eNbjUz|z>sw4lSuK4oipY|@JBMT zC^>SW`P;#J+?EsLp4TSf-dB17^ApUVwT`GdRE2h}j-8cr^lc{5&y@>*S_ls?c32TPRsE_REz?d&#mn1N|$Zg8Dr+xjad{*g@KU2d$e%sN8R-K z7LY+C!j4H(Q&oSpyL#_w-mIW1bT6-~;806CnvC@1L6di-XcG^d#|&#Rq1>~mE{2A& zVc8~5=wZBWbmfvx$i9Es-NKMb*w}{82z?GB*$Z3w>$2o&fB09~MqGyb?ODNb-#{#q z&c)mR#YYbp_YnT{&WLWT;qw^bHI5PXgm!;;FNj(w=G(Hv_RFw-{IhoC_9%uZ>zTa{ z%jA#IwvAirIKrb{>qoR?*?V5y26lT{q6&K>&*$awEkUpAmobpd`wIaODdY}=a*|sA zdj@-sTtiOGBJD$+vi6vO*G2PE1-TKMf_4>1V`VEqokp2cF6)%I2t7%Ch`zeItrGtB zchud%a;H}MU$5fptatSqy?U=Z)7`cBfuHnI`kHQ!@N4^PN>3N7c7mSkNo}ooB6E7W z#cSB7F{IXgMPe)@kuM`=P&;Q^d=8759+OeVZ*f-_pZEr57AA;6Xu~OW2=fwQn*1zB z4DoOc(!)$qu)BkI@aA{W+qZ?x!)Wh{W0916>SYXED(Yt8;X(a-;oWlAhQ6&(p00L_ z^iFS#y*yaI@%_i3V*OL1m$=zDqd~(A#Um^Yr9hxqCVf^)ER#~jB5P$Wg_NT5x784c z%h$*5Z-J-}u9vjiop5{JibTGY!d-%v`#RA})G`mel~cr=6BwlGhxP1i1_~b;_!?Lg ze-)gAPxhM(%Tgx16d1dsI}g#r!cJ~)(r;Dfog(vsN!c3~-$z3t$(1^nSuWzUW`0rp z=tP5yh*)oUip-K!)3oKpU*k1}ANS14SLaw#Vc_K3gUob7;AT=b>daPR`MgYQQiF8>o0TQm{n_ z1_$!R(ERmo*yf>YQCP{>%b->@-~@kb$uOu4U*|2Rafnlfv~=E$QwL=s_>eCjaJ>MV zoAXhJHl+F*_pA5E`rrX8f>QhnoNCRIB~z{TK6`>_(KrHWtbz}0)x$Y)5GtKip_5mM z6lwK4a5AN)SW}P1Rw?BM0DJy}W{Sb;;1-$AdO959lF_#&7X0CH$B;jt(ZID%9Kfh! zx)kABrY;F?M*KQ6Q>n;S#KUc_JPSC9g69Ok1#0XQ(@7zez{73 zdu-%cfk-)hee7t9ezwo#!h+Cpw7Z!&=6u=!To((qo+e#n>Y#VOl9Qha-Itd-alNzmnSw z17TQDITQ3PoV@tIWM3~SjJ>zfd6nVAY@j3D({Hf&yc#1{=xkAFNTQnJ5Zj6LCqJWO zLJ>E0b=rl~>G7-xH07GK_ok?c$7Otu^?n}AuuS3N)|@kD1_TQI}w@-1ec@JaIZyO0wTC?Vu!fggDe&0%a$=c^eJq_pG90e8>5YQkmd z$mFExP`2(+B?FJz2MK`kgn_Q58H#cV88eVZ?OX{j>uFn|rc2=n(oI|r;?|Ut7q@x; zpQ?XqKa6nwRj?vk)g`G9h3kPN(jmtojgZo?YFMgt=>y{jR`|v1*y8x~56&~P1eF^) zO?rSa+p2^rNCDgyakSWCy|Gn1q;9$FVQTgWQkM=MK*$K+021Tq-tHiDj;xr>N+Ecx zv!?9uZ2IDF7w>y7T1z9QOjS|BVz_BNKpsCkg7*21%-pd|F*wZ?kYDvnD@}{$AuzgR zm>?46Q@+Zs#_hJyItaD_S+E(}jhebXooYs9Ec8_4(c&}}o?FZT=^&c~nUW$c2guFR zlx3Di7quj#QrH6+{xu&=GnBTXVXl2Ehyn_I`!o$h7q-k5&+wlOyeCxm7;HOPrEL4^ z61=ih5#pVwgEmT$P7gWASuL`FB)0sV^lhr2`Y4lVX zvG@Wt+GqOwhE7lFWJuj>!SLXUq+3b&$zz*PZdiPE_t8qebi8Z+zlY9_(C_`|Ty|)8 z3zX#tQ02d=Xr;9+Hhl?)0V2?v=hgp;>6eELaWzF@IrnP9t?hz$}S38r}-|5(zrz!@+C z<;Y8`H4^-L35BD2L%mX^9T{WgDRxg)X({iBIHfcJ%=oV4617NltYXbTl|e`T-+bBG zVTSP19kG*Qfk%gSMwLis>>M6c5i4JhIf>`e31;tT#|e6+3Fj?WI%|v5O}QK*zoCGQ z!{Ut|My~C0SgF0;lY4SI>+l1lM>R&xugv1s?PJuwcdTt!+~L+;OC((wM~jG}zU%H% zf2a~J4F3osU`bD{?=QhuW9lSyh^d3qskF6VS0Se>%wM zK2M2tI9(EE$xK3e!HQwUymMog6s9l_BDC;C4srwkC#Xi-t++`-{Q2ilO(5O17hNWG zBS=7+Pj-mNi4i5#ZBWF{?eG){b|XC$W6|3TbNIHtYFw!qHaL@ywi?0?w;qx&4{C+q z4_u@&PYxRcEzQ&e+vk@L&|zUm0Ljf*ldX%2G`xVS}@OgcuVRfwFoJk^$5}uDUMvCa>_QC0}2& z3_??0iTp{nKxaK&-;43fTKH+(%)j;HY&3ROBn1~d2H846#Emv6!L`UEwjT>xytdUj z*9d_QTB`-WbuK3v269oCm=@M<9D8Q>BFG7;xFW;GL&-d~ z69XN>ZOgHaxtX$&3~S}XeaACMztF^S=|lMbvudi|Z+&#z5TyY&@asql zv*3*nt&Crar1=V8T7|M%7^}L`$BX1BM>*m6)&xuUBQj0J6KnH|u*c`C-0IU$1%yhe zk-~HLRQ#MGsq5Ao@O!H)gwP2yc+m0oos1*^+SDjSTrTw^O=Gq}Fho3;@udR8S;EIv z1gfq}%@IFKZC${QnvR^W#P?pocrPf$u%s??_&dvC{fcLZF5GoQ8mtk=8`d1JX3g9! zR_u?5YWg~_qj3CT3LCdY=8C88iKb{fLua6@WO0ZiX*{8a+oA;K*2AoTUWlQfL-iV``3>Zjwk*l8OGe4(^!rQ#HcZ%_6^g~ z14ARM-K0S&M6Jp!BTB)^Pj$PqZ|XC26@dLxd6fFw+lOovIl<3ey{lQ5 z$U-a?9BoYX!fTlp>mGYa!%A&poiVRqT`4-Zb?&L>EYYfq7qLBKNEb261)**)M0!b z`#R*rU~d@X5ZM?wG>B-z^X;ou5VF(svtwsC>^<)mKv@HSa)b;!FOZr1@$!~*DWzA< zaNX=G#igdwGz6g8`g?@A(3*Dj+86?h(fOl#-V#ZAqNZ*;Tm;vhO2xO=OzTg{QroM4yu zwp`HUQNZr_#VAoFBc(DKKz2UFN2X|UJ4RYUdclPOq0 z5^WLQ&3_m}ZWfpHo_UlSx-R*Fc^#{#7CUyAy&YPk_ffmi4qe-`C@*R7I$7B}NEb(( zzLt|g{!6<&)(*jc=plTAG@@yAi@M+jUhxL{0EOK^5an1WIH;d>-j z%w_P*P+&by-`rXFtJo+qKKS?H$j-wZG6Ncb>j~a!qYBsM*NU{{qAD>8-Y%k{3Jyi^HRToHrBzfL_YyzHR2=Von&*Up<*-u=B(k+ z^6`=>7(EAtU4Ynzv3FDs&%rNyQp3o&-sLGI5 z4D@7jrsSVmrAcHL6amvGmIpa8rnY2bxp$icGz(*4O1~tK7{f*L`2>V5 zS`_o+Hz=J~D^l;hj|b5rBguC&+RlGk zzuKu}n{gfT-o=a$x$7*7CaTMtXxcA{WwvbV)CylaPo&$|3N1fQSEfN$^t5wxCP{>ElFM3|){5`sj z+b-?7+b@XNB$hME@ z0cQbz&)S7pOb-<3uwn}NR~2A`Zoe&>Js{1uJEI;kU$okFs_~}Mp=duqGzpd*pP@`w zFaq498GSIVT@VRyd-ZI*WL+#{=mP0-WhGvbh1>~gs08r&pH+YFdadpD)|u5QS<)#2 z5R+TF(k@u**@cG`1dK{$U(V9m>C2!1U>t2$Gui{2*rpjs)Axq05y`k29%jrL0$cwC z71z)Hi*)U10JNnX;WjMO)iZ?cSFz}*qnqpN30*G4lP1-Bn<7rQAehg}3d3J4Dhp41 zJPPsq+kxW-FoS(ecA2DeTlGMdOwT z+b3$_TRk~d!Z(YpI=Uw}(|x$%Kl_p>A-fcOs!D|9_6xuXK7)M5;b66EoxwLZ1lmWQ zUdjGF2$652O<%F5ULM%_I%!O6#MlF=O+S_II!f6=<@c1?k|Wd-fOx;Tu+{m{l>5zg zKBe(;))HU5v7vtV;!=v%2pgTYRECyr0U2tc)a9NX=0JieNY0&|cpUhZ!SOq~@c;NqqqWwhs#u1cDrJv4eE6E^@oQRerJgjc zy`TGnb%59`l(YxsH4_HI;Xp|_(0?HM(;?FSE#jTL$7 zWE3=@;qlp6hFvl^av=4NRT^}R$iH#KN)Jj;e>&7E%}{87*FJ8HEpSbpk+40H1Mb>v z2cg6CN(wzqqQ-DpA!@r@HldKiRU$^wupl&xo>%53`GzK)guNWYC2KGIailNoI+`23 zzD9i+P)LToHoUy}`Il8`WnsdoO|cFIL=XeeGI@G2$B&i-7DkeXQ4PiHBP=yYl>Otf4TV_4?Od0>35&kjwSDNMjAt~^*h+BcIdPVSKMRQL$qqG^xPI4sgN!* z>L>L)BP(NLHEUO~wRdbIU);X_1pSi9uAAmh@=&f9D`{uX!55`^)}}aI$F0?2e4qMz z{IA#M;e!P&{GH5@V9vo})}M)(Wy_rr5`WHMMlZuuSqiW&%o5p8;!A9`E5pIe{P!+u zJ70YOTh@JFkV3k(+r-9A4wnyDnr#zGVi7}vUijiH#^Xg3p6Y<#>)&MH>JxX<49of& z;yM3cPgrEwr9Ss&hg?V4zU&)^hWUT@Z~jF44%@BqD5s8uhG40q$?2*(&Ntmea0f4F zbc@#Q+ng*O1=cx8s&=;c*MCQEBBiONOCiJ9e+<}AuKcQX-)IXj~D3|RsJl-j>+&O&mO6m zrCbv{{1&?CQE%V5fv0OS%*qs7oHpsG##YA}@5^6EHkY2GGA?ZTd@S^~_n)JUCjv9C z@cCGVgWNs@`MnvV3i$1}(^O2(pUvfwS^XqOk~d+(Mwx1OQTTP(9(wo>v#86?F5oZ5 z@6u{!MlNAu=XJN%Y4iM`&RAw=Ni_Ws-f2!ll5n7qHb2 z70HB4-wCDd!3`e2eLnlYpEUSdqjw6!LvAPNKMgQ3ajw}%7Z5z;M+E{`m4fplCQ?N1 z@uPCQfpFOe;_9h~)lEm5(F-dZ%EP-z<7ra?ZYIAfn16%_B8+lpy4yneHBYysR3ete zMXT6H7Z!{hA}*UMrNG^f>ta zKj~@}{nOWWBqf~d1|B|9A~FxCR?E-4@)nasrAw9v5+v?2-Q2uxXsnD0cN#ffVoNed z26;5&9U3wV2tNxm%jd1S(~LYK|Au-## zbwB6&?ncQ@Jf0Pn$=DtnVNq5Lkh2f9FkfqTfp_-IX&ajEKv^dI)>Zud?{l0(zNWa8 zoMg)JrJ@n)7oM0tik6WiiDUWT^f6S^&WvbqXWwq zNC^1*pmL23b!=r4-LE0eD-ycDeFo-U{Ujl4^s-eyawy~zz(htog`+SK5X6+FI;ddr zNi^1-fAcUVmvar3qsC0~}KG#9tfCI_D2Mi}hr1=H?EB(g(53%M! z#uvDHP4lqxrb80B7_n!kxjtu?8k#66 z=alYvV;U4-tWvFgQb##X$@k{NBqC&r`9;cujtRgjCwMZbV#8@uTk_S!+O*AGoYn}|A;e@lQ734(|Ah>R$H24b-%TRM{UhF^sU4 zSy8Kgbi>y5oH6qL(_2DWXGv+y0XUa-same^4GbagVehT$z=!3G7MxBC_<_Fvi;uVK z{>B#lJoTziT zm6AYf7tfgVWV}(;u=l?n_`Jp4a(}*`Z;y;6>pX^sGKLKA0+iKs@3u`9r8PhASQc2Lc&tWUF(*Ek_Ku}$A;Sfs5!fX;B9nmJpEI;9jp z^PDw-S89lfADz8=V-mUx$4!t8xlSNKg8lw{zqENP>Hk>$Y3x`ofHF?=i!ydNf~@d2 z0y8^n-^j6<6**=pjV0PQ_&q!{zX~65H*-)Tu|9u7{9Rc0=x` zef`f1WdAqZEkFH|;D9!IBOpyhVObD@U2)UBQaLi_U&_$~f?^d)%@WjE=n{tt%=T>T zFRBGtsKtVTH3QNzKL5&h;Q6R22~(odyeKeH?;7J%@o;=l%m@ zD4hfsdWVicqYZ}GctI8%P4uuDo{4ZCA9XCi{vHE*gm#mzwM2&ZjM&cWVe{4P3Qy>ot+w^)o5p#%ms6MS z5-tKK+#VM5>rwQb3Xx@$wI7g+>C_latR pOOTUE%$x?0|IecLkRy8c~Cw{{hI!7Ipvt literal 0 HcmV?d00001 diff --git a/ecs/jskult-webapp/src/static/img/icon_modal_error.png b/ecs/jskult-webapp/src/static/img/icon_modal_error.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a0cbba34432b5b0e42090c25f8dc1cb1e56490 GIT binary patch literal 17229 zcmbSTWm81b0G!;O_3h2_D=nxI=&-gUjQ- zTkj9N52sGm`Ov$&cXzMVdv~31)erBnFnV9skzo)afNrckdUu*k$pnQb}s-t zR{&YL!Klz~9^%GHSO^Xmq%DA(3mFB4%M=+1lEkl-wXy>NjfZmM<6349E9rS@PXsRp z+T+QzzJHI`iuYbwyO8$K(zfUy9Sjo~6TN1GLU7SQz<~ev3znPnsV%(pYSRwbv%Ze0 zBa+DW>GEC4GmPp&v?xcUGa3+F`wJs4A1^y1eF5y+TX`e z3Ex0yEcIbHTl4i{Um7TYj5jG~oJ|*?4qXscBZ2{N zZ>avP=~klJc~+lIlo$mF?qTj6JYV$?-D3svz6AxKm&cm_QqQ^{ElMoaNgvNU)3rC^TQy96%4iieSrjgQ5WpW38rZ`jJ&S+u9y6pH2Hn11F+H zBw#>WMp_Q}EoJXKWvWiX=$=>{4XMdgFZNXU# zIq{yKfXY~Wi{MI1QQYH)%=qnOKlIt>e<(3)nUzAptr}o0TydsGk zbQUZg?DDq4c3rlb4-2CG5ky7dUyO%ttYD=R?|^4#-?igqRfWMUym2GQ1wX3v{LVZX zo)+HxNzmMl)~43wM$Stn#=8EGo)WSKGntq3{SVvB6H^2L@DCwvgMr@wnNMsFnsT(A ze4}u4h;f&??ax#quEW02jQDRe5|d|FO>7F#$v1qJ64tN7_A+e~#(n2xJKG4L;IV|a z?P7!h8w4N=$r^;lnqqfBTXz=h4o)86WaA{)phlS=U#`}YXh2@(FGmIHw@1&fau}^eb_(f^<$}Q?*}PByX>rAuNwv7QfChjnkMJ30 zYT`2{d;rLlS0ER_&4@Na7xy7LX7p2_nQ`kO;owMLKxCk1$n}g-M{$GM0hUg zC=u(JG>8DLI19tF@3Sl;>+U+{GJ_S0>^BG(fuz*)QTSvd`6qxzrrU>=zv?wvnYi9r zm;i!S%=Ro}rqo-b4L0K1A0?U=Uqf_v^X9wsxC`d8k++l_&trrSR@z*D6&arjtGr(B z+O?8}4eGJ~0uY9k>vOBS`4R0DNVv93KZ=*3FV^CcD{BrZ`C@6d5_XLP*s_Tjr!&_t zj|IDj$Q{2pg~zsSdRAX&fL6BO6zkfz7wd0?v*F&a+i{Nx3dea%eaQS4N<$NE%Nd%+ z5?pYE4nZ3MsV?0X2+-!}Stml>O*z0TIWu3?ihsJ5o1(3F)ac<=&v zufOS_&M=R9DFc=HbHm7;4>s%jv@=Qpd7(>moL)sNz37o#u)`0!Q9?#aYX`8exD{NE za!1}sBII3fx5JejZ({f)VEyqUGFnTwhWL`9>sEB-Ac8!$p?~g=u04{13$jT6N1}GSVdPH%%gUAyP5Wuf2&DUQ zj(N0-K_fQZa`4ws`BGabP(;-J znA$uwMB+i^s|*}D`!1Hm#}4T*LvK$gCKI@67YGLT4>( z80*pInviea!D$`cOtsgXt$tZW#89cfx>}9&E1$6M+CcYNdEt3Ws*Sm<<1}&v#F} z-5QWgBhg}x<6p&_8Eso1Tdh5{L;!(xfHu-D?XPKDx-b4yVmf{JtB>?|T6(GKO@V;V zQKVdfV#jcv*?f>{ja@sN3N4J(>HrL&L{7%ill?ak^%8}$Wd89pR9}WX!%qGAtO&xi zhbZu!XP=`1a!GT;6#A~gK345#UjUZK3rN`!s*m>hFF{{wcGC5opyM2+c(Euv*UpoW z+VZFLKMgvg5b7%Wzk_jkIE!d&JPPVnZTMX!R$85y+9P53APd5wx2693Q64mUUkGt; zwX24+(q;eNm3&L6x{z$Y=&mMSb{^6X{_SJMKvS9lTu(-Nph*{Jh(5=TBHd6VGsZXg z7dhFO=11|{8;ZCpO~?Q4fI%`nz?dEyXKCb3d`$-3diF+us*Es z5H4D*WtB(t8Ij7ZZ($!}49+r$hm!mGC=wt8WI$Z{R`^upI)+B@p$Dx3Zi*T$cB$~w z?;@wmIz}N@Gd(NY##h4;S~Nx%GDF|{(p3j><=Oo(;L|S^VA^Vj1uXmZMZSXd(H>{O z;g$}^#T|qXG55PPdX|AoUAQ2cT_unph54)X)F2+nB2lg)xrft>>~GEcKm~hxtDiWU z=-Fu1Q)%y#ourXcdGNj;si0J2b}`haHvU(zob^4)8dl7QV6)fB1x&Y36U4A@MlsHk zYV@Zwl@7^w=+8LtW2^7;SW##%I~i=@(XX+FO*=iIeh(2G(`8TpGH}u#M5?L?sLmM1 z$p`<^@wf`Ho>F~*2#owqnq(24C7)&9fZx^=Z#%wQ2okNm8?9v>KcrXV;uIHqykhBV+`TWC zG5e#C%7V<*+U&JIR2nOW?peSeG>DZ5;p*wn`qzN!zvVe`{{bagqOkGY)7q6I{AjFr z`;Od=mP-bltslVDD^%!32SA_E2K=)htPub%1hx&XLU@pA(MGt2()VYNvz|r6GSQbS zXG4KuzUU}7{fNyXId>?K3o>Wbr)qPcM%Igy`I)>(6xm*exwkh8@ZuWy-K6CM@#o`> zGUBsUF26r~UmUTiQVd=t^_v6ktTb*X$=5ecgsPaptQL?L6NyVqn;uZpSkpQmsf;iA z_H7D?-bVd`Yz@hJWa&#JzBAs%$VMDDx}UR7vh3lGol)bzdWy@T&1xoOyEoLnWGNth z`^K(x(Jc_vi_Z5JP`#{qdV}4pbY$n4G$Jb!Mk|4vLXAJa>X^FddS7SIwZPJWU+1KO z^u~|{TMu^tt__$-_W`Z^YWA?KoeCrm?G!x=Z?yU)RzHe z0J~HiXD3DhX)FZ@Z)D^bRKc|p`8OjV5p$}(h_PudlOvZgD|vVkBMSqEhc+Bcy+U7+ z1U6tXxjWr<7zOLAEk(U-;|t5kmb)iEkZBzj?z~{hb`?6?{M}jygr-guD;`bSTg| ztaoNfy$kEdZVw4FlwMhJZ&Zcj?s>5xO}~G9j;&#ahys$C;Adp^BMU1H!l-_-U)%J? z$JQX5BBbF?Cd9t7;{o!E69$>m#lFR6QEE}$E;dQr@G1M`Fd^hS^Et3W0_J{Zy$z#6 zq8gdd+vCper4N@iPx+nW`_}KU1g%USnI284Q{I>J`uWgP_nk8^SDCC66X_p%)OJO3 zZ{&wf@7HJVJS_g=0WDX|brxE_<_eiPkpq0An0=p>pH|RbfaoQK@8m7?TH3Z;NCI3t z`-!Eo-=S8@T!;vKf~lWzfBM4E4aXZ@obVj3wTLgdJx>(|2tHs&=Z)XGft<)lU$lpc zc=QWP@F8>j{Kz@1;sAsVfy2n&#dC{IaQMiOxqimHx8-@L@H<6v1EfP7(P9tq> zo7X>VLlUD|6t?BJvp!1eF9@GDv}?KCi^*3h4`LmlKH~%mbv8KN40SH|6}`HIL%1Gk zMg2{YU*OS1GYa|@gQ5dHMVUXCik7st=O(P!74xj2dLI$Bc@eip?R&DfXe!+nli&V zks$)O?DmsNo5s6nKmNJ)PW5i=zPIt(0AuD5{lS`!y=ft2+vG?E7QSQ9KuZ{m*BABg zCOUk|uhf4x5OMsjnmDlQGXC&N<$*e3|I)%gj|~WTdX>ot@q9sxlgE;i<-U(i(zZyt z)8&S(PweB8LlU$elZxAi%hmOT0fs;1%Gw=BB)%N7GdZ(=8rcm6)FG?gUb!5)R0(=N z3gfs+;ii20W}zs4^LL&`?8-6aT;WK@#}aU$Mw9o;sK^{ZT>KrNkAf@6T38MKR<~o^ zTO@L$#T%T)z$`q;{BY}rz;?W^=?_=(Ax%|6mVKpJ_%xpuc`7my4&iF2OJi?8w%rR- zv@Cc0Tl!11u%jq;TZQ{P6Z!;fbexlrZ!@3SAuK;FCP*CI)9F^(n)*8CC$*{HAq~I` z^FtZLf?l7LQ2CuH-iyPd6;(EoTnTynLX~9={{Avubtv?^dDAz-EFG!q9Ivsdtx0$? z_DXi+_cN#&F4{RmK`&>+n0I#LArbLG$_u~@Q$|mxgIO@4YocGFK1Wp)4Bt^HF*!zR z=W-mw`@lT4z;c20nJST*PGnNf;!yO)?!W_XY~SfTB}9xRV3PT(P|`=-!=m@ZVVg-? zbxfN@Xm2SB()^Zjnt#HgH~x1eS9 zep-k!M)*a><>5bXW9rV2^zeg(A6wdjg1ys`OY38MWLZDo5FM zyDRq^Ckw>0Di$>2k+Ir*NHBhMy|-rdk_ULvs9Da`Tpqb);8p`D4^D;E&1xib;Pp}O z-%6b=3?p9r38qV}&0Qg{X~uko_5FZurTFvW_kbAG z=y}Np<$wl`?IC-IwVTEL(&?= zbR7G37iJ1C&&l?I!&4kJ^{<11t1i`vYa1dTxNssB?OAt>%X^YLg)wVKi8phWyCWV{uQM4&lzLFOp zQJr)~v!0;rsbJ#1r)Gmt24LzoZO_mYjhp`oB$ftKB3UVI6Ptj8Fduqo>Cg2E7PXHnaDs58Dm87^hRgrAjNxa zNTJ>zZ_mNTPmB_+%-~Z-Mi@gp;$+m8bSc=lHWxgNmb`&B2tvuCK|8~ zWs`RN_B!s)-qE_`V)hrO;C-arV1=x%c<^Bp4w4@t?@cSSdOma!=!VQs%LT@B#*}qL z@-QP!oV$I~@nrsBAm+qp+!g2WNCWt?Hgma#!fHVQ3K*i@@@BTXKMaO@Ce~^Dg#Bbm z{gvB6N7v1%aZf_rF13fQxrEHjZl57-&!10MO&ibJRULoPi3`G&;qz^(`nDVlxW2y$ zHyTwaHa|0G@6-+0w)8&K@%^{c_o}y_7ELLcZ&&43128=?sLzSD0E)w_#s%yNt2!4@ zYYf!k{mW>=f$dE>X?%ccXV3>F3>StGtZ_79hIIS}K^?PeA0y(5>SY7FTxp^`C!3Br z#{XPOs=DF>97_0nx*I9YSV`K0SOuvh6F91V-Qq}7Hwc~I=Mt_6NnxOILqS?crDjP! z8>jX@(!tA>gnzL9oHxAj)ZNnecQt;3BQw8j7{umbwm^=hsN@F426Wx2W%(%H%D3A$}97Dtl|x7b1Z8ARes$Q->ikFalcXh9u;mVV(2ya72fa5EVY)?oafl!w?@-NI^DmGLyvF4mP$ZFe+3HA`_S)IVt>2q5b!(JwgG}rcI&O8iAVfo72Iy5VBQasqg5Sh_G$y= z2bdQ6tO>pP_3?lWYPNEw!8!3TEu67of;Otnnis`>+a(YFjm@}<=wnB)iux z`rWSI9N$^>I2!lhYbY5OGP8gWSnT|#25rn;NsTq2=4=BHjr`p%%k${JYYZj4txRtE z8&fLo!+@Ldrv=iEkOVMY>2-AsTvn^Odo0kM_v~o<66C3x=sIANxlPtvYhOS&|1mjL zNF*9FqcHwW_A|}qgKJg(qUV1U#Jy*`ttVmEw>Lm|8<)No;u$jl3yVQtD0J5~0*?O&e0;B&rcMEX&FE>MBTHkLxW8IJ!iuE_O6M@R|Cq&D z*?ndGy6)S1wE(85CUr8gcdEWH+EZ4Cjtwv(X#T7Dkrrt{nQ49T;{*L3_0QAEuu}Wk zLHdbiOkH+pJi%*nB(A&~v|nPRQTTkQ+y0FA8gV>{>Di?8BsUB|si2_-cWwM2-x1uJ zW+#@W+Rii;dq!N(_z>UK)SWk^a*^I-PMzOYj5cuEszO6;bJ2j`HjCcRzJHi@K=vwR zu)d$ad?nWb*SsUWXP!cX_$lOL6|spm^$W+(die46%K2!r*GNjIMo-*@CoJQHQ;{Rf z@lF_ff3~|s4rC2g07S7WnXds2scdp1Kj`h7RPL{!ZXv9q#n22Ynqg;aePM#`+Xm7l;?Yh$X)*8Tt+hFUO!` zSPyC2m&}eG_1j_ymU+h6wvQt*Ad1Az8)kE4xhB$v6vH6_1H9aG;puRum3+Rx8txJ~ zdP6iEDK9^)iSj323t*K|2q;<#J8hSN4y*I)x#TvBoV+${fX z3cyw5U!Y86MW?L|-p%tjw28s+58EmI*8c)6gmAfnw7JHSZrMa(&p8`9bI>Uw1y= z;c3|0+eTXJv3S6o*HPC%9mGAYboi634L_EXZDU!%Ttq^)TPRpijS$$|Y{`->w`CGx zpHY(!Nrd7u(R1xc`GI35(%xl@csWKb-fjILbKp%@@O5pHab6)`(0-~xmSQm^kZubj%D94JcoxuGXo(tmb zuRe-u9AfdTUQ7CYmpO(j-8}uGQziK6PL0uAV6r9U)8?Nat3d}23WLc9+@Cs;m<(N? zX2Q2Hnc}+iOv|B$`k%K3Db$C1VLwdHrM5m$JS)D`gf_F5l=oOzR$x-HF|Zm@Y&GWiN|*s;2b= z>Blj(QwW7e?PGCN)Ba&3FT&wz^7NI1YF>9g0jY}K^JWIjGuH;(>&B-8EXRbp1laO3 z@|fcAYk+4WR44!`#jUB$U?*+?`z7WpCcw9F-q-$^ljb_!{uyxuWR0jS!ktg0OR+d( zSl(ZH%%m`sj&q(*OY)yDbZ=K$}m%)rmvzQH5KlHGM^o# zjL{kqrM^{K#T&r$Sdua@3O#p69rFXq<`$6U+MbiJVoJ~Ll@`3t{~ zodoelVwAm41ZdnTY{e4L#GCzjKCJBGZ;j(0R!t&5-Kjm%)k*d56=`tIJo!pG* zclm_$_xH7#1s%#J1$tOD#@%i~%vcr*j@3PJKYT)A3Sh}me~PdBM02DOjpCSQzTEbI zvj7-Z9z#CjOk;m%8l!)H7QF>-h3_cGvN&{{iKP5y z?!AD%jr5oT_cIlnN#K$o)2i{7df+zyDMDk}PI{K{^;B_-K}?c_nZyCE78-9_NgUpV zo|<7QH9GlT#>YZ(HIkKB2|0@Gw|zNfe6cu~zsVV*@K1b}8$!mQ)5OQc%bn^3!qy%k z-wH&ANCElxiW>8e3O>VbjIX@k1(_lHv_c>E6+cC7=L`fSX;o8McPir4fc*9$(zMO? zK=i2BM*r+_2fB3XrGT*2z2iaYuU!Dgtb%Fcp5)2mzmYdm{z88@UL{~tbA4xjzNf*Z zY}l62g7){Ka2^IRF&A3^B9QO}WD-EIK#DG{4-ppZDHar~y=EiD>6m=6xmBkEHV-y> z6m%XL>aBM!mN?#WK_;8v!l!lK@zAkTfYxN{Yi0;H1jRRtl87kulK~Yl`|!6`p;{X( z5OS44bsve_`jN|HZB?ON&Lvw3N1gktu)`yR!!y=is2U34ecAG}bB``J0Vmh@(dRE> zgMYR3opFkDwV*6|k7$>Yq_XR~=m1rT0v`d$b|Lc*(EHb25Djwqy(7mTf5cMa%_V6( zT~wVB4pGhYcU}gD4|DyxjhR*f^1C1WIKP&ECy@B;>(;XHe2UzG|Ju-apU9?b$5U>p zhq(eZPpvM)R$M?GDaF9wAw>8}c}-<(#UGbg&e(Y~Q3(q=HI)k06z6I{Oq0{x*uUv$ zcT;P9vh~jU&Avxd`j;^gNf3i>uIe=sj7nJuV~6zaSPFtfMp9V?D@KF%Cy&0t&4q4# z%G#C_yB@x@h|o;2pCZBl34OHr;Z)<)UYV0_aGkZfJRQp&s8rsiS@gV10kxj%j|C4K zo`4upXufF7Rur=xP;!;v!b;yuY$lbGVVDG~^TaXZFWmaQyA|{)IMW6>>HNfy0mBA= zD*U#(ddui6Ah5G&b+|rF;*k2+{3x6-rO&~Czo7Wp2Zu%2xG)A_5UP>XtH)(6PDx-Y ziPNqAHQ?@1^=^R(f{wD{<5%=prnS5g!7_;$yqy>{xUpux_+_kQ(wB~jeM9Iwk2HH;1H zQT-~B4$Sv+?su_r7lb#N$Zp(RQ>;b9eXuv{-s z>0I=CGeH_H1J~7Oj66Lng4jr}ZwDAh^Oi#rj*b%F2yRn3f}6Fr0yOK90U;9fcO|WZ ziI2Y{8dvk>(mWiBmK@1(oODo@hIJ9G_XBMbq?bjrI zn|Uox4r_8wv;zyB6JB!D;XyHkoH?h|v4KZyWCtb~G#?#li~9j}!YBPCXC^D8!!t=p z`PO)gnnccP*fA%?z85Q1l&gUI0cmtBelaiZ#B0oBq@i&DRw134SdY6T3$9+A168i} zpG(#9>z?hl)CfCtOi~n0yPL=n4;MNL9AA~RMZ}?Rk^{FznSQ5_pU=Q`QRJyveF|wn ziQ)ZE7n-MypD9Z~4hrz+9zk4hb$+%X!^*N!ofO%yJb(R>E+Q9Ya%OaI zjif?j1mIVdPG*e$BWEv}8@=%wl4-paEIf+$WEtR#RP(8kFI65-u^thN7=JymP{| zh(C%260MEY(Cx5y$VR#RT_ywdhx13;qBUa1iJK~yoh6aeH*0&!U?i2}igZOrJZ!YAy>Gs!umI5?bK zan`j3GvW=MEn8U(g>AdKm`aaxM<3W6o=&PD8+s&(g=2Y49MvN-Q8B~vf8LV<=pjc- ziE&N^yz=0DwUgmUNoiH$Ys36GdUpNF<9h6j52pK*G?L6`t!hxpCGFPp1Wd1g{Zf|Y z;KG@ke+7_KyNu!=g6;d;H%1Xc3>AuOGqsW1^ha#y0e7_XmW-V6sZ9!w8ntOhPpZ$1 z)|nqd?eY)e0X9Qa>;96u$d3x7~g3z>awhXhaz5Bf~B7`eF@5MvM`GFEUCh{4ZY7 zi7XQ^+H)pzzn_&a!Pq$AOygKGnR=41jRikD>$$|kZB3;tW9_CVxnfDA#3vbcvS#HozI zR87tXUfrAqXG%4~UtDzJRN_xsJD<5yF~Wk0FWi~+L*Fmx;Z@^pcX(&pAl-cAO1$*F zmPOy$M~kyiBR}28{xY=yx%p~vilu|{`uc=y?>yDi!>wPZ^Gp^Ps<0KMy zd%s+Xt_L)FmHi*-My z)alQ>yk46a`&UTDM%^l@i#z#Pn6KrsGfD%8F|FF2UMOK6f<5V?uk$m~UM6RJe?t z74wY{p>~u(4aSOGYT<2vnv&bU3 zy3m4>^`CmI!p6ABrF(Fw>9(~o!)h2#Z-^dJ2V1o0@Yjqb^j&;vhaX5Eq58@vxgaajh%uHtdw;ao$&){zvZ za~(IF5G#9Prh`J`W`gXd_2^v}l#UIhTdh&-Fhn;!P*9JzV>i_c4Q@^X?&+n>bu=tf zeOAmiOvaM0^zG4g4gTw2>4#K0+u24~vzQz$ZMSr}NnXV4f#)u^?WuVpLU$UY_771i z_F(X+f6I))+QJg9>iVDnXK?gXag>zuGdOsDq#IArwdb!Vi17RC(cn~0it}+O2MdJv&-hxyTZ7~=wZybt?+U){cR3Vh zR<}g}2R&+u-ETuOmrKQ5_G6gQO0z*tSPf@xGCd z@64{WE`3k+mQg80@{WRj9?%Xzns zNZkRcUo_WiW*Lz&<(GZ5nJCr8Bi7R8=uB9*sHxZ~>d&||g5d?7T4 zg4WG_#OPwNE^mKbaI}$lRJv`4deNhg=D-*Zl+X18uJ z9v6);4V)B7pX%}R%m6;#S2kTTwc8{Y+j&DL1w@yNJ=K+CT~t)pOy$FbV%f6al@(Vy z^6)_5ExOen$+bQt0s}hvNMcxUaLpn=*~BT-5q_<~ni3UD?rhGl#XgwS)q6l+Th(%K zE{>9UVcSD#mt?%=m8#kF(q;kbaE}O6O{nxIg5*}(Qo`Hbh30BRHT0_0Q)IcW-ue1? zk-6aO3M<9+dX@FHELd`j!MGn^Vc|aios86Zx|MSaeiN>h-_K9dk!NrxJ}$*C1|a`= z9-y|Fw1=Vw@tWC!oDbGH@?odYemRAtx@pTrsGQ0A5?Rn@gQ$@%8XY!AIK|2a^_6E> z)F0<;-IEp9yeV0(05jQ(8EVmKWWmB_Bn#=-05U#beXP?5(laEcpHY{Wy*lRzdFFZWH^o&Mu9MeE9zF3&*c2uL z$vQ|;S((vo$-EPIZqyX7`JpcdyBa#iXN5;%Vs3K*QZH9Ss_g&8@BR#Ljq%`3G!Rn>^^GaFDdvxRSNM{L}7rs3;3;K`bThlMncE zzb#U6IMz%@*u?y2SLJ-dH0=*6Hah zhKxVc;{`Ke;1u7#B#Z)_Y@fb7T`qRIAAj_iSA3bkD3rt0={Rbb){k`vN>E&{6=ND< zf@wINO}70c`7)+3E!!zy^kX<5E}bHL^@UEwhlqx~TLHLh67u;3d$$ssgUh#5oEe7w zj=fD5xN!bMLxbu`V|_kz^0eK<#7ZOoz|KgFimlFGjaGT{9NfOhDCnH50f&mQsG1_h zWT@bxFi_*h+kP;DU3}VlwVYC?0Jt99PO#Z76#<^en)t>$>Mhhd&fbT%d=^b~5bxMU zoCY&VJtPi>xk&Q-Y>T{f5(eD+(n2{t1eQB_2vK=|BW2voSGO{?8nD~P(g)l{$+{Vl zhyU4QM#m+GS37vwG`Clva&RH^s}?DgS6n&duKC%&^GQq1B%>GvA@feq`@OaXX%k6< zXuw}F1Y`-V1}eB78zKD$@WIz4oc(^)Ne1ES;I7|@G7hhS>i)Nm0n8U!zVJj#Bt)Re zxe?+1h)@FYbP^4+F+0gW(ogHOV;#R|5aU%V?xQEhe|@t5%bwn!J+>mbiIIf+TvR}* zLn!}gPoNU?=68~|cBUJMC4N2%z!;h7>HOzKCv^0?jVaq5#N))6;!aX=Tqt+aMG}$3>|tXpDx!=!ZT4e&QRpwS4*0t zE>r`}w776r_lp>nHn)j;%CIgzKUc@X7DU7|30K|dj^$QT{^Bc9{ha5^W%)gwT!?WD|GaW*aM+>v(cIJ-YuO>YJ6NWOo;-h7vW58d5rEnLy0BW#&6CsKjX8`xT=I`{>>0+X#)fq9xBe{P#B9Y(7Vi zobR_RV^`ydr6F82Vc>iT*cRqby;T9j+d*hj#XSqxw0`HqYtohZabM8fhvJP{{gjd| zZPJ`EeF0NG_?X&SU>PxN-e=vS~v$E9TUA^^h3hwHvL zfA+#x)*gZ|o&E)Pb(36~|MkU7IX{avEbl*YVFhgTo(QaD!X?Z?dj7G$14l_x!%TEB zYEa@!z^syd(7k4tGe(B^yjbut!oDrEeh@>J~ZodY(pnk%9oif5dk$3$^*^GW+ zc!g^;5}wo9_NA}F0zZSo@vHH}(C5U6M^LX1M3apI4ZmnO$hIbCVk*_&c#!0P_7=>c zX(K2lCVcr|H!GwwED6JVFp!kV2Z;iq}>h{Heb2q@-)c&&RRw zW5=xl9D*K1do;`)bB+Gz^j)Y(L`SDC99yavA@EkA8qPYOO{=ckjw}=FKS>VF1a}J( zy+1EC*?w%d3O67^NhV#dWySgc0(NWqqeM3$xr&rh2{}q2dXJvU=cn^C?_igVMt*|j zi>PStYV9A}Nk&(YgJD~2^1z<&bZ!l>utA;rtr+qk47;8XT}->Jm|9>MAjSs~Sa16t zn1V8sq!Q`=={nc%Z)*|p$PD`PgJg+b^^rIbMG8f0ra1P}7vo#g)Lh;-1NrWLbg}r0 zc)UdeOj(QwX*JCJYMk8l4OSb8%WApj7Dw%`h`!53oI&h}cSy>oAkNh$JHL$zOZ!y6 z=h5~*9^)X3v-eG-ny*7CN0s70kkbZ^KS{2%6ML=sl3o1`;aWx#s{AM#=)j}<16Qvg z6Yc$G%-&|Hd{ud9sj7vl=Fl6$V8aEF`idoSr7vY6cPdaS)c#$vzz<*G(Q-ZRAcXJw zFwpP*3)&}x!Ej~kLsTn+XAcN*7?;w_PX-+NV0WCqELZ2z9Jn%!NFbDwU!~yqK%R&S z8VEfT!AN227~8uUqDv(h-_IRpIMAjm9$X$^16%?S9fcf&PEcw(Bn9*}6;QbwE>Hn| zaOacXZj%m<4~#<@WNw^r$@C+71~g1v@IP(V8sK+S2_bB|2Qw1p3oZ-= z=CAl!B5G=Xo0uN(LU;~p@eaG`F04es6Q(N$*!@>jCq!E|kSt^01`*gAYhFF1ZLk;4mC{f&2UP)u$m_}*HtA@0y%SGh zqNN%2P!D+*DhWbDcMW>0kAgf}u7ikeqC7m9ogrx0JfF)e-<6e4ldvFPk6eyZ(Akuj z@l12ojI;}YGLpinolB^dr(BVMcv7=anH&?Z!?V+Hu!i5?RYC8dX4ilHv|W?js%FM* z8rFYkjep6!AvHh$!*KkZdR3QW;g=8xbO(V^92JdCV&Oj|UhXmTY2*JU4OD~8rgY>3 zzqOOfEXQDSl8{jeyz(Ket@ToPg}}_*ncREe(pe)Uj*vr6!>!*7=3E~DQM$eQ@W6^f*mxg#xAW}VmPEEZa^5o#4();SeRgD1t5j$bS z&}nE6Nr)w}E~jd_dP9k?9X}xMQ(gsJv4*?&q4@OLYfZEc zR@mrw!zzs{gFV3mMbP_`D8ll%Y+&?Ayf6ZkI+;QGea@anD8s5Gsd@3iZ$u})Hlc+! zinLmqI6`=u*W=3dy1l|mM{I*5+E%s1f|4G97iLf$8;ze#jttk$mN4kg6v3o^Mr_$p zNAb)&6d~XW7GC*S)nGVzUd8wwjaK88>$50PO0X1a$DphOgK6BOCJV1Bes!&4n@Ip# zHy6x{{N1~F!ghEh4Z7Q(Kxh=#u<4MdK?J--gl?86{|dLc<>;igy}Ia$BzpkJ+kWBy z2xilp5YcRW7n;BlM%-;t#_DKhs9j_n$YAKvf#nKOfuDnD95ADJhl>UjlfFRX$W>f0o;*kPPX9Rt%AM$*V z1Jo?|ebs&dtHIh^X*P(W$8o>o&b{dQ(yLtW*O8XK--;ZfRF|BEKBGeqHESWJ5N!Yo zA9dInn4&yZ_v$AYiz+~Fv+yH$Uq+@H3ezpdPxQ&nZMxxiD=!8I7zX&#SGUxr{03CH zuiAp*-%FlValw<``fnLNzV`O_(ok8uWS~*VzLs)BQFPU`(~wIsoJK+pV2;$+I`4}I z!Fw?pZl(Tuq)S1#loHENjm>$%d4E(Sv8Z+W)536r0MY4X!PYx075Kd;fhA)|W)9`! z?SEC0AAC>6FJ1rorsc4`@!Tn(Ib(k_+a{RQ$6xP^okLiTmFCF1tRZJWNq|?rD@+{( z1<8`pA2#n8rx-(^n>@L*dpPke2IBYu#v!G@;%q@9kToFlw3RYC%d*4{M#9pgs_#g& z#rl-FDhj<+93Q+SPCL1hZ^cDGQeq&LJbO` zSuZ2Nx%wMt=sg$@gyE@fxd6D9vBJL^7Zg|sGrib~9MU`;X)2edyF>y(PIN0oQefej zq@&~Cy7T_f>wFG<^r_Q~h{{WUQ8{2xrf7`*A$dAs* z{Vk_w{2k_2M_;4P^lU9&vkGK-USoze8k7vZM6YDS;RDMkUsyeazdO;ug^NM57g!zq z*16>s3XmM24vq|rdPf3e8$`oG|ML5LD<6Fzw^n&ucyjgvQlbMgL||?&^U*`k>ENi@ z`;1|jofK9=G@Ww$4{N;r*59S}3x}2poP*_E3l+4je6>=)S*Hw_9LcOZ{`mLgGSSTL zdtj=OTv=LST9w5UU+qM~bBnCbqxmt`a-go?6Fb!hd!5k08ePvU@zci(Hk9FrFv0{} zrV0@V019EiWrm{I6hYh21lSeMG-&T3%?6!6uO{lm1sitA{cFvh$&L!r&dP&dxHy2% zLad%%=qYKu=8gATmRLBO?D{?uAo@E^9ub5_&Ora1(eO!%yn8T0vTUHq9XI(^mSO~_ z(>3PxVm*;X{fDWoh6mQqm4T(=8+;cJ^x{!5UG=}qInrub8`wD&l%4E75-NMOLNI%|PyGGfyqXH5^C^J!Wx}MF+ZFnES1qvMN-zmQm{T$*DIU<-HH8QHDYd0|X za~~Vf1t<#}`6DbAu|2`*RN|A=D=gvjruRZOe&ff`^GI9XGNIqCvJT~Egb{H)Blf7~ zM7_llWjX!t#^2uM=Qk~{I!Kao45o*xq}-5gT)g$%d{R3sut|6-oQ=)bA|JT*I5-ru zS}zUkh`K(Rm#^S(Kg$RT1eOCV2I>n>_0Vfc16cHPQc#j(d*&!Xat@W8>HcSzNyE=h zLvc%Ck;{827)lDhCw~?5l;_*R3S3cintpL4b?u_1^J}>BiM@h@6qWmcr>H11&@^*z z^`Cg1RL`x2Dotz8)NsRdxul~Qg$ZyuDd0;LqMnj@M4rgU7RolSVDKevy)i*7}! z;3E#mXJS0dNEsfC==p9uV6WJ$tCGSC57;fAbNRu*&u_lt@DE)7ThxI!yg$BAjpz3clwK0+EeVKXNh#2z*!teBAUHoBEhn9NwWxLx092GHhJxPnSSp90N}%a{tEztE2c^GL$_X|Vb^!W{~gNw!0m(mT7hR=QSW$U zZ$zWyXUS^-{T|&n<~`S46!@1RZw;3SQ>0p}4+5!-87+Iz$F*f;H=g_X!5Z%{X#hTM|x^0p`V@LzXg5>e5Uhr9p!p;I9FPgqpwMg?M>> zUXnH5pDupZ{?9HkMc92w?Y}rl^USCD7j2Gt|91;m%Mg`St9RCAv)S@y&Ww}glV+|v z3yxe84cIlzB@B+~lMjhE6&5x(mi68qPS9tkO5tGh2=N)V} zUZ^Qu+)?*!`o^Do_(Q%Pa?Ws`x4~q-`8g)$HF`!22KOs|$Hnb<#d=ltetp&?87obt zRKa4aiA;}}yBP#_?=%(MDH(dr(e15&tLpu~pA=tf?Js-!>cP4CWhHCYevkZg=S!6S zj+kBZgcr}Qz2!5*;o8Gl*MF={fBsTyuH)?d{Uw&i{$Br6%e#A_>ib*FTddQ!ZQ3q! zTi#g7!ICkPQ>m+i)$pO1(5A1g>h+u@$4qCN)jv7CdT;IaLziydpTX_(xm31AEj91m zA!fJtbvjbtZS1<9ZO?G+jSzFVA(7fUY0|M2QNO~DM_Pf&voz)@P4bv3d^JNbYL)g4 zr<=2-m#lh|pMLa{pv9zfuS4B<6xtL7PfX)5V^YbQ7kMab>y{N!aST?b`(CN7jgb^k z^UA-yD<*sMysKX%ZcIIXU@!lHM>U7E|K0nv@0r}*rk5Ws?fkw$g~8F+DlT-h%7HF# z%lrPtJ*QlfX5Bx%>12R-ifq)XcQK!zhiCC^wT-y)(q_so&mB_XiaNbJC+|D{wEh0# z+w#Q)m$iZysOIl+D`ZsjNN9NHk|rw1UJx literal 0 HcmV?d00001 diff --git a/ecs/jskult-webapp/src/static/lib/fixed_midashi.js b/ecs/jskult-webapp/src/static/lib/fixed_midashi.js new file mode 100644 index 00000000..f386d1b9 --- /dev/null +++ b/ecs/jskult-webapp/src/static/lib/fixed_midashi.js @@ -0,0 +1,165 @@ +/* + * FixedMidashi JavaScript Library, version 1.11 (2018/12/03) + * http://hp.vector.co.jp/authors/VA056612/fixed_midashi/ + * Copyright (C) 2012-2018 K.Koiso + */ + +/* Exsample */ +/******************************************************************* + + + + + + ... + + + + +
+
+ ... +*******************************************************************/ + +var FixedMidashi = new function() +{ + +var DISABLED = false; + +var ROWS = 1; +var COLS = 0; +var DIV_FULL_MODE = false; +var DIV_AUTO_SIZE = "both"; // both | width | height | none +var COPY_ID = true; +var BORDER_COLOR = null; +var BORDER_STYLE = null; +var BORDER_WIDTH = null; +var BOX_SHADOW = null; + +var DIV_MIN_WIDTH = 150; +var DIV_MIN_HEIGHT = 150; + +var DIV_BODY_SCROLL = 1; + +var RADIO_PREFIX = "_FIXED_HEADER_"; + +var POS_FIXED = 1; +var POS_ABSOLUTE = 2; +var POS_MIX = 3; +var _positionMode = -1; + +var h="checkbox",f="select-multiple",e="select-one",g="change",m="radio",l="INPUT",cc="fixed",bc="transparent",ac="0px",Zb="absolute",Yb="none",Xb="hidden",Wb="auto",Vb="",I="class",Ub="THEAD",Tb="scroll",n="resize",Sb=-1,Rb=null,Qb=true,Pb="both",Ob=false,Nb=this; + +var TIMER_WATCH_TABLESIZE=3e3,TID_HEADER="H",TID_NUMBER="N",TID_CORNER="C",PX="px",HEIGHT_MARGIN=10,MIN_SIZE=1,_isIE=Ob,_IEver=0,_isIE11=Ob,_isFirefox=Ob,_isOpera=Ob,_isSafari=Ob,_isChrome=Ob,_isMobile=Ob,_isBackCompat=Ob,_fixedHeaders=Rb,_fixedList=Rb,_body=Rb,_resizeTimerId=Rb,_execFlag=Ob,_IE_retryCount=0; + +Nb.create=function(){var f="_fixedhead";if(DISABLED)return Sb;if(!document.body.getBoundingClientRect)return -2;if(!window.addEventListener&&!window.attachEvent)return -3;var l=(new Date).getTime(),h=_fixedHeaders==Rb;if(!h)for(var b=0;b<_fixedHeaders.length;b++)_fixedHeaders[b].removeAllTables(Ob);for(var i=document.body.getElementsByTagName("TABLE"),e=[],b=0;b=0;if(_isIE){var j=a.indexOf("msie"),m=a.indexOf(";",j);_IEver=Number(a.substring(j+5,m))}if(!_isIE)_isIE11=a.indexOf("trident")>=0;_isFirefox=a.indexOf("firefox")>=0;_isOpera=a.indexOf("opera")>=0;_isSafari=a.indexOf("safari")>=0&&a.indexOf("chrome")<0;_isChrome=a.indexOf("chrome")>=0;_isMobile=a.indexOf("mobile")>=0;if(_isIE&&_rect(i[0]).right>=1e4&&_IE_retryCount<10){setTimeout(FixedMidashi.create,10);_IE_retryCount++;return -5}_isBackCompat=document.compatMode=="BackCompat";_body=_isBackCompat?document.body:document.documentElement;if(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat))_positionMode=POS_ABSOLUTE;else if(_positionMode==Sb){_positionMode=POS_MIX;if(_isMobile)_positionMode=POS_FIXED}if(_isIE&&_IEver==8&&!_isBackCompat)_fixedList=new _FixedElementList;if(_isFirefox)g=_createObjectForFirefox();_isChrome&&_createObjectForChrome();_addEventListener(window,n,_onBodyResize);_isMobile&&_addEventListener(window,"orientationchange",_onBodyResize);(_isFirefox||_isSafari)&&!_isMobile&&TIMER_WATCH_TABLESIZE>=0&&setInterval(_checkZoom,TIMER_WATCH_TABLESIZE);_addEventListener(window,Tb,_onBodyScroll)}_fixedHeaders=[];for(var b=0;b=Math.min(B.length,11))d=0;if(j<0||j>=Math.min(r,11))j=0;if(!c||c<1||c>100)c=Sb;if(!b||b<1||b>100)b=Sb;if(F>1)s=Ob;if(m<0||m>1)m=1;var n=document.createElement("DIV");if(f!=Rb&&!_setStyle(n,"borderColor",f))f=Rb;if(g!=Rb&&!_setStyle(n,"borderStyle",g))g=Rb;if(h!=Rb&&!_setStyle(n,"borderWidth",h))h=Rb;if(i!=Rb&&!_setStyle(n,"boxShadow",i))i=Rb;if(l!=Rb&&!_setStyle(n,"backgroundColor",l))l=Rb;var w=Rb,x=Rb;if(p!=Rb&&!(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat)))w=document.getElementById(p);if(q!=Rb&&!(_isIE&&(_IEver<=7||_IEver<=9&&_isBackCompat)))x=document.getElementById(q);var y=Rb;if(k.parentNode.tagName=="DIV"){var u=k.parentNode,o=u.currentStyle||document.defaultView.getComputedStyle(u,Vb);if(o.overflowX==Wb||o.overflowX==Tb||(o.overflowY==Wb||o.overflowY==Tb))y=u}return new _FixedHeader(y,k,r,d,j,c,b,s,v,z,C,f,g,h,i,l,m,w,x)}function + _onBodyScroll(){for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].onBodyScroll()}function + _onBodyResize(){if(_execFlag)return;_resizeTimerId!=Rb&&clearTimeout(_resizeTimerId);var a=function(){_execute(n)}; +_resizeTimerId=setTimeout(a,500)}function + _execute(b){_execFlag=Qb;_resizeTimerId=Rb;for(var a=0;a<_fixedHeaders.length;a++)if(b==n)_fixedHeaders[a].initOnResize();else _fixedHeaders[a].init();_resizeSourceDiv();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].main();_execFlag=Ob}function + _resizeSourceDiv(){for(var b=Ob,a=0;a<_fixedHeaders.length;a++)if(_fixedHeaders[a].hideAllDivs(Qb))b=Qb;if(!b)return;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeSourceDiv1();var d=document.body.style.overflowX,c=document.body.currentStyle||document.defaultView.getComputedStyle(document.body,Vb);if(_body.scrollWidth<=_body.clientWidth&&c.overflowX!=Tb)document.body.style.overflowX=Xb;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeDivHeight();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeDivWidth();document.body.style.overflowX=d;for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].resizeSourceDiv2();for(var a=0;a<_fixedHeaders.length;a++)_fixedHeaders[a].hideAllDivs(Ob)}function + _FixedHeader(a,d,E,p,y,v,B,xb,Z,F,G,J,K,L,zb,Q,bb,M,N){var o="CLIENT",j="TBODY",g="1px",q=this,f=a!=Rb,b=Rb,c=Rb,e=Rb,rb=0,qb=0,hb=Vb,gb=Vb,U=Rb,W=Rb,u=[],yb=[],Y=0,fb=0,Cb=d.style.zIndex?d.style.zIndex:0,r=Ob,x=Ob,k=0,n=0,R=0,S=0,ib=0,mb=0,lb=0,ob=0,eb=0,db=0,X=0,Ib=d.style.display,jb=Sb,nb=Sb,m=Rb,z=Sb,A=Sb,i=0,l=0,V=Rb,T=Rb; +q.init=function(){if(Q==Rb){var e=f?a:d,b=_getBackgroundColor(e);if(b==Rb){var c=e.parentNode;while(c){b=_getBackgroundColor(c);if(b!=Rb)break;if(c.tagName=="HTML")break;c=c.parentNode}if(b==Rb)b="white"}Q=b}if(f){_addEventListener(a,Tb,ab);Jb();X=_offsetWidth(d)}if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);wb()}; +q.initOnResize=function(){A=Sb;z=Sb;nb=Sb;jb=Sb;if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);if(f){if(r||v>0)a.style.width=Vb;if(x||B>0)a.style.height=Vb;X=_offsetWidth(d)}wb()}; +q.removeAllTables=function(d){b&&w(b);c&&w(c);e&&w(e);b=Rb;c=Rb;e=Rb;if(f){_removeEventListener(a,Tb,ab);if(d){if(r||v>0)a.style.width=Vb;if(x||B>0)a.style.height=Vb}}}; +q.hideAllDivs=function(h){if(!f)return Ob;var d=b==Rb?Rb:b.parentNode,g=c==Rb?Rb:c.parentNode,j=e==Rb?Rb:e.parentNode;if(h){d&&I(d,DIV_MIN_WIDTH);g&&H(g,DIV_MIN_HEIGHT)}var i=h?Yb:Vb;if(d)d.style.display=i;if(g)g.style.display=i;if(j)j.style.display=i;(r||x||v>0||B>0)&&Fb(h);if(h){r&&t(a,DIV_MIN_WIDTH);x&&D(a,DIV_MIN_HEIGHT)}return Qb}; +q.resizeSourceDiv1=function(){if(!f)return;var e=m!=Rb?m:d;if(v>0){k=_body.clientWidth/100*v;k=Math.max(k,DIV_MIN_WIDTH);var c=_offsetWidth(e)+eb;c=Math.min(c,k);t(a,c)}if(B>0){n=_body.clientHeight/100*B;n=Math.max(n,DIV_MIN_HEIGHT);var b=_offsetHeight(e)+db;b=Math.min(b,n);D(a,b)}}; +q.resizeDivHeight=function(){if(!f)return;if(!x)return;if(_body.scrollHeight>_body.clientHeight){var e=Math.max(_body.scrollHeight-_body.clientHeight,0);a.style.height=Math.max(_body.clientHeight-30,MIN_SIZE)+PX;var g=Math.max(_body.scrollHeight-_body.clientHeight,0);n=_offsetHeight(a)-(g-e)}else{a.style.height=_body.clientHeight+PX;var h=Math.max(_body.scrollHeight-_body.clientHeight,0);n=_offsetHeight(a)-h}n--;n=Math.max(n,DIV_MIN_HEIGHT);var c=m!=Rb?m:d,b=_offsetHeight(c)+db;b=Math.min(b,n);if(xb)b=n;D(a,b)}; +q.resizeDivWidth=function(){if(!f)return;if(!r)return;if(_body.scrollWidth>_body.clientWidth){var e=Math.max(_body.scrollWidth-_body.clientWidth,0);a.style.width=Math.max(_body.clientWidth-16,MIN_SIZE)+PX;var g=Math.max(_body.scrollWidth-_body.clientWidth,0);k=_offsetWidth(a)-(g-e)}else{a.style.width=_body.clientWidth+PX;var h=Math.max(_body.scrollWidth-_body.clientWidth,0);k=_offsetWidth(a)-h}k--;k=Math.max(k,DIV_MIN_WIDTH);var c=m!=Rb?m:d,b=_offsetWidth(c)+eb;b=Math.min(b,k);if(xb)b=k;if(_isIE)b--;t(a,b)}; +q.resizeSourceDiv2=function(){if(!f)return;var b=m!=Rb?m:d;if((r||v>0)&&a.scrollWidth>a.clientWidth&&_offsetWidth(a)0)&&a.scrollHeight>a.clientHeight&&_offsetHeight(a)0)&&X>_offsetWidth(b)&&_offsetWidth(a)=1||Math.abs(_offsetHeight(d)-qb)>=1||_colsWidthList(_cells(d.rows[0]))!=hb||_rowsHeightList(d.rows)!=gb)return Qb}; +q.main=function(){var h=_offsetWidth(d),g=_offsetHeight(d),b=rb!=h,a=qb!=g;rb=h;qb=g;var c=_colsWidthList(_cells(d.rows[0]));if(hb!=c){hb=c;b=Qb}var e=_rowsHeightList(d.rows);if(gb!=e){gb=e;a=Qb}var i=Gb(b||a);(i||b||a)&&Hb();f&&Lb();if(f){ub();ab()}else kb(Qb)}; +function Gb(l){if(l){b!=Rb&&w(b);c!=Rb&&w(c);e!=Rb&&w(e);b=Rb;c=Rb;e=Rb}var i=Ob,j=d.rows,k=f?d.parentNode:_body,h=Ob,g=Ob;if(f){h=a.clientHeight0&&h)if(_rowsHeight(j,p)+30>=k.clientHeight)h=Ob;if(y>0&&g){var m=_cells(j[0]);if(_colsWidth(m,y)+30>=k.clientWidth)g=Ob}if(y>0&&g){if(c==Rb){c=pb(TID_NUMBER,j.length,y);if(c!=Rb)i=Qb}}else if(c!=Rb){w(c);c=Rb}if(p>0&&h){if(b==Rb){b=pb(TID_HEADER,p,E);if(b!=Rb)i=Qb}}else if(b!=Rb){w(b);b=Rb}if(b!=Rb&&c!=Rb){if(e==Rb){e=pb(TID_CORNER,p,y);i=Qb}}else if(e!=Rb){w(e);e=Rb}return i}function + Hb(){if(b!=Rb){t(b,_offsetWidth(d));cb(b)}if(c!=Rb){var g=_colsWidth(_cells(d.rows[0]),y),f=_colsWidth(_cells(c.rows[0]),y),a=f-g;a!=0&&t(c,_offsetWidth(c)-a);cb(c);D(c,_offsetHeight(d))}if(e!=Rb){t(e,_offsetWidth(c));cb(e);D(e,_offsetHeight(b))}}function + Lb(){var j=1,d=b==Rb?Rb:b.parentNode,f=c==Rb?Rb:c.parentNode,g=e==Rb?Rb:e.parentNode;d!=Rb&&s(d);f!=Rb&&s(f);g!=Rb&&s(g);if(d!=Rb){I(d,a.clientWidth);H(d,_offsetHeight(b));var i=_rect(b).bottom-_rect(d).bottom;i>0&&H(d,_offsetHeight(b)+i);d.clientHeight>=a.clientHeight&&H(d,a.clientHeight-j)}if(f!=Rb){H(f,a.clientHeight);I(f,_offsetWidth(c));var h=_rect(c).right-_rect(f).right;h>0&&I(f,_offsetWidth(c)+h);f.clientWidth>=a.clientWidth&&I(f,a.clientWidth-j)}if(g!=Rb){H(g,d.clientHeight);I(g,f.clientWidth)}}function + Jb(){var b=a.cloneNode(Ob),c=d.cloneNode(Ob);b.style.position=Zb;b.style.left=ac;b.style.top=ac;b.style.minWidth=g;b.style.minHeight=g;a.parentNode.appendChild(b);var e=document.createElement("DIV");e.style.position=Zb;e.style.left=ac;e.style.top=ac;a.parentNode.appendChild(e);var i=_rect(a),f=_rect(b);S=i.top-f.top;R=i.left-f.left;c.style.width="50px";c.style.height="50px";var k=document.createElement(j),m=document.createElement("TR"),l=document.createElement("TD");l.appendChild(document.createTextNode("x"));m.appendChild(l);k.appendChild(m);c.appendChild(k);var o=b.offsetWidth,n=b.offsetHeight;b.appendChild(c);r=b.offsetWidth!=o;x=b.offsetHeight!=n;if(r){if(v>0||Z!=Pb&&Z!="width")r=Ob}else v=Sb;if(x){if(B>0||Z!=Pb&&Z!="height")x=Ob}else B=Sb;eb=_offsetWidth(b)-_offsetWidth(c);db=_offsetHeight(b)-_offsetHeight(c);var h=_rect(e);mb=f.top-h.top;ib=f.left-h.left;ob=_rect(c).top-f.top;lb=_rect(c).left-f.left;b.parentNode.removeChild(b);e.parentNode.removeChild(e)}function + wb(){if(p==0&&y==0)return;var a=d.cloneNode(Ob);a.style.position=Zb;a.style.left=ac;a.style.top=ac;a.style.width=Wb;a.style.height=Wb;a.width=Vb;a.height=Vb;var i,m=_getElementByTagName(d,Ub);if(m==Rb)m=_getElementByTagName(d,j);if(m!=Rb)i=m.cloneNode(Ob);else i=document.createElement(j);a.appendChild(i);d.parentNode.appendChild(a);for(var x=Kb(),v=p>0?p:1,t=d.rows,q=0,c=0;c0)u[h]=Math.min(u[h],k);fb=Math.max(u[h],fb)}a.parentNode.removeChild(a)}function + Kb(){for(var g=p>0?p:1,l=d.rows,f=new Array(g),b=0;b=i.length)break;var e=i[h];if(e.rowSpan>=2&&e.colSpan>=2)for(var c=0;c=g)break;for(var j=0;j=2)for(var c=1;c=g)break;f[b+c][a]=Ob}if(e.colSpan>=2)for(var c=1;c=i.length)break;var e=i[h];e.$FXH_COLINDEX=a;if(e.colSpan==1)k[a]=Qb;h++}return k}function + pb(e,v,x){var n=" fixed_header_display_none_at_print",c=d.cloneNode(Ob),r=_getElementByTagName(d,"CAPTION"),s=_getElementByTagName(d,Ub),u=_getElementByTagName(d,j),k=Rb,p=Rb,o=Rb;if(r!=Rb){k=r.cloneNode(Qb);k.style.backgroundColor=Q;k.style.overflow=Xb;if(e!=TID_HEADER){k.innerHTML=" ";k.style.height=_offsetHeight(r)+PX;k.style.backgroundColor=bc}c.appendChild(k)}var t=0;if(s!=Rb){p=s.cloneNode(Ob);c.appendChild(p);t=s.rows.length}if(u!=Rb&&t=t.length)break;var a=t[l];l++;if(c+a.rowSpan>x)return Ob;f[e]=c+a.rowSpan;if(a.colSpan>=2){for(var h=1;hq)return Ob}_radioCtl(a,"backup");var j=a.cloneNode(Qb);_radioCtl(a,"restore");_linkElement(j,a,g,F,G,Qb);b.appendChild(j);try{var o=c+"."+a.cellIndex;if(u[o]!=undefined){var D=u[o]+yb[o];j.style.width=_offsetWidth(a)-D+PX}else if(_isIE&&_IEver<=8&&a.colSpan>=2)j.style.width=a.clientWidth-fb+PX}catch(E){}var i=j.style;if(c+a.rowSpan==p&&g!=TID_NUMBER){if(J!=Rb)i.borderBottomColor=J;if(K!=Rb)i.borderBottomStyle=K;if(L!=Rb)i.borderBottomWidth=L}if(e+a.colSpan==y&&g!=TID_HEADER){if(J!=Rb)i.borderRightColor=J;if(K!=Rb)i.borderRightStyle=K;if(L!=Rb)i.borderRightWidth=L}e+=a.colSpan}if(_isIE&&_IEver<=9&&l==0){b.style.height=ac;var A=_rect(k).bottom,m=b.parentNode;if(m.tagName!="TABLE")m=m.parentNode;var r=m.rows,n=c-1;while(r[n].style.height==ac)n--;var B=A-_rect(s[n]).top;r[n].style.height=B-Y+PX}}_radioCtl(v,"sync");return Qb}function + s(b){if(b.style.position==cc)return;var f=_rect(a),e=_rect(b),d=e.top-f.top,c=e.left-f.left;if(_isIE){if(d==Sb&&b.$TOP_DIFF==1)d=0;else b.$TOP_DIFF=d;if(c==Sb&&b.$LEFT_DIFF==1)c=0;else b.$LEFT_DIFF=c}if(Math.abs(d)>=1)b.style.top=_pixel(b.style.top)-d+PX;if(Math.abs(c)>=1)b.style.left=_pixel(b.style.left)-c+PX}function + w(a){if(f)a=a.parentNode;_unlinkElement(a);a.parentNode&&a.parentNode.removeChild(a)} +q.onBodyScroll=function(){if(M)i=Math.max(_rect(M).bottom,0);if(N)l=Math.max(_rect(N).right,0);if(f){ub();return}if(_positionMode==POS_ABSOLUTE){if(!_isMobile){if(_getBodyScrollTop()!=A){h(b,Ob);h(e,Ob)}if(_getBodyScrollLeft()!=z){h(c,Ob);h(e,Ob)}}V!=Rb&&clearTimeout(V);V=setTimeout(kb,200)}else kb()}; +function kb(k){V=Rb;var j=_getBodyScrollTop()!=A,g=_getBodyScrollLeft()!=z;A=_getBodyScrollTop();z=_getBodyScrollLeft();if(j&&g)k=Qb;var f=_rect(d),o=b!=Rb&&f.top=b.offsetHeight+i,p=c!=Rb&&f.left=c.offsetWidth+l;b!=Rb&&h(b,o);c!=Rb&&h(c,p);e!=Rb&&h(e,o&&p);if(_positionMode==POS_MIX&&b!=Rb){var a=b.style;if(k||j&&a.position==Zb){a.position=cc;a.left=f.left+PX;a.top=i+PX;if(e!=Rb)e.style.top=a.top;O(Ob)}else if(!j&&g&&a.position==cc){a.position=Zb;a.left=z+f.left+PX;a.top=A+i+PX;vb()}}if(_positionMode==POS_MIX&&c!=Rb){var a=c.style;if(k||g&&a.position==Zb){a.position=cc;a.left=l+PX;a.top=f.top+PX;P(Ob)}else if(!g&&j&&a.position==cc){a.position=Zb;a.left=z+l+PX;a.top=A+f.top+PX;tb()}}if(_positionMode==POS_FIXED){if(b!=Rb&&g)b.style.left=f.left+PX;if(c!=Rb&&j)c.style.top=f.top+PX;if(b!=Rb&&b.style.top!=i+PX){b.style.top=i+PX;if(e!=Rb)e.style.top=b.style.top}}if(_positionMode==POS_ABSOLUTE&&k){if(b!=Rb)b.style.left=z+f.left+PX;if(c!=Rb)c.style.top=A+f.top+PX}if(_positionMode==POS_ABSOLUTE&&(j||g)){var n,m,q=_isMobile?1:4;if(b!=Rb&&j){b.style.top=i+A-_offsetHeight(b)+PX;if(e!=Rb)e.style.top=b.style.top;n=_offsetHeight(b)/q}if(c!=Rb&&g){c.style.left=l+z-_offsetWidth(c)+PX;if(e!=Rb)e.style.left=c.style.left;m=_offsetWidth(c)/q}T!=Rb&&clearTimeout(T);sb(j,g,n,m)}b!=Rb&&g&&O(Ob);c!=Rb&&j&&P(Ob)}function + sb(m,j,k,h){T=Rb;var g=_getBodyScrollTop()+i,f=_getBodyScrollLeft()+l,d=g,a=f;if(b!=Rb&&m){d=_pixel(b.style.top)+k;if(k>0)d=Math.min(d,g);else d=Math.max(d,g);b.style.top=d+PX;if(e!=Rb)e.style.top=b.style.top}if(c!=Rb&&j){a=_pixel(c.style.left)+h;if(h>0)a=Math.min(a,f);else a=Math.max(a,f);c.style.left=a+PX;if(e!=Rb)e.style.left=c.style.left}if(g==d&&f==a){if(b!=Rb&&m){vb();if(e!=Rb)e.style.top=b.style.top}if(c!=Rb&&j){tb();if(e!=Rb)e.style.left=c.style.left}return}var n=function(){sb(m,j,k,h)}; +T=setTimeout(n,20)}function + ub(){if(DIV_BODY_SCROLL==0)return;if(_positionMode==POS_ABSOLUTE)return;var f=b==Rb?Rb:b.parentNode,g=c==Rb?Rb:c.parentNode,j=e==Rb?Rb:e.parentNode,k=_rect(a),o=_rect(d),p=0;if(_isIE11)p=1;var m=Ob,n=Ob;if(f&&(DIV_BODY_SCROLL==2||a.scrollHeight-p<=a.clientHeight)){var q=Math.min(k.bottom,o.bottom);if(k.top=_offsetHeight(b)){if(f.style.position!=cc){f.style.position=cc;f.style.top=i-mb-ob+PX}f.style.left=k.left-ib+PX;h(f,Qb);m=Qb}else{if(f.style.position!=Zb){f.style.position=Zb;f.style.top=S+PX;f.style.left=R+PX}h(f,a.scrollTop>0);s(f)}C(f)&&O(Ob)}if(g&&(DIV_BODY_SCROLL==2||a.scrollWidth<=a.clientWidth)){var r=Math.min(k.right,o.right);if(k.left=_offsetWidth(c)){if(g.style.position!=cc){g.style.position=cc;g.style.left=l-ib-lb+PX}g.style.top=k.top-mb+PX;h(g,Qb);n=Qb}else{if(g.style.position!=Zb){g.style.position=Zb;g.style.top=S+PX;g.style.left=R+PX}h(g,a.scrollLeft>0);s(g)}C(g)&&P(Ob)}if(j){if(m||n){if(j.style.position!=cc)j.style.position=cc;if(m)j.style.top=f.style.top;else j.style.top=g.style.top;if(n)j.style.left=g.style.left;else j.style.left=f.style.left}else if(j.style.position!=Zb){j.style.position=Zb;j.style.top=S+PX;j.style.left=R+PX;s(j)}h(j,C(f)&&C(g))}}function + ab(){var d=b==Rb?Rb:b.parentNode,f=c==Rb?Rb:c.parentNode,g=e==Rb?Rb:e.parentNode,i=d&&d.style.position==cc,k=f&&f.style.position==cc;h(d,a.scrollTop>0||i);h(f,a.scrollLeft>0||k);h(g,C(d)&&C(f));d!=Rb&&s(d);f!=Rb&&s(f);g!=Rb&&s(g);var j=a.scrollLeft!=jb,l=a.scrollTop!=nb;jb=a.scrollLeft;nb=a.scrollTop;if(d!=Rb&&j){d.$FXH_SCROLL_LEFT=a.scrollLeft;d.scrollLeft=a.scrollLeft;d.scrollLeft>0&&O(Ob)}if(f!=Rb&&l){f.$FXH_SCROLL_TOP=a.scrollTop;f.scrollTop=a.scrollTop;f.scrollTop>0&&P(Ob)}}function + Eb(b,c){if(c==TID_HEADER){if(Math.abs(b.scrollLeft-b.$FXH_SCROLL_LEFT)<5)return}else if(Math.abs(b.scrollTop-b.$FXH_SCROLL_TOP)<5)return;if(c==TID_HEADER)a.scrollLeft=b.scrollLeft;else a.scrollTop=b.scrollTop}function + vb(){if(b==Rb)return;var a=_rect(b);if(a.top<=i)return;b.style.top=i+_pixel(b.style.top)-a.top+PX}function + tb(){if(c==Rb)return;var a=_rect(c);if(a.left<=l)return;c.style.left=l+_pixel(c.style.left)-a.left+PX}function + O(q){if(b==Rb)return;if(!q){U!=Rb&&clearTimeout(U);U=setTimeout(function(){O(Qb)},200);return}U=Rb;var h,j;if(f){h=_rect(a).left;j=h+a.clientWidth}else{h=0;j=_body.clientWidth}if(C(c))h+=_offsetWidth(c);for(var m=_cells(d.rows[0]),o=_cells(b.rows[0]),e=0,l=0,i=0;ij)break;var p=_rect(o[i]).left;e+=p-k;l++}if(l==0)return;if(e==0)return;e=e/l;e=Math.round(e);if(e==0)return;if(f){var g=b.parentNode;if(g.style.position==cc){var n=_pixel(g.style.left)-e;g.style.left=n+PX}else{g.$FXH_SCROLL_LEFT=g.scrollLeft+e;g.scrollLeft+=e}}else{var n=_pixel(b.style.left)-e;b.style.left=n+PX}}function + P(p){if(c==Rb)return;if(_isOpera)return;if(!p){W!=Rb&&clearTimeout(W);W=setTimeout(function(){P(Qb)},200);return}W=Rb;var h,j;if(f){h=_rect(a).top;j=h+a.clientHeight}else{h=0;j=_body.clientHeight}if(C(b))h+=_offsetHeight(b);for(var n=d.rows,m=c.rows,e=0,l=0,i=0;ij)break;if(_cells(m[i]).length==0)continue;var q=_rect(m[i]).top;e+=q-k;l++}if(l==0)return;if(e==0)return;e=e/l;e=Math.round(e);if(e==0)return;if(f){var g=c.parentNode;if(g.style.position==cc){var o=_pixel(g.style.top)-e;g.style.top=o+PX}else{g.$FXH_SCROLL_TOP=g.scrollTop+e;g.scrollTop+=e}}else{var o=_pixel(c.style.top)-e;c.style.top=o+PX}}function + C(a){return a!=Rb&&a.style.visibility=="visible"}function + h(a,b){if(a==Rb)return;var c=b?"visible":Xb;if(a.style.visibility==c)return;a.style.visibility=c;if(_isIE)a.style.zIndex=b?Cb:Cb-1;if(_isOpera)a.style.opacity=b?bb:0;if(b&&bb<1){a.style.opacity=bb;a.style.filter="alpha(opacity="+bb*100+")"}}function + Fb(b){if(!_isIE&&!_isIE11&&!_isFirefox&&!_isOpera)return;if(b){m=Db();a.appendChild(m);t(m,_offsetWidth(d));D(m,_offsetHeight(d));d.style.display=Yb}else{d.style.display=Ib;a.removeChild(m);m=Rb}}function + Db(){var a=d.cloneNode(Ob),b=document.createElement(j),e=document.createElement("TR"),c=document.createElement("TD");c.appendChild(document.createTextNode("dummy"));e.appendChild(c);b.appendChild(e);a.appendChild(b);return a}function + I(a,b){Bb(a,o,b)}function + t(a,b){Bb(a,"OFFSET",b)}function + H(a,b){Ab(a,o,b)}function + D(a,b){Ab(a,"OFFSET",b)}function + Bb(a,g,f){var b=f;if(a.$FXH_PADDING_WIDTH!=undefined)b-=a.$FXH_PADDING_WIDTH;for(var d,c,e=0;e<2;e++){if(b0)b+=",";b+=c[a].offsetWidth}return b}function + _rowsHeightList(c){for(var b=Vb,a=0;a0)b+=",";b+=c[a].offsetHeight}return b}function + _trHeight(a){if(_isIE&&_IEver==8&&!_isBackCompat)return a.clientHeight;else return _offsetHeight(a)}function + _cells(e){var a=e.childNodes;if(a.length==0)return a;for(var b=[],d=0;dまたはパスワードが違います。', + # 機能を利用できないとかでいいんじゃ + LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、
生物由来データ参照は使用出来ません。', + LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、
マスタ-メンテは使用出来ません。', + # 使ってなさそう + LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。', + LOGOUT_REASON_SESSION_EXPIRED: 'セッションが切れています。
再度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 new file mode 100644 index 00000000..aed9916c --- /dev/null +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -0,0 +1,22 @@ +import os + +COGNITO_AUTH_DOMAIN = os.environ['COGNITO_AUTH_DOMAIN'] +AUTHORIZE_ENDPOINT = os.environ['AUTHORIZE_ENDPOINT'] +TOKEN_ENDPOINT = os.environ['TOKEN_ENDPOINT'] +COGNITO_IDENTITY_PROVIDER = os.environ['COGNITO_IDENTITY_PROVIDER'] +COGNITO_REDIRECT_URI = os.environ['COGNITO_REDIRECT_URI'] +COGNITO_USER_POOL_ID = os.environ['COGNITO_USER_POOL_ID'] +COGNITO_CLIENT_ID = os.environ['COGNITO_CLIENT_ID'] +COGNITO_CLIENT_SECRET = os.environ['COGNITO_CLIENT_SECRET'] +AWS_REGION = os.environ['AWS_REGION'] +SESSION_TABLE_NAME = os.environ['SESSION_TABLE_NAME'] +BIO_ACCESS_LOG_BUCKET = os.environ['BIO_ACCESS_LOG_BUCKET'] + +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +BIO_SEARCH_RESULT_MAX_COUNT = int(os.environ['BIO_SEARCH_RESULT_MAX_COUNT']) +SESSION_EXPIRE_MINUTE=int(os.environ['SESSION_EXPIRE_MINUTE']) \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/__init__.py b/ecs/jskult-webapp/src/templates/__init__.py new file mode 100644 index 00000000..d3c1713f --- /dev/null +++ b/ecs/jskult-webapp/src/templates/__init__.py @@ -0,0 +1,6 @@ +import os + +from fastapi.templating import Jinja2Templates + +templates_path = os.path.dirname(os.path.relpath(__file__)) +templates = Jinja2Templates(templates_path) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html new file mode 100644 index 00000000..ae41e99c --- /dev/null +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -0,0 +1,14 @@ + + + + +{{subtitle}} + + + + + + + + + diff --git a/ecs/jskult-webapp/src/templates/_modal.html b/ecs/jskult-webapp/src/templates/_modal.html new file mode 100644 index 00000000..6477db10 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/_modal.html @@ -0,0 +1,40 @@ +{% with + icon_data = { + 'info': { + 'alert': 'alert-primary', + 'icon_src': '/static/img/icon_modal_confirm.png' + }, + 'warning': { + 'alert': 'alert-warning', + 'icon_src': '/static/img/icon_modal_error.png' + } + } +%} + +{% endwith %} diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html new file mode 100644 index 00000000..b5984481 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -0,0 +1,462 @@ + + + + {% with subtitle = bio.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + +

生物由来検索一覧

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
卸: + + データ種別: + + 処理日: + + ~ + +
ロット番号: + + データ区分: + + 製品: + +
発伝年月日: + + ~ + + + + + + + +
+ + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
データ種別伝票管理NO処理日卸コード卸サブコード卸名卸組織コード伝票番号発伝年月日卸取引区分取引区分名製品コード統一商品コード商品名卸報告商品名納入先コード納入先名卸報告納入先名納入先住所卸報告納入先住所ロット番号数量有効期限データ区分エラー詳細種別訂正前伝票管理NO修正者修正日時施設コード施設名施設住所施設電話番号Veeva卸コードVeeva卸組織コード卸組織名Veeva取引区分コード移行
+ {% if bio.is_form_submitted() and bio.is_data_overflow_max_length() %} +
+ 検索結果が最大件数を超えました。検索条件を見直しして下さい。 +
+ {% endif %} + {% if bio.is_form_submitted() and bio.is_data_empty() %} +
+ 対象のデータが存在しません。 +
+ {% endif %} +
+
+ + + + + + {% with + modal_id='modal_xlsx', + modal_title='確認', + message='生物由来卸販売データ一覧をExcel出力しますか?', + icon_key='info', + modal_close_event='', + buttons = [ + { + 'id': 'excel_confirm_ok', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'download("filename", "xlsx")' + }, + { + 'id': 'excel_confirm_cancel', + 'class': 'btn btn-secondary', + 'dismiss': 'modal', + 'text': 'Cancel', + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + {% with + modal_id='modal_csv', + modal_title='確認', + message='生物由来卸販売データ一覧をCSV出力しますか?', + icon_key='info', + modal_close_event='', + buttons = [ + { + 'id': 'csv_confirm_ok', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'download("filename", "csv")' + }, + { + 'id': 'csv_confirm_cancel', + 'class': 'btn btn-secondary', + 'dismiss': 'modal', + 'text': 'Cancel', + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + {% with + modal_id='ErrorModal_AWS', + modal_title='エラー', + message='AWS環境に異常が発生しました。管理者にお問い合わせください。', + icon_key='warning', + modal_close_event='location.href="/logout?reason="', + buttons = [ + { + 'id': 'error_modal_aws', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'location.href="/logout?reason=''"' + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + {% with + modal_id='ErrorModal_DB', + modal_title='エラー', + message='DB接続に失敗しました。管理者にお問い合わせください。', + icon_key='warning', + modal_close_event='location.href="/logout?reason="', + buttons = [ + { + 'id': 'error_modal_db', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'location.href="/logout?reason=''"' + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + + {% with + modal_id='ErrorModal_Unexpected', + modal_title='エラー', + message='サーバーエラーが発生しました。管理者にお問い合わせください。', + icon_key='warning', + modal_close_event='location.href="/logout?reason="', + buttons = [ + { + 'id': 'error_modal_unexpected', + 'class': 'btn btn-primary', + 'text': 'OK', + 'onclick_event': 'location.href="/logout?reason=''"' + } + ] + %} + {% include '_modal.html' %} + {% endwith %} + + +
+
+ 出力中... +
+
+ + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/logout.html b/ecs/jskult-webapp/src/templates/logout.html new file mode 100644 index 00000000..ed17c630 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/logout.html @@ -0,0 +1,75 @@ + + + + {% with subtitle = logout.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + +
+

MeDaCA

+

+

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

+ +


+

{{logout.link_text}}

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

+ MeDaCA
+ Mainte Login +

+

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

MeDaCA
機能メニュー

+

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

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

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

+ {% else %} +
生物由来データ参照は
日次バッチ処理中のため利用出来ません
+ {% endif %} + {% endif %} + {% if menu.is_available_master_maintenance_menu() %} + {% if not menu.is_batch_processing() %} + マスターメンテメニュー

+ {% else %} +
マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ {% endif %} + {% endif %} +

Logout +
+ + diff --git a/ecs/jskult-webapp/src/util/sanitize.py b/ecs/jskult-webapp/src/util/sanitize.py new file mode 100644 index 00000000..781dd593 --- /dev/null +++ b/ecs/jskult-webapp/src/util/sanitize.py @@ -0,0 +1,14 @@ +"""サニタイズ処理用デコレーター""" + +import html + + +def sanitize(cls): + class SanitizedClass(cls): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + for prop_name, prop_value in self.__dict__.items(): + if isinstance(prop_value, str): + sanitized_value = html.escape(prop_value, quote=True) + setattr(self, prop_name, sanitized_value) + return SanitizedClass diff --git a/ecs/jskult-webapp/src/util/string_util.py b/ecs/jskult-webapp/src/util/string_util.py new file mode 100644 index 00000000..f7e0cad7 --- /dev/null +++ b/ecs/jskult-webapp/src/util/string_util.py @@ -0,0 +1,10 @@ +def is_not_empty(check_string: str) -> bool: + """文字列が空ではない場合True + + Args: + check_string (str): 検査する文字列 + + Returns: + bool: 文字列が殻ではない場合、True + """ + return check_string is not None and len(check_string) > 0 From 67a8606947b6c1b31b5fb5ed37f2c4e871733b5b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 14:19:22 +0900 Subject: [PATCH 009/962] =?UTF-8?q?refactor:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/Pipfile | 1 - ecs/jskult-batch-daily/Pipfile.lock | 35 ++++++------------- .../src/batch/datachange/emp_chg_inst_lau.py | 2 -- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile index 629e8690..3cc5b359 100644 --- a/ecs/jskult-batch-daily/Pipfile +++ b/ecs/jskult-batch-daily/Pipfile @@ -8,7 +8,6 @@ boto3 = "*" PyMySQL = "*" sqlalchemy = "*" tenacity = "*" -prettytable = "*" [dev-packages] autopep8 = "*" diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index fd935cf0..b6531ec3 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "38a488e60226a959c48dea23146954688e68eee8280a868998a2f659c2a46217" + "sha256": "1b9b3da586499b64915b0cf14217a1bcfb26c5e3e1c6fbfc9cce99242bc4faed" }, "pipfile-spec": 6, "requires": { @@ -18,19 +18,19 @@ "default": { "boto3": { "hashes": [ - "sha256:7017102c58b9984749bef3b9f476940593c311504354b9ee9dd7bb0b4657a77d", - "sha256:f961aa704bd7aeefc186ede52cabc3ef4c336979bb4098d3aad7ca922d55fc27" + "sha256:043f8981d10c4e7c48736df4381dac557b46c5b369b0a450d8f3d7f5fdd24db5", + "sha256:b00f416832bc59863b96175045d2ebe067d9222289bce677c48fd72c006eaaad" ], "index": "pypi", - "version": "==1.26.96" + "version": "==1.26.102" }, "botocore": { "hashes": [ - "sha256:b9781108810e33f8406942c3e3aab748650c59d5cddb7c9d323f4e2682e7b0b6", - "sha256:c449d7050e9bc4a8b8a62ae492cbdc931b786bf5752b792867f1276967fadaed" + "sha256:4bae8f502507da18ff37c61cb18745cfb11d87a61dd0ea27e346adadff92aa3f", + "sha256:58b11c630d2044ea732ba4c403d29fab51e954465f9b3f7099cbf5ac0ce7ab47" ], "markers": "python_version >= '3.7'", - "version": "==1.29.96" + "version": "==1.29.102" }, "greenlet": { "hashes": [ @@ -106,21 +106,13 @@ "markers": "python_version >= '3.7'", "version": "==1.0.1" }, - "prettytable": { - "hashes": [ - "sha256:2e0026af955b4ea67b22122f310b90eae890738c08cb0458693a49b6221530ac", - "sha256:3b767129491767a3a5108e6f305cbaa650f8020a7db5dfe994a2df7ef7bad0fe" - ], - "index": "pypi", - "version": "==3.6.0" - }, "pymysql": { "hashes": [ - "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641", - "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36" + "sha256:3dda943ef3694068a75d69d071755dbecacee1adf9a1fc5b206830d2b67d25e8", + "sha256:89fc6ae41c0aeb6e1f7710cdd623702ea2c54d040565767a78b00a5ebb12f4e5" ], "index": "pypi", - "version": "==1.0.2" + "version": "==1.0.3" }, "python-dateutil": { "hashes": [ @@ -216,13 +208,6 @@ ], "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" - }, - "wcwidth": { - "hashes": [ - "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", - "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" - ], - "version": "==0.2.6" } }, "develop": { diff --git a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py index db3c72da..252b6e17 100644 --- a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py +++ b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py @@ -1,5 +1,3 @@ -from prettytable import PrettyTable - from src.batch.batch_functions import get_syor_date_as_date_format, logging_sql from src.db.database import Database from src.error.exceptions import BatchOperationException From 471ccec9bda77b7897221a54e8309569b22d791d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 14:38:16 +0900 Subject: [PATCH 010/962] =?UTF-8?q?feat:=20=E7=92=B0=E5=A2=83=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E3=81=AE=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index 73f72119..f330f3d5 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -1,15 +1,12 @@ #AWS ##Cognito COGNITO_AUTH_DOMAIN=******* -AUTHORIZE_ENDPOINT=********* -TOKEN_ENDPOINT=*************** COGNITO_IDENTITY_PROVIDER=********* COGNITO_REDIRECT_URI=***************** COGNITO_USER_POOL_ID=******************** COGNITO_CLIENT_ID=********************** COGNITO_CLIENT_SECRET=****************************** ##DynamoDB -AWS_REGION=************** SESSION_TABLE_NAME=*********************** ##S3 BIO_ACCESS_LOG_BUCKET=******************* @@ -18,7 +15,11 @@ DB_HOST=************ DB_PORT=************ DB_USERNAME=************ DB_PASSWORD=************ -DB_SCHEMA=************ -#実装の設定 +DB_SCHEMA=src05 + +#実装の設定(task_settingsに設定するパラメータ) +AWS_REGION=ap-northeast-1 +AUTHORIZE_ENDPOINT=oauth2/authorize +TOKEN_ENDPOINT=oauth2/token BIO_SEARCH_RESULT_MAX_COUNT=35000 -SESSION_EXPIRE_MINUTE=20 \ No newline at end of file +SESSION_EXPIRE_MINUTE=20 From f323dcedd06b51c1ce1bc332a9667e047d47024a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 15:26:23 +0900 Subject: [PATCH 011/962] =?UTF-8?q?feat:=20DB=E3=81=AE=E6=8E=A5=E7=B6=9A?= =?UTF-8?q?=E9=96=A2=E9=80=A3=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82UpperCase?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B=E3=81=AE=E3=82=92=E3=82=84=E3=82=81?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/database.py | 150 +++++++++++++----- ecs/jskult-webapp/src/db/tasks.py | 12 +- .../src/repositories/base_repository.py | 1 + .../repositories/bio_sales_view_repository.py | 10 +- .../src/repositories/hdke_tbl_repository.py | 5 +- .../pharmacy_product_master_repository.py | 5 +- .../repositories/user_master_repository.py | 7 +- .../wholesaler_master_repository.py | 5 +- .../src/services/bio_view_service.py | 6 +- 9 files changed, 144 insertions(+), 57 deletions(-) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 2f941663..8308438d 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -1,71 +1,147 @@ -from sqlalchemy import Engine, create_engine, text +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.create import create_engine from sqlalchemy.engine.url import URL from src.error.exceptions import DBException +from src.system_var import environment class Database: - + """データベース操作クラス""" + __connection: Connection = None __engine: Engine = None __host: str = None __port: str = None - __user: str = None + __username: str = None __password: str = None __schema: str = None __connection_string:str = None - def __init__(self, host: str, port: int, user: str, password: str, schema: str) -> None: + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password self.__host = host self.__port = int(port) - self.__user = user - self.__password = password self.__schema = schema self.__connection_string = URL.create( drivername='mysql+pymysql', - username=self.__user, + username=self.__username, password=self.__password, host=self.__host, port=self.__port, database=self.__schema, query={"charset": "utf8mb4"} ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool, + isolation_level="AUTOCOMMIT" + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) @property def connection(self): - return self.__engine + """ + DBの接続を返します。 + """ + return self.__connection - def engine_init(self): - engine = create_engine( - self.__connection_string, - pool_timeout=5 - ) - self.__engine = engine + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + self.__connection = self.__engine.connect() - def execute_query(self, select_query: str, parameters=None) -> list[dict]: - if self.__engine is None: - raise DBException('データベースが初期化されていません') + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 - with self.__engine.begin() as trx: - try: - result = trx.execute(text(select_query), parameters=parameters) - except Exception as e: - trx.rollback() - raise DBException(e) - return result.mappings().all() + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. - def execute(self, query: str, parameters=None) -> None: - if self.__engine is None: - raise DBException('データベースが初期化されていません') + Raises: + DBException: DBエラー - with self.__engine.begin() as trx: - try: - trx.execute(text(query), parameters=parameters) - except Exception as e: - trx.rollback() - raise DBException(e) + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + try: + result = self.__connection.execute(text(select_query), parameters=parameters) + except Exception as e: + raise DBException(e) + result_rows = result.mappings().all() + return result_rows - def close(self): - if self.__engine is not None: - self.__engine.dispose(close=True) - self.__engine = None + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + raise DBException(e) + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None diff --git a/ecs/jskult-webapp/src/db/tasks.py b/ecs/jskult-webapp/src/db/tasks.py index 9da8d300..da1a6fdc 100644 --- a/ecs/jskult-webapp/src/db/tasks.py +++ b/ecs/jskult-webapp/src/db/tasks.py @@ -1,22 +1,14 @@ from fastapi import FastAPI from src.db.database import Database -from src.system_var import environment def init_db(app: FastAPI) -> None: # DB接続モジュールを初期化 - database = Database( - host=environment.DB_HOST, - port=environment.DB_PORT, - user=environment.DB_USERNAME, - password=environment.DB_PASSWORD, - schema=environment.DB_SCHEMA - ) - database.engine_init() + database = Database.get_instance() # FastAPI App内で使える変数として追加 app.state._db = database def close_db(app: FastAPI) -> None: - app.state._db.close() + app.state._db = None diff --git a/ecs/jskult-webapp/src/repositories/base_repository.py b/ecs/jskult-webapp/src/repositories/base_repository.py index bb15148f..66cb5725 100644 --- a/ecs/jskult-webapp/src/repositories/base_repository.py +++ b/ecs/jskult-webapp/src/repositories/base_repository.py @@ -36,6 +36,7 @@ class BaseRepository(metaclass=ABCMeta): text(query), con=self._database.connection, params=params) + df = pd.DataFrame( sql_query, index=None diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 73667cc4..69e50783 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -38,12 +38,13 @@ class BioSalesViewRepository(BaseRepository): def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: try: + self._database.connect() where_clause = self.__build_condition(parameter) # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); query = self.FETCH_SQL.format(where_clause=where_clause) # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); - result = self._database.execute_query(query, parameter.dict()) + result = self._database.execute_select(query, parameter.dict()) models = [BioSalesViewModel(**r) for r in result] # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); return models @@ -51,15 +52,18 @@ class BioSalesViewRepository(BaseRepository): # TODO: ファイルへの書き出しはloggerでやる print(f"[ERROR] DB Error : Exception={e.args}") raise e + finally: + self._database.disconnect() + def fetch_as_data_frame(self, parameter: BioModel): try: + self._database.connect() where_clause = self.__build_condition(parameter) # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); query = self.FETCH_SQL.format(where_clause=where_clause) # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); - # result = self._database.execute_query(query, parameter.dict()) # models = [BioSalesViewModel(**r) for r in result] # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); df = self._to_data_frame(query, parameter) @@ -68,6 +72,8 @@ class BioSalesViewRepository(BaseRepository): # TODO: ファイルへの書き出しはloggerでやる print(f"[ERROR] DB Error : Exception={e.args}") raise e + finally: + self._database.disconnect() def __build_condition(self, parameter: BioModel): where_clauses: list[SQLCondition] = [] diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py index 586000e6..e3a72f23 100644 --- a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -8,11 +8,14 @@ class HdkeTblRepository(BaseRepository): def fetch_all(self) -> list[HdkeTblModel]: try: + self._database.connect() query = self.FETCH_SQL - result = self._database.execute_query(query) + result = self._database.execute_select(query) models = [HdkeTblModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index bfcbe286..f6523612 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -26,7 +26,8 @@ class PharmacyProductMasterRepository(BaseRepository): def fetch_all(self) -> list[PharmacyProductMasterModel]: try: - result = self._database.execute_query(self.FETCH_SQL) + self._database.connect() + result = self._database.execute_select(self.FETCH_SQL) models = [PharmacyProductMasterModel(**r) for r in result] return models except Exception as e: @@ -34,3 +35,5 @@ class PharmacyProductMasterRepository(BaseRepository): 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/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 788a6172..e5e1ba41 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -10,13 +10,14 @@ class UserMasterRepository(BaseRepository): FROM src05.user_mst WHERE - LOWER(user_id) = LOWER(:user_id)\ + user_id = :user_id\ """ def fetch_one(self, parameter: dict) -> UserMasterModel: try: + self._database.connect() query = self.FETCH_SQL - result = self._database.execute_query(query, parameter) + result = self._database.execute_select(query, parameter) models = [UserMasterModel(**r) for r in result] if len(models) == 0: return None @@ -25,3 +26,5 @@ class UserMasterRepository(BaseRepository): # TODO: ファイルへの書き出しはloggerでやる print(f"[ERROR] DB Error : Exception={e.args}") raise e + finally: + self._database.disconnect() \ No newline at end of file diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py index b472fac5..0f625bc7 100644 --- a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -24,7 +24,8 @@ class WholesalerMasterRepository(BaseRepository): def fetch_all(self) -> list[WholesalerMasterModel]: try: - result = self._database.execute_query(self.FETCH_SQL) + self._database.connect() + result = self._database.execute_select(self.FETCH_SQL) result_data = [res for res in result] models = [WholesalerMasterModel(**r) for r in result_data] return models @@ -33,3 +34,5 @@ class WholesalerMasterRepository(BaseRepository): 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/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index c1c2f5c1..99726d23 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -72,7 +72,7 @@ class BioViewService(BaseService): def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): # Excelに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id.upper()}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') # テンプレートファイルをコピーして出力ファイルの枠だけを作る shutil.copyfile( @@ -92,7 +92,7 @@ class BioViewService(BaseService): def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): # csvに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id.upper()}_{timestamp:%Y%m%d%H%M%S%f}.csv') + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') # 横長のDataFrameとするため、ヘッダーの加工処理 header_data = {} for df_column, header_column in zip(data_frame.columns, header): @@ -115,5 +115,5 @@ class BioViewService(BaseService): bucket_name = environment.BIO_ACCESS_LOG_BUCKET # TODO: フォルダを変える file_key = f'bio/{path.basename(local_file_path)}' - download_filename = f'{user_id.upper()}_生物由来卸販売データ.{kind}' + download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) From d58b7f605237946f58665d916d1598ed05d310ca Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 15:26:58 +0900 Subject: [PATCH 012/962] =?UTF-8?q?feat:=20README=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index 23a796e6..91fc0ca4 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -1,16 +1,21 @@ -# FastAPI 試作プロジェクト +# 実消化&アルトマーク Webアプリケーション ## 概要 -PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のWebアプリケーションを開発してみるサンプルのリポジトリです。 -新名称はMeDaCA(Merck Database for Commercial Application)を表示する。 +実消化&アルトマークのWebアプリケーション。 +以下の機能を提供する + +- アルトマークデータ照会(施設・医師) +- 生物由来データ照会 +- マスターメンテナンス ## 環境情報 - Python 3.9 - MySQL 8.x +- FastAPI + - PythonのWebアプリケーションフレームワーク - VSCode -- その他ライブラリ Pipfileを参照 ## 環境構築 @@ -18,7 +23,7 @@ PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のW - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 - 「Pipenvの導入」までを行っておくこと - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する - - `pipenv install` + - `pipenv install --python ` - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく - MySQLの環境構築 @@ -51,7 +56,6 @@ PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のW ├── Pipfile -- Pythonモジュールの依存関係を管理するファイル ├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル ├── README.md -├── auth_flow.drawio -- 認証フローの説明図 └── src -- ソースコードの保管場所 ├── aws -- AWSリソース操作用のコード │   ├── aws_api_client.py @@ -65,7 +69,7 @@ PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のW │   └── menu.py ├── core -- APサーバーのコア設定。 │   └── tasks.py -- 起動・終了時に実行するタスクを設定。 - ├── data -- 生物由来照会のエクセルファイルテンプレート。これはS3に持っていくかも。 + ├── data -- 生物由来照会のエクセルファイルテンプレート。 │   └── BioData_template.xlsx ├── db -- データベース関連処理。 │   ├── database.py -- データベース接続、クエリ発行の共通モジュール。 @@ -163,7 +167,7 @@ PythonのWebフレームワーク「FastAPI」を利用して、MINE(旧称)のW - REPOSITORIES定数に、依存するリポジトリクラスを辞書形式で指定する - CLIENTS定数に、依存するAWS APIクライアントクラスを辞書形式で指定する - `__init__`コンストラクタ内で、2つの定数に指定したキーに紐付いたインスタンスが渡ってくるため、インスタンス変数として登録する - - あとは、ビジネスロジックにあたる関数を生やしていくだけ + - あとは、ビジネスロジックにあたる関数を生やしていく - DBへのアクセスを行うリポジトリクラスは「repositories」フォルダに格納する。 - SQL文を用意し、`_db`インスタンス変数のメソッドを利用してクエリを実行する。 - 必要に応じて条件設定をする。条件設定には`SQLCondition`クラスを使用する。 From eb36ecb57f239adaf7c64d861bef6f63e72983fb Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 17:12:36 +0900 Subject: [PATCH 013/962] =?UTF-8?q?feat:=20=E3=82=AA=E3=83=96=E3=82=B8?= =?UTF-8?q?=E3=82=A7=E3=82=AF=E3=83=88=E5=AE=9A=E7=BE=A9=E3=81=AE=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E5=8C=96=E3=81=AB=E4=BC=B4=E3=81=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Event.txt | 6 +++--- s3/data/crm/settings/CRM_Task.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt index 2400c584..ed6c978e 100644 --- a/s3/data/crm/settings/CRM_Event.txt +++ b/s3/data/crm/settings/CRM_Event.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -58 -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 -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 +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_Task.txt b/s3/data/crm/settings/CRM_Task.txt index 6070f54e..45e1735b 100644 --- a/s3/data/crm/settings/CRM_Task.txt +++ b/s3/data/crm/settings/CRM_Task.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -49 -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 -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 +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 From 886af02130e00e1b44b2bfbb9347b01f55f6beee Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 17:13:48 +0900 Subject: [PATCH 014/962] =?UTF-8?q?feat:=20=E3=82=AA=E3=83=96=E3=82=B8?= =?UTF-8?q?=E3=82=A7=E3=82=AF=E3=83=88=E5=AE=9A=E7=BE=A9=E3=81=AE=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E5=8C=96=E3=81=AB=E4=BC=B4=E3=81=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 9667e48e..9dd9f14a 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3169,7 +3169,8 @@ "MSJ_Data_ID__c", "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", - "MSJ_Task_Source__c" + "MSJ_Task_Source__c", + "MSJ_Visit_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -3225,7 +3226,8 @@ "MSJ_Data_ID__c", "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", - "MSJ_Task_Source__c" + "MSJ_Task_Source__c", + "MSJ_Visit_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true From 8989a7c8fd46d6c1244a52679ec942bcc5b24430 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 17:54:59 +0900 Subject: [PATCH 015/962] =?UTF-8?q?fix:=20Excel=E3=83=80=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E3=81=AE=E3=83=86=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=83=88=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=92git=E7=AE=A1=E7=90=86=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.gitignore | 2 +- .../src/data/BioData_template.xlsx | Bin 0 -> 10348 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 ecs/jskult-webapp/src/data/BioData_template.xlsx diff --git a/ecs/jskult-webapp/.gitignore b/ecs/jskult-webapp/.gitignore index 547e4960..47b5c64c 100644 --- a/ecs/jskult-webapp/.gitignore +++ b/ecs/jskult-webapp/.gitignore @@ -2,5 +2,5 @@ __pycache__ .vscode/settings.json .env -!src/data/BioData_template.xlsx src/data/* +!src/data/BioData_template.xlsx diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4a6292ff20b0ab793c282b122e8254d682f6ee53 GIT binary patch literal 10348 zcmeHtg;yNe_I2a#)<}Z8yKC?c1P>D2wQ+(=a0wdRHMqOGI|**VJ-CODnR)Lwnaq5D z!JAsEtGn0jvsZQ1-shfs_Ei8uL1P180q_6-fD}-GeBf#Z0RW)D003A3cu1{RU>iqc z8%JFgS6gETZKn6uRwUWbkTjV9$miexd;AaIfs(jkn=Te~iR({yXwmhm2D{lsbdX^} z@r+7)a1B@f>Nk|*BI_pyz|Tc=Fr;%mvH}j{qdnX?gA2(9Fc`HioP=snYCf?#=G^7; z{fBuirZ6$KvcQu}6G9O#d|llLlN5k@u1yf9Wk?s)4vkg?Bt3CQURs|NJJ7tj&v1a#@Md#7Jzpg)wnU&3`RNe)2|kN1mFZnNJ<%Ui-I znn|*(_yPfrLFscxSRQ-w(O%UekefjaEeyV(v#RQx4fMWkxVi9Be1W@Xx0fObQqWx>5H2)$^(0TW) zR3vRE9z+2i?*kjVtqDAh^sPQ~>*)y!pzs%gV(GLQLp}?1^;v&N&jQu8H@0$MX8P^? zuQ30I)%eq2FNu)@L9wC-p7=eHjq89hRIw-zmkD%Mi zn!6MVE%}!1&qVp;19Xy7>-7_Cd}q$1{>dJwc_E8dMEUO1){DSZ0)?5+e03hnwDG%2Q2TUBuS4QmKHX&0(Bea!R%|+Np}2(e=aHso$q)eGA>Lat|DhTeu)U=L7;O35toC08K|D`w&+_`;K1!72Ks_wz ztw=wDSX@$^aWLi`naK`S576KTYiJj#NZGwERtf2vwAH_Yn4!Rdt|z1Y&exo%-=MHA zJLx}%VnVxNS)K61fJe_qq2LXUN?-a(!C+w??jIB%A)zKaU^NQG3^1f)^K9SHP~r#W z6EyFKWlj~k#ilh?991C-Xbany)5Ds^ayk$2^x?h_NI+-*vd|7 zRy|pF6uTdyZC^ZN7``|$*&OWu^3PdzyZ92f@0l**umAwsGZ&sI^D|j;RhMlRSb(h= zH7>y(#6;&C+xUO_f5(;s@?0q;}M&4%UbCD$@M zwr^6$ci5%+4+PF%HgJgz0;AP@1elU!{onQMZr?2tlZ>m=VI|WJ8rH1CzK9g^=F_BY zO{J~90Ei?5^Sq~6@f|MIi4Pc8(E;?lHtMpWQ`p>MNM_2Na*X#q zi5!DykA{^k#!~ zPN?l*l|$}u5W$&yz0`-}ByBT)Fe;v6=ZDgOc7N zYEgg!<44tSol4%)`PA->=4~9p2S0hIRmjq!Ya>D z58;#HjmbV`nmiPu?&_sxKLC>6&-v}|g~fo+0NKs+2;p<(kNpSb9nAFYjg6EY?aggW z9ezua{&6SZDG^}*YRZi;hv!LX@@H1->#m-JJ4w&g4&LMmdVAwZmpQ~ZW9V={(y9?- z(J%xfBlLdQd18lmbuU+q2clrkxPa;w)kPxN0v&dFfWkVo+%-M6g zUr2a7?%%djXZtXqnAD^q_>y@6q?goAR-!SgpmC9+$xImOpHyNL_>hoMtdm>;_^y_? z$fE`s0WT1?kVJ+v836Iou`hF#A}L-?XVK)2lGR|Jt{W=Sh&^g!2xt+1W}8x-SE^L* z9YbDBm?6Zhrv}B-f#|Wn^&a|M3GfMIj}C<;q{OLsS2;XsQH0NoS9mtb9?p=7(sOmn z^UH`PJINEJd1OzQSK2*|)Op4BWsI6F@R}yR?)RGABBYAoN~#_B!D~k!?Y*i;WZ8L| z>TwG^2$Po#tHv}}jS(l^UQKxbMvuE!BJ!2R+DFDMzlWO*&3!oFAeu~O+(v0v`*uNf z@jeWdAL@{2&W^TT#_PaH!`h1Kx|y?z`?5J`Sl%JFv_D~$+sb`zubLP6uE5cwE911I z`mvL>@JnovryZ|RRi?_v!vP$>fR!GG27@I<|P$~OoB z&b7HOT5y-D6c{8vukj!&FU^JBtlv9f5FI_0hxfeXzGQyp!QYv({|>Vv0qQw1B0aAY z|HBkVS1aS+Dbk|0Y_rIP-9}vDLh`02qA=@IGK1w1m^^b?Prx29*gg*;8!vh1{&MCs5# z#puD*5VlTcW@T`2G?)0MKS&g-C7(bz$?IuZJcY9W4`4!ePRB<(bB4E^!g^ zP7wl(SV(7}S1hYrj!oHECx&yKLjt_P(TA*u-=O1%%_ZA+YCU7qC=J#}>Pyn#X9zE{ zdZ@uxiiUwJlAEK(x9IW>RmiE6UD~5|ql>34G}e~~%qB>5vfa@xM+=|H)JZ{Z_LBxw z5{tvtaqmYi#EK#2C{kJKV-i`T=3_m=YGa_Tqf`o~8O4ACR2rpilVOid zBVh{7+>eg8mzPI%caOKn7Z2LOC_g7bUXzu;>h?<=4Go4u%d1bn@Zi5rFZV=-3 z7dafD_^hPO##W7}&{L=4!krt2kf|t1#$K~I#mx)zDE-uv!+nkBH9bCGXcm&7d*=Y2pmK9H9h7wi}c zP~lZE;PyJ2bnG(M2fVGcH_wnPE5S8KHac*OVONqBZHSmq%ce)bLGDe~3;r+~Gfv?H z{$%AyM7w^&!zYCZIAuH`r_>}rskbv^Xkf}o)m10g#o>Pn(6dk`QG9D|oW6|^xMFhd z(hR){jxQ}=h`7|pEA2h*Kz#`lmTZs{UZUpVIix{LXE8i8MX^|F-5Y3Jr_TN!^a+%l ze=`vCV;86_Gnkjt3DXtUZUhIb%>(Psj^pPG(fjMJ=R}8{a6?r zlo)N$|CW9SH_|fi64#-YQ#l=Qz{$@T^^TWOdUSN_*x2v-V28uhiL+{|hIO37QR98K zW+n8KhtRz~hwvM6FmNPLr(Mbrj6J@svm~4{y0b?U>{qSJH$99u!ele&r-pgepWN-A z!)0PMpnEuuxil|Ot^0zT??$9~*b^JYZ<+_Wr3TMm$6F+D#dadBl>;^BHdB~Ca=M{g z&}%as>qdW09u)5(z*Ul+8e)xI*LITbcdvi%gYgv`55Ze_P+s^S72G>rjV{Z)RVP) z3F$1y^zcnuiRTeEl9f-z+&4!O$5UIUAL+;@_=p+4H9A?+k2bDb8rGasAvS`_u&ON# z_~1RtR1HVoo9|Rq9KPim{Y8v3S6Mv~9i?@-NXhH#R%Lv|fp~a{|A)uLRz7u=;$ieg z&BUFJ^`eCO>c2HKsCuil~c(EVt7c`XP)YO;Qsz42K3#QZ)yu{@8EsHw( zilgS3XO4m6`4!Z$0IG2y(Ob1`R4c8pZ5 z7~bH#!HfMFbZY~ zWy(xUe;sVMft#T}dkp<*$g)Zb2?pO+AlrI`zJPdqEGgCsFj>HnYQsklE7N3hizql5 zIb?BQ`x_5Ki|-|kfdu*+p>Kop{w4LgibRbUu-jF^lwoM)#nEqo?pcg|7_Y(Mv1ImV z4$#wtOswcm!q z(s5>WQZ?*0BvwPUn8!*R&cAhqx+@`P3!y`*5+nGQyx}L45-#^C!xAGojPrmW8iV(( z8TS`i#1kVqrYBXn9*u=}T6M{FnV}S0Mmxj(d@ln(lZFN9)DG|4Br6FdEsw#M+%2{W zMpqxiCdXD|ll1M8-KLpPA0&Yxqfg2eF{aGH9w;%2_e&dO*_z-zVH!GK;a^Jq>8`v} z5VhzQL4Fv@hNEDlj1x-*Wl{u*nVmsUs#!%}T10OJZeK2I&-PyA<8$OpmfXh=pwda= z86q6hEo4~_-naQtCsy2KAvtU-ACqrR#4b43v9LYiIs*;}<>`RnF zcXV#1wMOFtZ$XFtrf+)98a4XWAn|okle=ISXK@5xZC7TY%~18)rI*cHpCZaPnitGd z;5x$`Gnh=teWolK?(7AXk<`YPQ-42jry$G@OZ4J9`#|>|ih2ke*&z(42U|Cq5h>nf zQftrk{JDJjdtq~LkZ0}iyy7b${H^)@`>M~;%-GtP`SM4mjkdqg(59f=N2kYdD~mEfo_zl9X9ijv|8)9Os~I+=3w z$?ekc#~+ubPejLmx9IWITKxVMB?Tq?m8m^cy`OlYhoP}VU`6y!=v@6KoN{PPCT#( zLe9JyMCpr#1DqMtC{j~?og2Q6S$Y_ckA7x}5(y@(n@O6umb7i-5@-N|fr@N=rPx$t zJ9x#V&OH%@68tq3KM?p(i3Ts8gPG!$sKXaTp%GT2p464%oz-@?AK0yKKQ?dHt2cs# zUkJN7K75w~4bL}xsBUOE-Kx)cyuIw-jVxGg@puRzW*)xL^}g9m$Pm7UBK@$9*?My} z2p&&wx!IpyZFfKP1tSR1bl-DOVlIS81)-J`CEwnHeh4{+f%wPtF8ZOC%{#IQtcTA9%ZOt8BL z65qXdvE6Q{;~&eikpD1M=}ArcG0`2_6tSOz9C6RZLp)fj**%WWc{wj@Ed~vzNlKAW zxm@PXaSeLPV;WVilNl>xY|WydtJy^{g+1fz;^u^en3&!+M%$Z2!@h&}CARzI^Zm5+ zgb!3|A#Vmgguo9sl&P%kC9-^M!ib)#->Cz5g5=wMvvgdS+lHwM!>~g?dT@XZ#)b#1 zh4v|UMqAmY8E6fKqsZYE!>=07I$au5Nbm3;e5&(~+dv^3$J0oiF9`U_Mxn&p@sT2# z%dw8PH~djpSyf?Wo0JQclUvKI*b$xXwdd2*4Yh28Z(~e%#4B|I@A2Yytp&!e;Ej5} zVO*ApwHHrxdbf!&4{wE)51%U`tGcaNri}4xFT6*iHH5S18jv%010%pG%zThw$4(ry zC7OTxpLzmS2%V|^X5ejkA2+HJ27nvETZTxDa{iJV%3P){7NR#{^)h|HZ6f3f3z#=5r zR>gp1VE@n>?Ols%(n?45$GCpBAZ#6yuq$KPCIa4d+NNt5SM63io= zP0pcbSQ***$fqKj5iHwq%7P;*+;N#&SLeEgyF<1&lwbgBI?FnY^)5~;EqnTPoo#GC zJN`)Qr?0_qO|Hh=LutA=v1fR>vb^C>rbWBw&}AfF$&P%{ZGvDV`E<1)@aWbR0?zyc z1tIWE^PNR%I&hd<0yF*iEza9Xg6_Oi9O46IEE6fd2t`C^+P*9lN3Vi29u!}t?J4S= zHIdAIFrAo* z@cUh;+VShGI|tA`$6buH2~Y%%dIJ^6nw0J^2dY;CXJJuk%eQrBX`nJo!ue`WffY+WbVDD#zEQPeT$bMx4qod*ui~>6239uV5jj#PRxLSvp-(VU2}@2 z=oKax%B$-afnLfu$jccT9{1UEO{Q`dM<>}f2NVXt?j=YdM3|*j?~z8o97j9 z-!-HsoUi+9UPiyJOdz&=7&50thx`@2Q&q5Ru80nFvti4HHJkI^;*ErT47!93ztjD3 zWZV6zbm4)gHYH=AS?h3*M|>!B+G(Rx^XnyRVOD2SQ1T0azNZr34YY7#!wkjcK5EFbpWamg8@pl2wRmmmn;`NiM>4+i?#Zfm&JX?d-cM;b-X(HUMi z7Hx8<5JKTFx%x9@hJN0(6k8^9Jka`pqF5Y{%SdoW8gd24{9TD+mBaupJ_OefMhbbZ z7DcqYm`Z7)U}Jjk=KkWw(e2?&$i^GWMmw4-`@2z<#cQ_}?g}38Au=opQ)-S4qbjf+ z*Ao5$?d&$L#T3{8mns(`-9199>+P6+5p<16bjV_>uL9ELUPDbK_=0!P*57P$0QUKA zJiQ}ROG~OZmcYK!lc-SNvZ>%iHH^80dY+Kpji-~fP!Qm4hzv)PAth9>D!&Oj(@=={PAB#(gI zL`uo6nrt;Q7ZXM0^Z+4vxuE4m)*p3(;Qt`ech#qnfIcD0elof-8XFHcE0^{Vh#pZ* zPlbyQ>Yyu#ST30xykmLni3y&v(BMa+|0-$(_hlt0?<~(Aq77z;G}AXRDkdWDjNaLI z7c`dBkNqGXJEKFNfnyVI@+m3iil8F;U zKu`f}REPgDBmpny;h-ntoEXtLHZ8B!+`OO}vDVY}(S)qdy4ftO6ZRJGq5pL9TK~(; zoDe-siKc~Wb|*m*rFZKTqt4?43}XM43VJ4_w4*+BzMnyxf0>i0l$Z(5s97)_F!JL4 z#!`vsp{Arj{;U9Zrm)MG?&Z~f@A|>%(Tt$`d(mTI$oZE_1j|11W+(Qq_h5J#+dQ<1 ztBSmvI2PYXRN`i1yC!X!K9*JA3I$b8T4}cwC*qk?O^KDTD{kYbz39dBwYYJ^)ZY-} zHp$-pa;T*?{`^?}SeHUTGCtcd|GX{h&u90?r+?U_r2zUXz+bnG{0xxwJOli+iR9P7 zznbSi2hKdNl>h%$`mZ>@I;wvn!6E$3U;Q=sS8wXi;JarJ;`t)}=2ZQP@T+I>CjtfP z9|-^FVEh{TYqRvv&~1$WyYj!aPJc!DwYTsm$|LUYD8F_Zeg*hz;rC}a0Fd=OS3@Sg(U*XX~d)1RY<$bO3cZ*o-t!93IBw=GIYfX?R({E70nZ~qV3 CY?pZe literal 0 HcmV?d00001 From d2451b0bee3f99141fd6bcbbd99df2dc56d14dd5 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 18:09:02 +0900 Subject: [PATCH 016/962] =?UTF-8?q?docs:=20README=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 73 ++++++++++++++++++++++++++++++++ ecs/jskult-webapp/README.md | 3 +- 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/README.md diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md new file mode 100644 index 00000000..c0bfb248 --- /dev/null +++ b/ecs/jskult-batch-daily/README.md @@ -0,0 +1,73 @@ +# 実消化&アルトマーク 日次バッチ + +## 概要 + +実消化&アルトマークの日次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.x +- VSCode + +## 環境構築 + +- Pythonの構築 + - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenvの導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する + - `pipenv install --python ` + - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく + +- MySQLの環境構築 + - Windowsの場合、以下のリンクからダウンロードする + - + - Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Dockerの構築手順は、[Dockerのセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysqlコマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください +- VSCodeの設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_daily.py」で行っている。 + +## フォルダ構成 + +```text +. +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Dockerfile -- Dockerイメージを作成するためのファイル +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md -- 当ファイル +├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル +└── src -- ソースコードの保管場所 + ├── batch -- バッチ処理関連ソース置き場 + │ ├── batch_functions.py -- バッチ処理共通関数置き場 + │ ├── datachange -- 実績洗替関連ソース置き場 + │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 + │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント + ├── db + │ └── database.py -- データベース操作共通処理 + ├── error + │ └── exceptions.py -- カスタム例外 + ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 + ├── logging + │ └── get_logger.py -- ログ出力の共通処理 + ├── system_var + │ └── environment.py -- 環境変数 + └── time + └── elapsed_time.py -- 実行時間計測用 +``` diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index 91fc0ca4..783f82a2 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -53,9 +53,10 @@ ```text . +├── Dockerfile -- Dockerイメージを作成するためのファイル ├── Pipfile -- Pythonモジュールの依存関係を管理するファイル ├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル -├── README.md +├── README.md -- 当ファイル └── src -- ソースコードの保管場所 ├── aws -- AWSリソース操作用のコード │   ├── aws_api_client.py From 04d8f38e552eaf4fc14356afe782911cf063720c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 30 Mar 2023 19:59:15 +0900 Subject: [PATCH 017/962] =?UTF-8?q?feat:=20=E7=B4=B0=E3=81=8B=E3=81=AA?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/base_db_model.py | 5 ++++- ecs/jskult-webapp/src/repositories/base_repository.py | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/model/db/base_db_model.py b/ecs/jskult-webapp/src/model/db/base_db_model.py index 0f817d91..31cb0901 100644 --- a/ecs/jskult-webapp/src/model/db/base_db_model.py +++ b/ecs/jskult-webapp/src/model/db/base_db_model.py @@ -2,4 +2,7 @@ from pydantic import BaseModel class BaseDBModel(BaseModel): - pass + def __init__(__pydantic_self__, **data) -> None: + """DBカラム名が大文字で取れることを見越して、キーを小文字にしてからインスタンス化する""" + lower_case_data = dict((k.lower(), v) for k, v in data.items()) + super().__init__(**lower_case_data) diff --git a/ecs/jskult-webapp/src/repositories/base_repository.py b/ecs/jskult-webapp/src/repositories/base_repository.py index 66cb5725..60f9ba33 100644 --- a/ecs/jskult-webapp/src/repositories/base_repository.py +++ b/ecs/jskult-webapp/src/repositories/base_repository.py @@ -26,10 +26,12 @@ class BaseRepository(metaclass=ABCMeta): pass def fetch_as_data_frame(self, parameter: dict) -> pd.DataFrame: + """DBの取得結果をデータフレームにして返す""" pass def _to_data_frame(self, query, parameter: BaseDBModel): + """DBの取得結果をデータフレームに変換する""" params = params=parameter.dict() sql_query = pd.read_sql( From 5948468e594b4ca95e17d14725f329a488432f83 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 31 Mar 2023 10:57:25 +0900 Subject: [PATCH 018/962] =?UTF-8?q?feat:=20=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9=E5=81=B4=E3=82=92=E5=B0=8F=E6=96=87=E5=AD=97?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/base_db_model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/base_db_model.py b/ecs/jskult-webapp/src/model/db/base_db_model.py index 31cb0901..0f817d91 100644 --- a/ecs/jskult-webapp/src/model/db/base_db_model.py +++ b/ecs/jskult-webapp/src/model/db/base_db_model.py @@ -2,7 +2,4 @@ from pydantic import BaseModel class BaseDBModel(BaseModel): - def __init__(__pydantic_self__, **data) -> None: - """DBカラム名が大文字で取れることを見越して、キーを小文字にしてからインスタンス化する""" - lower_case_data = dict((k.lower(), v) for k, v in data.items()) - super().__init__(**lower_case_data) + pass From d586bf68efbee40741b179ba45b1a6030a190e7a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 31 Mar 2023 14:44:07 +0900 Subject: [PATCH 019/962] =?UTF-8?q?feat:=20URL=E3=83=91=E3=82=B9=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E3=81=AE=E8=A1=A8=E8=A8=98=E3=81=AB=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio.py | 4 ++-- ecs/jskult-webapp/src/controller/bio_download.py | 2 +- ecs/jskult-webapp/src/controller/healthcheck.py | 2 +- ecs/jskult-webapp/src/controller/login.py | 4 ++-- ecs/jskult-webapp/src/controller/logout.py | 6 +++--- ecs/jskult-webapp/src/controller/menu.py | 2 +- ecs/jskult-webapp/src/main.py | 12 ++++++------ .../src/model/db/pharmacy_product_master.py | 4 +++- ecs/jskult-webapp/src/model/db/wholesaler_master.py | 10 ++++++---- ecs/jskult-webapp/src/templates/bioSearchList.html | 2 +- ecs/jskult-webapp/src/templates/maintlogin.html | 4 +--- 11 files changed, 27 insertions(+), 25 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index cf191331..a54909bd 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -21,7 +21,7 @@ router.route_class = AuthenticatedRoute ######################### # Views # ######################### -@router.get('/bio/BioSearchList') +@router.get('/BioSearchList') def bio_view( request: Request, batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), @@ -50,7 +50,7 @@ def bio_view( ) return templates_response -@router.post('/bio/BioSearchList') +@router.post('/BioSearchList') def search_bio( request: Request, bio_form: Optional[BioModel] = Depends(BioModel.as_form), diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 576e7a83..67593fb7 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -23,7 +23,7 @@ router = APIRouter() ######################### # APIs # ######################### -@router.post('/api/bio/download') +@router.post('/download') async def download_bio_data( search_param: BioModel=Depends(BioModel.as_body), download_param: BioDownloadModel=Depends(BioDownloadModel.as_body), diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py index b36abc8d..bd571edd 100644 --- a/ecs/jskult-webapp/src/controller/healthcheck.py +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -5,6 +5,6 @@ router = APIRouter() ######################### # Views # ######################### -@router.get('/healthcheck') +@router.get('/') def healthcheck(): return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 35550850..a7bc6808 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -53,8 +53,8 @@ def login_maintenance_view(request: Request): ######################### # APIs # ######################### -@router.post('/login') -def sso_authorize( +@router.post('/maintlogin') +def login( response: Response, request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 252e2a01..8cad1b5f 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -14,16 +14,16 @@ router = APIRouter() ######################### # Views # ######################### -@router.get('/logout', response_class=HTMLResponse) +@router.get('/', response_class=HTMLResponse) def logout_view( request: Request, reason: Optional[str] = None, session: Union[UserSession, None]=Depends(verify_session) ): - redirect_to = '/userlogin' + redirect_to = '/login/userlogin' link_text = 'MeDaCA機能メニューへ' if session is not None and session.user_flg == '1': - redirect_to = '/maintlogin' + redirect_to = '/login/maintlogin' link_text = 'Login画面に戻る' logout = LogoutViewModel() logout.redirect_to = redirect_to diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py index 26cf9482..a9e450bb 100644 --- a/ecs/jskult-webapp/src/controller/menu.py +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -16,7 +16,7 @@ router.route_class = AuthenticatedRoute ######################### # Views # ######################### -@router.get('/menu', response_class=HTMLResponse) +@router.get('/', response_class=HTMLResponse) def menu_view( request: Request, batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)) diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index fbc990cf..f00f5ac3 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -15,18 +15,18 @@ app = FastAPI() # 静的ファイルをマウント app.mount('/static', StaticFiles(directory=path.dirname(static.__file__)), name='static') # ログイン関連のルーター -app.include_router(login.router) +app.include_router(login.router, prefix='/login') # ログアウト関連のルーター -app.include_router(logout.router) +app.include_router(logout.router, prefix='/logout') # メニュー画面関連のルーター -app.include_router(menu.router) +app.include_router(menu.router, prefix='/menu') # 生物由来関連のルーター -app.include_router(bio.router) +app.include_router(bio.router, prefix='/bio') # 生物由来のダウンロード用APIルーター。 # クライアントから非同期呼出しされるため、共通ルーターとは異なる扱いとする。 -app.include_router(bio_download.router) +app.include_router(bio_download.router, prefix='/bio') # ヘルスチェック用のルーター -app.include_router(healthcheck.router) +app.include_router(healthcheck.router, prefix='/healthcheck') # エラー発生時にログアウト画面に遷移させるハンドラー app.add_exception_handler(status.HTTP_401_UNAUTHORIZED, http_exception_handler) diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py index e26f4381..863fd87d 100644 --- a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -1,5 +1,7 @@ +from typing import Optional + from src.model.db.base_db_model import BaseDBModel class PharmacyProductMasterModel(BaseDBModel): - mkr_cd_nm: str + mkr_cd_nm: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/wholesaler_master.py b/ecs/jskult-webapp/src/model/db/wholesaler_master.py index 90cccc3f..762711a5 100644 --- a/ecs/jskult-webapp/src/model/db/wholesaler_master.py +++ b/ecs/jskult-webapp/src/model/db/wholesaler_master.py @@ -1,8 +1,10 @@ +from typing import Optional + from src.model.db.base_db_model import BaseDBModel class WholesalerMasterModel(BaseDBModel): - rec_whs_cd: str - rec_whs_sub_cd: str - nm: str - whs_nm: str + rec_whs_cd: Optional[str] + rec_whs_sub_cd: Optional[str] + nm: Optional[str] + whs_nm: Optional[str] diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index b5984481..cc208efd 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -211,7 +211,7 @@ $.ajax({ type: "POST", - url: "/api/bio/download", + url: "/bio/download", contentType: 'application/json', data: JSON.stringify(downloadRequestParams), scriptCharset: 'utf-8', diff --git a/ecs/jskult-webapp/src/templates/maintlogin.html b/ecs/jskult-webapp/src/templates/maintlogin.html index 5c2ac157..06f28098 100644 --- a/ecs/jskult-webapp/src/templates/maintlogin.html +++ b/ecs/jskult-webapp/src/templates/maintlogin.html @@ -13,13 +13,11 @@ Mainte Login

-
+
- -
From af3dbde89e3f189b17d832f9bf59a9a03141dd19 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 4 Apr 2023 11:15:33 +0900 Subject: [PATCH 020/962] =?UTF-8?q?feat:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E3=83=87=E3=83=BC=E3=82=BF=E4=BF=9D?= =?UTF-8?q?=E7=AE=A1=E3=81=AE=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=20=E7=AC=AC=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/__init__.py | 0 ecs/jskult-batch-daily/src/aws/s3.py | 80 +++++++++++++++ .../src/batch/ultmarc/__init__.py | 0 .../src/batch/ultmarc/dat_insert.py | 57 +++++++++++ .../src/batch/ultmarc/datfile.py | 45 +++++++++ .../src/batch/ultmarc/utmp_tables/__init__.py | 0 .../table_mapper/concrete/__init__.py | 8 ++ .../table_mapper/concrete/com_inst.py | 7 ++ .../table_mapper/concrete/null_mapper.py | 8 ++ .../table_mapper/ultmarc_table_mapper.py | 14 +++ .../ultmarc_table_mapper_factory.py | 97 +++++++++++++++++++ 11 files changed, 316 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/aws/__init__.py create mode 100644 ecs/jskult-batch-daily/src/aws/s3.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py diff --git a/ecs/jskult-batch-daily/src/aws/__init__.py b/ecs/jskult-batch-daily/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py new file mode 100644 index 00000000..ef3e2b36 --- /dev/null +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -0,0 +1,80 @@ +import os.path as path +import tempfile + +import boto3 + + +class S3Client: + __s3_client = boto3.client('s3') + _bucket_name: str + + def list_objects(self, bucket_name: str, folder_name: str): + response = self.__s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_name) + if response['KeyCount'] == 0: + return [] + contents = response['Contents'] + # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする + objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')] + return objects + + def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None: + copy_source = {'Bucket': src_bucket, 'Key': src_key} + self.__s3_client.copy(copy_source, dest_bucket, dest_key) + return + + + def download_file(self, bucket_name: str, file_key: str, file): + self.__s3_client.download_fileobj( + Bucket=bucket_name, + Key=file_key, + Fileobj=file + ) + return + + + def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): + self.__s3_client.upload_file( + local_file_path, + Bucket=bucket_name, + Key=file_key + ) + + +class S3Bucket(): + _s3_client = S3Client() + _bucket_name: str = None + + def __str__(self) -> str: + return self._bucket_name + +class UltmarcBucket(S3Bucket): + # TODO: 環境変数にする + _bucket_name = 'mbj-newdwh2021-staging-jskult-ultmarc' + _folder = 'recv' + + def list_edi_file(self): + return self._s3_client.list_objects(self._bucket_name, self._folder) + + def download_edi_file(self, edi_filename: str): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, f'{edi_filename.replace("recv/", "")}') + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, edi_filename, f) + f.seek(0) + return temporary_file_path + + def backup_edi_file(self, edi_file_key: str, datetime_key: str): + ultmarc_backup_bucket = UltmarcBackupBucket() + backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{edi_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(str(self), edi_file_key, str(ultmarc_backup_bucket), backup_key) + + +class JskUltBackupBucket(S3Bucket): + # TODO: 環境変数にする + _bucket_name = 'mbj-newdwh2021-staging-jskult-backup' + + +class UltmarcBackupBucket(JskUltBackupBucket): + # TODO: 環境変数にする + _folder = 'ultmarc' diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py new file mode 100644 index 00000000..055f9bff --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -0,0 +1,57 @@ +"""アルトマークデータ保管""" + +import json +import os.path as path +from datetime import datetime + +from src.aws.s3 import UltmarcBucket +from src.batch.ultmarc.datfile import DatFile +from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ + UltmarcTableMapperFactory +from src.logging.get_logger import get_logger + +logger = get_logger('アルトマークデータ保管') +ultmarc_bucket = UltmarcBucket() + +def dat_insert_control(): + try: + logger.info('datInsert START') + # datファイルをS3から取得する + dat_file_list = ultmarc_bucket.list_edi_file() + + # ファイルがない場合は処理せず、正常終了とする + if len(dat_file_list) == 0: + logger.info('ファイルがないため、処理をスキップします') + return + + # ファイルが複数ある場合はエラーとする + if len(dat_file_list) > 1: + logger.error('複数の取込ファイルがあるため、異常終了') + return + # ファイルの件数は必ず1件になる + dat_file_info = dat_file_list[0] + # 0Byteの場合、 + if dat_file_info['size'] == 0: + logger.info('0Byteファイルのため、処理をスキップします') + return + dat_file_name = dat_file_info['filename'] + logger.info(f"Get File Name :{dat_file_name}") + now = datetime.now().strftime('%Y/%m/%d') + # ファイルをバックアップ + # 現行は、jobctrl_dailyの先頭でやっている + ultmarc_bucket.backup_edi_file(dat_file_name, now) + # datファイルをダウンロード + local_file_path = ultmarc_bucket.download_edi_file(dat_file_name) + # サンプル実装するのは、3つ + # 511-01(所属学会専門医: COM_専門分野), 101-00(DCF施設: COM_施設), 008(所属部科コード: COM_所属部科) + mapper_factory = UltmarcTableMapperFactory() + dat_file = DatFile.from_path(local_file_path) + # datファイルを1行ずつ処理し、各テーブルへ登録 + for line in dat_file: + # 書き込み先のテーブルを特定 + com_class = mapper_factory.create(line.layout_class, line.record_id, line.record) + print(com_class) + query = com_class.make_query() + # print(query) + finally: + logger.info('終了') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py new file mode 100644 index 00000000..88313ac6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -0,0 +1,45 @@ +import binascii +import csv +import os.path as path +from io import TextIOWrapper + +from src.batch.ultmarc.mdb_character_set_hex import MDB_CHARACTER_SET_HEX + + +class DatFileLine: + layout_class: str + record_id: str + record: list[str] + + def __init__(self, dat_line: list[str]) -> None: + self.layout_class = dat_line[0] + self.record_id = dat_line[1] + self.record = dat_line[1:] + +class DatFile: + lines: list[DatFileLine] + __i: int = 0 + + def __iter__(self): + return self + + def __next__(self) -> DatFileLine: + if self.__i == len(self.lines): + raise StopIteration() + line = self.lines[self.__i] + self.__i += 1 + return line + + def __init__(self, file: TextIOWrapper) -> None: + reader = csv.reader(file) + csv_rows = [DatFileLine(row) for row in reader] + + self.lines = csv_rows + + @classmethod + def from_path(cls, local_file_path: str): + # cp932(Shift-JIS Windows拡張)でファイルを読み込む + file = open(local_file_path, encoding='cp932') + instance = cls(file) + file.close() + return instance diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py new file mode 100644 index 00000000..b0f23166 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py @@ -0,0 +1,8 @@ +import glob +import os + +# 同階層内のモジュールを一括でインポート +__all__ = [ + os.path.split(os.path.splitext(file)[0])[1] + for file in glob.glob(os.path.join(os.path.dirname(__file__), '[a-zA-Z0-9]*.py')) +] \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py new file mode 100644 index 00000000..e2351c73 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py @@ -0,0 +1,7 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + + +class ComInst(UltmarcTableMapper): + def make_query(self): + return "INSERT INTO src05.com_inst values('hogehoge')" diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py new file mode 100644 index 00000000..62434401 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py @@ -0,0 +1,8 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + + +class NullMapper(UltmarcTableMapper): + + def make_query(self): + return super().make_query() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py new file mode 100644 index 00000000..3ae7c9ae --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -0,0 +1,14 @@ +from abc import ABCMeta, abstractmethod + + +class UltmarcTableMapper(metaclass=ABCMeta): + pass + + _records: list[str] + + def __init__(self, records: list[str]) -> None: + self._records = records + + @abstractmethod + def make_query(self): + pass diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py new file mode 100644 index 00000000..4803709b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import (com_inst, + null_mapper) +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + +# テーブルとのマッピング +COM_TABLE_LIST = { + # レコードID固定 + # COM_医師学会 + "521": {"01": null_mapper.NullMapper}, + # COM_施設属性 + "111": {"00": null_mapper.NullMapper}, + # COM_臨床研修病院 + "112": {"00": null_mapper.NullMapper}, + # COM_医師 + "501": {"01": null_mapper.NullMapper}, + # COM_施設 + "101": {"00": com_inst.ComInst}, + # COM_医師勤務先 + "502": {"01": null_mapper.NullMapper}, + # COM_専門分野 + "511": {"01": null_mapper.NullMapper}, + # COM_都道府県医療機能情報(基本) + "132": {"00": null_mapper.NullMapper}, + # COM_都道府県医療機能情報(施設設備) + "133": {"00": null_mapper.NullMapper}, + # COM_都道府県医療機能情報(疾患治療) + "134": {"00": null_mapper.NullMapper}, + # COM_都道府県医療機能情報(短期滞在手術) + "135": {"00": null_mapper.NullMapper}, + # COM_都道府県医療機能情報(専門外来) + "136": {"00": null_mapper.NullMapper}, + + # レコードID浮動 + # COM_診療科目 + "001": null_mapper.NullMapper, + # COM_病院種別 + "002": null_mapper.NullMapper, + # COM_出身校学部識別 + "003": null_mapper.NullMapper, + # COM_出身校 + "004": null_mapper.NullMapper, + # COM_役職 + "005": null_mapper.NullMapper, + # 都道府県マスタ + "006": null_mapper.NullMapper, + # COM_経営体 + "007": null_mapper.NullMapper, + # COM_所属部科 + "008": null_mapper.NullMapper, + # COM_学会 + "009": null_mapper.NullMapper, + # COM_専門医資格 + "010": null_mapper.NullMapper, + # COM_施設区分 + "011": null_mapper.NullMapper, + # COM_高度先進医療 + "021": null_mapper.NullMapper, + # COM_先端医療機器 + "022": null_mapper.NullMapper, + # COM_看護種別 + "023": null_mapper.NullMapper, + # COM_医療機能評価 + "024": null_mapper.NullMapper, + # COM_地域クリティカルパス + "026": null_mapper.NullMapper, + # COM_疾患別リハビリテーション科 + "027": null_mapper.NullMapper, + # COM_政策医療 + "028": null_mapper.NullMapper, + # COM_医療圏都道府県 + "121": null_mapper.NullMapper, + # COM_医療圏3次マスタ + "122": null_mapper.NullMapper, + # COM_二次医療圏 + "123": null_mapper.NullMapper, + # COM_医療圏都道府県市町村対照表 + "124": null_mapper.NullMapper +} + +class UltmarcTableMapperFactory: + + def create(self, layout_class: str, record_id: str, records: list[str]) -> UltmarcTableMapper: + # レイアウト種別とレコードIDから、マッピング先のテーブルを特定 + table_by_layout_class = COM_TABLE_LIST.get(layout_class) + + # レイアウト種別が特定できない場合はエラーとする + if table_by_layout_class is None: + raise Exception('特定できませんでした') + + mapper_class: UltmarcTableMapper = None + if type(table_by_layout_class) is dict: + mapper_class = table_by_layout_class.get(record_id) + elif issubclass(table_by_layout_class, UltmarcTableMapper): + mapper_class = table_by_layout_class + + return mapper_class(records) From ec2a4a9470b8a414bc992c7b81af3af4ce94946e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 4 Apr 2023 11:34:57 +0900 Subject: [PATCH 021/962] =?UTF-8?q?feat:=20=E8=96=AC=E5=B1=80=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E3=83=9E=E3=83=83=E3=83=94?= =?UTF-8?q?=E3=83=B3=E3=82=B0=E8=BF=BD=E5=8A=A0=E3=80=82=E7=8F=BE=E5=9C=A8?= =?UTF-8?q?=E3=81=AF=E7=A9=BA=E6=8C=AF=E3=82=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 4803709b..36a39060 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -16,6 +16,8 @@ COM_TABLE_LIST = { "501": {"01": null_mapper.NullMapper}, # COM_施設 "101": {"00": com_inst.ComInst}, + # COM_薬局 + "102": {"03": null_mapper.NullMapper}, # COM_医師勤務先 "502": {"01": null_mapper.NullMapper}, # COM_専門分野 From 5f67c8f00867547b129abeee738138639f6b9b80 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Apr 2023 14:42:32 +0900 Subject: [PATCH 022/962] =?UTF-8?q?feat:=20COM=5F=E5=85=88=E7=AB=AF?= =?UTF-8?q?=E5=8C=BB=E7=99=82=E6=A9=9F=E5=99=A8=E3=81=AE=E7=99=BB=E9=8C=B2?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F=E8=A3=85=E3=80=81=E5=91=A8?= =?UTF-8?q?=E8=BE=BA=E3=81=AE=E3=83=AD=E3=82=B0=E5=87=BA=E5=8A=9B=E3=82=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/dat_insert.py | 48 ++++++++-- .../src/batch/ultmarc/datfile.py | 16 +++- .../concrete/com_hamtec_mapper.py | 96 +++++++++++++++++++ .../{com_inst.py => com_inst_mapper.py} | 4 +- .../table_mapper/ultmarc_table_mapper.py | 38 +++++++- .../ultmarc/utmp_tables/tables/__init__.py | 0 .../ultmarc/utmp_tables/tables/com_hamtec.py | 17 ++++ .../utmp_tables/tables/ultmarc_table.py | 8 ++ .../ultmarc_table_mapper_factory.py | 13 +-- 9 files changed, 213 insertions(+), 27 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py rename ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/{com_inst.py => com_inst_mapper.py} (56%) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index 055f9bff..3e7f6efe 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -8,6 +8,7 @@ from src.aws.s3 import UltmarcBucket from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory +from src.db.database import Database from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') @@ -16,9 +17,13 @@ ultmarc_bucket = UltmarcBucket() def dat_insert_control(): try: logger.info('datInsert START') + # DBセットアップ + db = Database.get_instance() + db.connect() + # ファイル単位でトランザクションを行う + db.begin() # datファイルをS3から取得する dat_file_list = ultmarc_bucket.list_edi_file() - # ファイルがない場合は処理せず、正常終了とする if len(dat_file_list) == 0: logger.info('ファイルがないため、処理をスキップします') @@ -42,16 +47,41 @@ def dat_insert_control(): ultmarc_bucket.backup_edi_file(dat_file_name, now) # datファイルをダウンロード local_file_path = ultmarc_bucket.download_edi_file(dat_file_name) - # サンプル実装するのは、3つ - # 511-01(所属学会専門医: COM_専門分野), 101-00(DCF施設: COM_施設), 008(所属部科コード: COM_所属部科) + mapper_factory = UltmarcTableMapperFactory() dat_file = DatFile.from_path(local_file_path) # datファイルを1行ずつ処理し、各テーブルへ登録 - for line in dat_file: - # 書き込み先のテーブルを特定 - com_class = mapper_factory.create(line.layout_class, line.record_id, line.record) - print(com_class) - query = com_class.make_query() - # print(query) + for log_count, line in enumerate(dat_file): + try: + # 書き込み先のテーブルを特定 + mapper_class = mapper_factory.create( + line.layout_class, + line.record_id, + line.record, + db + ) + mapper_class.make_query() + mapper_class.execute_queries() + dat_file.count_up_success() + # 5000件ごとにログ記録 + # これいる?? + if log_count % 5000 == 0: + logger.info(f'Count: {log_count}') + except Exception as e: + # TODO: ログちゃんとする + record = line.record + log_message = ','.join([f'"{r}"' for r in record]) + logger.warning(log_message) + dat_file.count_up_error() + # すべての行を登録終えたらコミットする + db.commit() + logger.info(f'datInsert RESULT') + logger.info(f'SUCCESS_COUNT={dat_file.success_count}') + logger.info(f'ERROR_COUNT={dat_file.error_count}') + logger.info(f'ALL_COUNT={dat_file.total_count}') + except Exception as e: + logger.exception(e) + raise e finally: + db.disconnect() logger.info('終了') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py index 88313ac6..29c0bbc9 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -1,10 +1,6 @@ -import binascii import csv -import os.path as path from io import TextIOWrapper -from src.batch.ultmarc.mdb_character_set_hex import MDB_CHARACTER_SET_HEX - class DatFileLine: layout_class: str @@ -14,10 +10,13 @@ class DatFileLine: def __init__(self, dat_line: list[str]) -> None: self.layout_class = dat_line[0] self.record_id = dat_line[1] - self.record = dat_line[1:] + self.record = dat_line class DatFile: lines: list[DatFileLine] + success_count: int = 0 + error_count: int = 0 + total_count: int = 0 __i: int = 0 def __iter__(self): @@ -35,6 +34,13 @@ class DatFile: csv_rows = [DatFileLine(row) for row in reader] self.lines = csv_rows + self.total_count = len(csv_rows) + + def count_up_success(self): + self.success_count += 1 + + def count_up_error(self): + self.error_count += 1 @classmethod def from_path(cls, local_file_path: str): diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py new file mode 100644 index 00000000..8dd8f463 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_hamtec import ComHamtec + + +class ComHamtecMapper(UltmarcTableMapper): + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_hamtec + WHERE + hamtec_cd = :hamtec_cd + """ + # データ登録・更新用のSQL + INSERT_QUERY = """\ + INSERT INTO src05.com_hamtec + ( + hamtec_cd, + hamtec_div, + hamtec_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hamtec_cd, + :hamtec_div, + :hamtec_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_hamtec + SET + hamtec_div = :hamtec_div, + hamtec_name = :hamtec_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hamtec_cd = :hamtec_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_hamtec + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + hamtec_cd = :hamtec_cd + """ + record: ComHamtec + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComHamtec) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameters[0]['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameters[0] = {**self.query_parameters[0], **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameters[0]) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + # 更新データがある場合のみ更新 + if self.record.hamtec_div != '' or self.record.hamtec_name != '': + return self.UPDATE_QUERY + else: + return None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py similarity index 56% rename from ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index e2351c73..924e657d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -2,6 +2,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper -class ComInst(UltmarcTableMapper): +class ComInstMapper(UltmarcTableMapper): def make_query(self): - return "INSERT INTO src05.com_inst values('hogehoge')" + self.queries.append(None) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py index 3ae7c9ae..80f74f04 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -1,14 +1,42 @@ from abc import ABCMeta, abstractmethod +from datetime import datetime + +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable +from src.db.database import Database class UltmarcTableMapper(metaclass=ABCMeta): - pass - - _records: list[str] + record: UltmarcTable + db: Database + queries: list[str] + query_parameters: list[dict] - def __init__(self, records: list[str]) -> None: - self._records = records + def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None: + self.record = table_class(record) + self.db = db + + # 実行年月日(文字列)、実行年月日時分秒を設定 + now = datetime.now() + execute_date_str_ymd = now.strftime('%Y%m%d') + execute_datetime = now.strftime('%Y/%m/%d %H:%M:%S') + # クエリリストを初期化 + self.queries = [] + # 共通クエリパラメータを設定 + self.query_parameters = [{ + 'execute_date_str_ymd': execute_date_str_ymd, + 'execute_datetime': execute_datetime + }] @abstractmethod def make_query(self): pass + + def execute_queries(self): + if len(self.queries) == 0: + raise Exception('make_queryを呼び出してから実行してください') + + for i, query in enumerate(self.queries): + if query is None: + continue + + self.db.execute(query, self.query_parameters[i]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py new file mode 100644 index 00000000..5842c52c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py @@ -0,0 +1,17 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComHamtec(UltmarcTable): + + maint_flag: str # 修正区分 + hamtec_cd: str # 高度先進医療コード + hamtec_div: str # 高度先進医療区分 + hamtec_name: str # 高度先進医療名 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[3] + self.hamtec_cd = record[1] + # 0埋めでデータが来るので、0を削除する + self.hamtec_div = record[2].replace('0', '') + self.hamtec_name = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py new file mode 100644 index 00000000..a251d690 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py @@ -0,0 +1,8 @@ +class UltmarcTable: + + record: list + def __init__(self, record: list): + self.record = record + + def to_sql_parameter(self): + return vars(self) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 36a39060..0b5748c0 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,7 +1,8 @@ -from src.batch.ultmarc.utmp_tables.table_mapper.concrete import (com_inst, - null_mapper) +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( + com_hamtec_mapper, com_inst_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper +from src.db.database import Database # テーブルとのマッピング COM_TABLE_LIST = { @@ -15,7 +16,7 @@ COM_TABLE_LIST = { # COM_医師 "501": {"01": null_mapper.NullMapper}, # COM_施設 - "101": {"00": com_inst.ComInst}, + "101": {"00": com_inst_mapper.ComInstMapper}, # COM_薬局 "102": {"03": null_mapper.NullMapper}, # COM_医師勤務先 @@ -57,7 +58,7 @@ COM_TABLE_LIST = { # COM_施設区分 "011": null_mapper.NullMapper, # COM_高度先進医療 - "021": null_mapper.NullMapper, + "021": com_hamtec_mapper.ComHamtecMapper, # COM_先端医療機器 "022": null_mapper.NullMapper, # COM_看護種別 @@ -82,7 +83,7 @@ COM_TABLE_LIST = { class UltmarcTableMapperFactory: - def create(self, layout_class: str, record_id: str, records: list[str]) -> UltmarcTableMapper: + def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper: # レイアウト種別とレコードIDから、マッピング先のテーブルを特定 table_by_layout_class = COM_TABLE_LIST.get(layout_class) @@ -96,4 +97,4 @@ class UltmarcTableMapperFactory: elif issubclass(table_by_layout_class, UltmarcTableMapper): mapper_class = table_by_layout_class - return mapper_class(records) + return mapper_class(records, db) From 3fa5f03588e412a097fc7f0071b84b8b1929c0fb Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Apr 2023 14:52:38 +0900 Subject: [PATCH 023/962] =?UTF-8?q?feat:=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py | 2 -- .../src/batch/ultmarc/utmp_tables/tables/com_hamtec.py | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index 3e7f6efe..025db42f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -1,7 +1,5 @@ """アルトマークデータ保管""" -import json -import os.path as path from datetime import datetime from src.aws.s3 import UltmarcBucket diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py index 5842c52c..4d8ccb0f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py @@ -12,6 +12,5 @@ class ComHamtec(UltmarcTable): super().__init__(record) self.maint_flag = record[3] self.hamtec_cd = record[1] - # 0埋めでデータが来るので、0を削除する - self.hamtec_div = record[2].replace('0', '') + self.hamtec_div = record[2] self.hamtec_name = record[6] From 66760c398fd1bd034bfb673b3ab589ddd5455107 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Apr 2023 17:20:01 +0900 Subject: [PATCH 024/962] =?UTF-8?q?feat:=20=E5=87=BA=E8=BA=AB=E6=A0=A1?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=8F=96=E3=82=8A=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/dat_insert.py | 1 + .../table_mapper/concrete/com_alma_mapper.py | 90 +++++++++++++++++++ .../concrete/com_hamtec_mapper.py | 1 + .../ultmarc/utmp_tables/tables/com_alma.py | 14 +++ .../ultmarc_table_mapper_factory.py | 4 +- 5 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index 025db42f..2975b5ae 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -67,6 +67,7 @@ def dat_insert_control(): logger.info(f'Count: {log_count}') except Exception as e: # TODO: ログちゃんとする + logger.warning(e) record = line.record log_message = ','.join([f'"{r}"' for r in record]) logger.warning(log_message) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py new file mode 100644 index 00000000..52008ec5 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -0,0 +1,90 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_alma import ComAlma + + +class ComAlmaMapper(UltmarcTableMapper): + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_alma + WHERE + alma_cd = :alma_cd + """ + # データ登録・更新用のSQL + INSERT_QUERY = """\ + INSERT INTO src05.com_alma + ( + alma_cd, + alma, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :alma_cd, + :alma, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_alma + SET + alma = :alma, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_alma + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + """ + record: ComAlma + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComAlma) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameters[0]['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameters[0] = {**self.query_parameters[0], **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameters[0]) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index 8dd8f463..1221965a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -63,6 +63,7 @@ class ComHamtecMapper(UltmarcTableMapper): hamtec_cd = :hamtec_cd """ record: ComHamtec + def __init__(self, record: list[str], db) -> None: super().__init__(record, db, ComHamtec) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py new file mode 100644 index 00000000..0ea65397 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComAlma(UltmarcTable): + + maint_flag: str # 修正区分 + alma_cd: str # 出身校コード + alma: str # 出身校 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.alma_cd = record[1] + self.alma = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 0b5748c0..7f1ee24e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,5 +1,5 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( - com_hamtec_mapper, com_inst_mapper, null_mapper) + com_alma_mapper, com_hamtec_mapper, com_inst_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -42,7 +42,7 @@ COM_TABLE_LIST = { # COM_出身校学部識別 "003": null_mapper.NullMapper, # COM_出身校 - "004": null_mapper.NullMapper, + "004": com_alma_mapper.ComAlmaMapper, # COM_役職 "005": null_mapper.NullMapper, # 都道府県マスタ From 7f7d829e3d3b2b463a29f4b53d6b7a1d8d6bd53e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 11:01:53 +0900 Subject: [PATCH 025/962] =?UTF-8?q?feat:=20=E5=8C=BB=E5=B8=AB=E5=8B=A4?= =?UTF-8?q?=E5=8B=99=E5=85=88=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF=E8=BF=BD=E5=8A=A0(?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E7=A2=BA=E8=AA=8D=E4=B8=AD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/common/batch_config.py | 10 + .../src/batch/datachange/emp_chg_inst_lau.py | 8 +- .../table_mapper/concrete/com_alma_mapper.py | 8 +- .../concrete/com_dr_wrkplace_mapper.py | 241 ++++++++++++++++++ .../concrete/com_hamtec_mapper.py | 8 +- .../table_mapper/ultmarc_table_mapper.py | 17 +- .../ultmarc/utmp_tables/tables/com_alma.py | 6 +- .../utmp_tables/tables/com_dr_wrkplace.py | 49 ++++ .../ultmarc/utmp_tables/tables/com_hamtec.py | 8 +- .../ultmarc_table_mapper_factory.py | 5 +- ecs/jskult-batch-daily/src/jobctrl_daily.py | 13 +- 11 files changed, 345 insertions(+), 28 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/common/batch_config.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_config.py b/ecs/jskult-batch-daily/src/batch/common/batch_config.py new file mode 100644 index 00000000..cfaef528 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/batch_config.py @@ -0,0 +1,10 @@ +class BatchConfig: + # 処理日(yyyy/mm/dd形式) + syor_date: str + __instance = None + + @classmethod + def get_instance(cls): + if cls.__instance == None: + cls.__instance = cls() + return cls.__instance diff --git a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py index 252b6e17..ed13f855 100644 --- a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py +++ b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py @@ -1,18 +1,20 @@ from src.batch.batch_functions import get_syor_date_as_date_format, logging_sql +from src.batch.common.batch_config import BatchConfig from src.db.database import Database from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime logger = get_logger('48-施設担当者マスタ洗替') +batch_config = BatchConfig.get_instance() def batch_process(): db = Database.get_instance() db.connect() logger.info('##########################') logger.info('START Changing Employee in charge of institution PGM.') - # 日付テーブルを取得 - syor_date = get_syor_date_as_date_format(db) + # 業務日付を取得 + syor_date = batch_config.syor_date # `emp_chg_inst_lau`をTruncate truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert @@ -153,7 +155,7 @@ def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): muko_flg = '0' AND dcf_inst_cd_new IS NOT NULL AND enabled_flg = 'Y' - AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date -- TODO: tekiyo_monthはいっぴにする + AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date """, {'syor_date': syor_date} ) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index 52008ec5..fc137ea7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -13,7 +13,7 @@ class ComAlmaMapper(UltmarcTableMapper): WHERE alma_cd = :alma_cd """ - # データ登録・更新用のSQL + # データ登録用SQL INSERT_QUERY = """\ INSERT INTO src05.com_alma ( @@ -65,9 +65,9 @@ class ComAlmaMapper(UltmarcTableMapper): super().__init__(record, db, ComAlma) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) # モジュール名をクエリパラメータに設定 - self.query_parameters[0]['program_name'] = program_name + self.query_parameter['program_name'] = program_name # 読み込んだレコード値もクエリパラメータに追加 - self.query_parameters[0] = {**self.query_parameters[0], **self.record.to_sql_parameter()} + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): # 修正区分がC(削除)の場合、論理削除 @@ -81,7 +81,7 @@ class ComAlmaMapper(UltmarcTableMapper): def __make_upsert_query(self): # レコードの存在確認 - record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameters[0]) + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: return self.INSERT_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py new file mode 100644 index 00000000..f058e1c4 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -0,0 +1,241 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace + + +class ComDrWrkplaceMapper(UltmarcTableMapper): + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + """ + # COM_所属部課から所属部科カナと所属部科名を取得するSQL + GET_NAME_FROM_COM_BLNG_SEC_QUERY = """\ + SELECT + blng_sec_kana, + blng_sec_name + FROM + src05.com_blng_sec + WHERE + blng_sec_cd = :sectcode + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr_wrkplace ( + dcf_dsf_inst_cd, + dcf_pcf_dr_cd, + blng_sec_cd, + post_cd, + identity_cd, + aply_start_ymd, + blng_sec_name_kana, + blng_sec_name, + notdm_flg, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :full_hp_code, + :full_dcfdr_code, + :sectcode, + :postcode, + :identitycode, + :syor_date, + :sectname_kana, + :sectname, + :notdm_flg, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_dr_wrkplace + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + DCF_PCF_DR_CD= :full_dcfdr_code + AND DCF_DSF_INST_CD = :full_hp_code + """ + + # 更新・削除の場合に該当のデータを履歴テーブルに退避するSQL + TO_HISTORY_QUERY = """\ + INSERT INTO src05.com_dr_wrkplace_his ( + dcf_dsf_inst_cd, + dcf_pcf_dr_cd, + blng_sec_cd, + post_cd, + identity_cd, + aply_start_ymd, + blng_sec_name_kana, + blng_sec_name, + notdm_flg, + aply_end_ymd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + SELECT + dcf_dsf_inst_cd, + dcf_pcf_dr_cd, + ( + CASE + WHEN blng_sec_cd = '' THEN '9999' + ELSE blng_sec_cd + END + ) AS blng_sec_cd, + ( + CASE + WHEN post_cd = '' THEN '999' + ELSE post_cd + END + ) AS post_cd, + ( + CASE + WHEN identity_cd = '' THEN '999' + ELSE identity_cd + END + ) AS identity_cd, + DATE_FORMAT(aply_start_ymd, '%Y%m%d'), + blng_sec_name_kana, + blng_sec_name, + notdm_flg, + ( + CASE + WHEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') > DATE_FORMAT(STR_TO_DATE(:syor_date, '%Y%m%d'), '%Y%m%d') -1 THEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') + ELSE DATE_FORMAT(STR_TO_DATE(:syor_date, '%Y%m%d'), '%Y%m%d') -1 + END + ) AS aply_end_ymd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + FROM + src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + AND aply_start_ymd < :syor_date + """ + + # 退職レコードの場合、物理削除するSQL + PHYSICAL_DELETE_FOR_RETIREMENT_QUERY = """\ + DELETE FROM src05.com_dr_wrkplace + WHERE + dcf_pcf_dr_cd = :full_dcfdr_code + AND dcf_dsf_inst_cd = :full_hp_code + """ + + record: ComDrWrkplace + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDrWrkplace) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 所属部科を取得し、所属部科カナと所属部科名を設定する + self.__set_sect_name_and_sect_name_kana() + # 追加/更新クエリを生成 + # 履歴へのレコード登録もあるため、リストで返る + self.queries = self.__make_queries() + return + + def __set_sect_name_and_sect_name_kana(self): + # 所属部科を取得し、所属部科カナと所属部科名を設定する + com_blng_sec_records = self.db.execute_select(self.GET_NAME_FROM_COM_BLNG_SEC_QUERY, self.query_parameter) + if len(com_blng_sec_records) == 0: + return + # 必ず1件 + com_blng_sec_record = com_blng_sec_records[0] + if com_blng_sec_record['blig_sec_kane'] != '' and com_blng_sec_record['blig_sec_kane'] is not None: + self.record.sectname_kana = com_blng_sec_record['blig_sec_kane'] + + if com_blng_sec_record['blig_sec_name'] != '' and com_blng_sec_record['blig_sec_name'] is not None: + self.record.sectname = com_blng_sec_record['blig_sec_name'] + + def __make_queries(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return [self.INSERT_QUERY] + + # 存在する場合はUpdate + # 予備/退職異動区分が1(削除:退職)の場合、退職済みのレコードとして処理 + if self.record.drretflag == '1': + # 履歴への移動と、退職レコードの物理削除 + return [self.TO_HISTORY_QUERY, self.PHYSICAL_DELETE_FOR_RETIREMENT_QUERY] + + # 履歴への移動+更新クエリ生成 + return self.__make_update_query() + + def __make_update_query(self): + make_history_query = None + # 履歴レコード作成判断となる、UPDATE SET句を作成 + set_clauses = self.__make_update_columns_with_historical() + # 何かしら更新がある場合、履歴作成クエリを作成 + if len(set_clauses) != 0: + # DM不可フラグの値をセット + # 履歴レコード作成判断とならないため、後から設定 + if self.record.notdm_flg != '': + set_clauses.append('notdm_flg = :notdm_flg') + self.query_parameter['notdm_flg'] = self.record.sectname if self.record.sectcode != '@' else 'NULL' + + make_history_query = self.TO_HISTORY_QUERY + + update_query = self.UPDATE_QUERY.format( + update_columns=','.join(set_clauses) + ) + + return [make_history_query, update_query] + + def __make_update_columns_with_historical(self): + # 履歴レコードの作成有無を判断するカラムの更新設定 + # DM不可フラグは、履歴レコードの作成判断に使わないため、この関数の外で判定する + set_clauses = [] + # 役職コード + if self.record.postcode != '': + set_clauses.append('post_cd = :postcode') + self.query_parameter['postcode'] = self.record.postcode if self.record.postcode != '@' else '' + # 大学順位 + if self.record.identitycode != '': + set_clauses.append('identity_cd = :identitycode') + self.query_parameter['identitycode'] = self.record.identitycode if self.record.identitycode != '@' else '' + # 所属部科(集合項目) + if self.record.sectcode != '': + set_clauses.append('blng_sec_cd = :sectcode') + set_clauses.append('blng_sec_name_kana = :sectname_kana') + set_clauses.append('blng_sec_name = :sectname') + self.query_parameter['sectcode'] = self.record.sectcode if self.record.sectcode != '@' else '9999' + self.query_parameter['sectname_kana'] = self.record.sectname_kana if self.record.sectcode != '@' else 'NULL' + # 全角文字なので、全角@が連携されるパターンがある + self.query_parameter['sectname'] = self.record.sectname if self.record.sectcode != '@' else 'NULL' + + # 何かしら更新がある場合、適用開始日をセットする + if len(set_clauses) != 0: + # 処理日はパラメータに設定済み + set_clauses.append("aply_start_ymd = DATE_FORMAT(:syor_date, '%Y%m%d')") + + return set_clauses diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index 1221965a..10c4f51d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -13,7 +13,7 @@ class ComHamtecMapper(UltmarcTableMapper): WHERE hamtec_cd = :hamtec_cd """ - # データ登録・更新用のSQL + # データ登録用SQL INSERT_QUERY = """\ INSERT INTO src05.com_hamtec ( @@ -68,9 +68,9 @@ class ComHamtecMapper(UltmarcTableMapper): super().__init__(record, db, ComHamtec) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) # モジュール名をクエリパラメータに設定 - self.query_parameters[0]['program_name'] = program_name + self.query_parameter['program_name'] = program_name # 読み込んだレコード値もクエリパラメータに追加 - self.query_parameters[0] = {**self.query_parameters[0], **self.record.to_sql_parameter()} + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): # 修正区分がC(削除)の場合、論理削除 @@ -84,7 +84,7 @@ class ComHamtecMapper(UltmarcTableMapper): def __make_upsert_query(self): # レコードの存在確認 - record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameters[0]) + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: return self.INSERT_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py index 80f74f04..a633d9fa 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -1,15 +1,18 @@ from abc import ABCMeta, abstractmethod from datetime import datetime +from src.batch.common.batch_config import BatchConfig from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable from src.db.database import Database +# 処理日を使用するために、configを使用 +batch_config = BatchConfig.get_instance() class UltmarcTableMapper(metaclass=ABCMeta): record: UltmarcTable db: Database queries: list[str] - query_parameters: list[dict] + query_parameter: dict def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None: self.record = table_class(record) @@ -22,10 +25,12 @@ class UltmarcTableMapper(metaclass=ABCMeta): # クエリリストを初期化 self.queries = [] # 共通クエリパラメータを設定 - self.query_parameters = [{ + self.query_parameter = { 'execute_date_str_ymd': execute_date_str_ymd, - 'execute_datetime': execute_datetime - }] + 'execute_datetime': execute_datetime, + # バッチ共通設定から処理日を取得 + 'syor_date': batch_config.syor_date + } @abstractmethod def make_query(self): @@ -35,8 +40,8 @@ class UltmarcTableMapper(metaclass=ABCMeta): if len(self.queries) == 0: raise Exception('make_queryを呼び出してから実行してください') - for i, query in enumerate(self.queries): + for query in self.queries: if query is None: continue - self.db.execute(query, self.query_parameters[i]) + self.db.execute(query, self.query_parameter) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py index 0ea65397..07d2af8f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComAlma(UltmarcTable): - + """COM_出身校""" maint_flag: str # 修正区分 alma_cd: str # 出身校コード alma: str # 出身校 @@ -10,5 +10,5 @@ class ComAlma(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) self.maint_flag = record[2] - self.alma_cd = record[1] - self.alma = record[5] + self.alma_cd = record[1] + self.alma = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py new file mode 100644 index 00000000..ec501438 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py @@ -0,0 +1,49 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDrWrkplace(UltmarcTable): + """COM_医師勤務先""" + maint_flag: str # 修正区分 + dcfdr_id: str # 個人コード(ID) + dcfdr_code: str # 個人コード(個人コード) + dcfdr_yobi: str # 個人コード(予備) + hp_id: str # 施設コード(ID) + hp_code: str # 施設コード(施設コード) + hp_yobi: str # 施設コード(予備) + drretflag: str # 予備/退職異動区分 + maintdate: str # メンテナンス年月日 + trndate: str # 予備/転送年月日 + postcode: str # 役職コード + identitycode: str # 大学職位 + sectcode: str # 所属部科コード + sectname: str # 所属部科(漢字) + sectname_kana: str # 所属部科(カナ) + notdm_flg: str # DM不可フラグ + full_dcfdr_code: str # 個人ID+個人コード+個人コード予備 + full_hp_code: str # 施設ID+施設コード+施設コード予備 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maintflag = record[4] + self.dcfdr_id = record[1] + self.dcfdr_code = record[2] + self.dcfdr_yobi = record[3].strip() + self.hp_id = record[5] + self.hp_code = record[6] + self.hp_yobi = record[7].strip() + self.drretflag = record[8] + self.maintdate = record[9] + self.trndate = record[10] + self.postcode = record[11].strip() + self.identitycode = record[12].strip() + + # 所属部科の集合項目 + self.sectcode = record[13].strip() + self.sectname = record[14].strip() + self.sectname_kana = record[15].strip() + + self.notdm_flg = record[16].strip() + + # ID、コード、予備を結合してフル桁コードに変換 + self.full_dcfdr_code = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfdr_yobi]) + self.full_hp_code = ''.join([self.hp_id, self.hp_code, self.hp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py index 4d8ccb0f..380e5fd3 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComHamtec(UltmarcTable): - + """COM_高度先進医療""" maint_flag: str # 修正区分 hamtec_cd: str # 高度先進医療コード hamtec_div: str # 高度先進医療区分 @@ -10,7 +10,7 @@ class ComHamtec(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.maint_flag = record[3] - self.hamtec_cd = record[1] - self.hamtec_div = record[2] + self.maint_flag = record[3] + self.hamtec_cd = record[1] + self.hamtec_div = record[2] self.hamtec_name = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 7f1ee24e..842b6e3a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,5 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( - com_alma_mapper, com_hamtec_mapper, com_inst_mapper, null_mapper) + com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, + com_inst_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -20,7 +21,7 @@ COM_TABLE_LIST = { # COM_薬局 "102": {"03": null_mapper.NullMapper}, # COM_医師勤務先 - "502": {"01": null_mapper.NullMapper}, + "502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper}, # COM_専門分野 "511": {"01": null_mapper.NullMapper}, # COM_都道府県医療機能情報(基本) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 7b8cfd38..cf374ef5 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,10 +1,15 @@ from src.batch import jissekiaraigae -from src.batch.batch_functions import get_syor_date +from src.batch.batch_functions import get_syor_date_as_date_format +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.dat_insert import dat_insert_control from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger logger = get_logger('日次処理コントロール') # ここを処理IDとかにするといいかもしれない +# バッチ共通設定を取得 +batch_config = BatchConfig.get_instance() + def batch_process(): try: logger.info('日次ジョブ:開始') @@ -15,10 +20,14 @@ def batch_process(): # logger.error('データベース接続エラー(異常終了)') # 検査例外を捕まえて、共通的に出せばいいと思う try: logger.info('処理日取得') - syor_date = get_syor_date() + syor_date = get_syor_date_as_date_format() except BatchOperationException as e: logger.error(f'処理日取得エラー(異常終了){e}') logger.info(f'処理日={syor_date}') + # バッチ共通設定に処理日を追加 + batch_config.syor_date = syor_date + # TODO: 本来のアルトマーク取り込み実施場所に移動させること + dat_insert_control() # 休日判定ファイルを読み込み logger.info('休日判定処理') if True: # 休日判定 From 2af174da79bc2708dcda5f282b4c6196c49c6b32 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 13:31:06 +0900 Subject: [PATCH 026/962] =?UTF-8?q?fix:=20=E3=83=90=E3=82=B0=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_dr_wrkplace_mapper.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index f058e1c4..e6c187f9 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -119,8 +119,8 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): notdm_flg, ( CASE - WHEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') > DATE_FORMAT(STR_TO_DATE(:syor_date, '%Y%m%d'), '%Y%m%d') -1 THEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') - ELSE DATE_FORMAT(STR_TO_DATE(:syor_date, '%Y%m%d'), '%Y%m%d') -1 + WHEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') > DATE_FORMAT(:syor_date, '%Y%m%d') -1 THEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') + ELSE DATE_FORMAT(:syor_date, '%Y%m%d') -1 END ) AS aply_end_ymd, :execute_date_str_ymd, @@ -205,8 +205,13 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): make_history_query = self.TO_HISTORY_QUERY + update_columns = ','.join(set_clauses) + if len(update_columns) > 0: + # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( - update_columns=','.join(set_clauses) + update_columns=update_columns ) return [make_history_query, update_query] From 22d9f8ecb81d866b9c8e17300b1dfa58528b1ad1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 13:44:27 +0900 Subject: [PATCH 027/962] =?UTF-8?q?style:=20=E3=83=89=E3=82=AD=E3=83=A5?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_alma_mapper.py | 2 ++ .../utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py | 2 ++ .../utmp_tables/table_mapper/concrete/com_hamtec_mapper.py | 2 ++ 3 files changed, 6 insertions(+) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index fc137ea7..6fc5c6f0 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -4,6 +4,8 @@ from src.batch.ultmarc.utmp_tables.tables.com_alma import ComAlma class ComAlmaMapper(UltmarcTableMapper): + """COM_出身校 登録処理""" + # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ SELECT diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index e6c187f9..273fdb07 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -4,6 +4,8 @@ from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace class ComDrWrkplaceMapper(UltmarcTableMapper): + """COM_医師勤務先 登録処理""" + # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ SELECT diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index 10c4f51d..7a6f8591 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -4,6 +4,8 @@ from src.batch.ultmarc.utmp_tables.tables.com_hamtec import ComHamtec class ComHamtecMapper(UltmarcTableMapper): + """COM_高度先進医療 登録処理""" + # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ SELECT From 54ac7c51d4e49aa45a6cae77ebe109fb5df89f32 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 13:58:53 +0900 Subject: [PATCH 028/962] =?UTF-8?q?style:=20=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=88=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vscode/recommended_settings.json | 16 +++++++++++++++- .../src/batch/ultmarc/dat_insert.py | 1 + .../src/batch/ultmarc/datfile.py | 5 +++-- .../table_mapper/concrete/com_alma_mapper.py | 4 ++-- .../concrete/com_dr_wrkplace_mapper.py | 10 +++++----- .../table_mapper/concrete/com_hamtec_mapper.py | 4 ++-- .../table_mapper/concrete/com_inst_mapper.py | 2 ++ .../table_mapper/concrete/null_mapper.py | 2 +- .../table_mapper/ultmarc_table_mapper.py | 7 ++++--- .../utmp_tables/ultmarc_table_mapper_factory.py | 1 + 10 files changed, 36 insertions(+), 16 deletions(-) diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json index d5ce3e07..4e6690ce 100644 --- a/ecs/jskult-batch-daily/.vscode/recommended_settings.json +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -14,5 +14,19 @@ "python.linting.flake8Enabled": true, "python.linting.flake8Args": ["--max-line-length=120"], "python.formatting.provider": "autopep8", - "python.formatting.autopep8Args": ["--max-line-length", "120"] + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "150", + "--ignore=F541" + ], + "flake8.args": [ + "--max-line-length", "150", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true } diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index 2975b5ae..a0884a00 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -12,6 +12,7 @@ from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') ultmarc_bucket = UltmarcBucket() + def dat_insert_control(): try: logger.info('datInsert START') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py index 29c0bbc9..589d7eb3 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -6,12 +6,13 @@ class DatFileLine: layout_class: str record_id: str record: list[str] - + def __init__(self, dat_line: list[str]) -> None: self.layout_class = dat_line[0] self.record_id = dat_line[1] self.record = dat_line + class DatFile: lines: list[DatFileLine] success_count: int = 0 @@ -32,7 +33,7 @@ class DatFile: def __init__(self, file: TextIOWrapper) -> None: reader = csv.reader(file) csv_rows = [DatFileLine(row) for row in reader] - + self.lines = csv_rows self.total_count = len(csv_rows) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index 6fc5c6f0..31049812 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -37,7 +37,7 @@ class ComAlmaMapper(UltmarcTableMapper): :program_name ) """ - + UPDATE_QUERY = """\ UPDATE src05.com_alma @@ -70,7 +70,7 @@ class ComAlmaMapper(UltmarcTableMapper): self.query_parameter['program_name'] = program_name # 読み込んだレコード値もクエリパラメータに追加 self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} - + def make_query(self): # 修正区分がC(削除)の場合、論理削除 if self.record.maint_flag == 'C': diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index 273fdb07..f8b578af 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -61,7 +61,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): :program_name ) """ - + # 更新用SQL UPDATE_QUERY = """\ UPDATE src05.com_dr_wrkplace @@ -155,7 +155,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): self.query_parameter['program_name'] = program_name # 読み込んだレコード値もクエリパラメータに追加 self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} - + def make_query(self): # 所属部科を取得し、所属部科カナと所属部科名を設定する self.__set_sect_name_and_sect_name_kana() @@ -204,7 +204,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): if self.record.notdm_flg != '': set_clauses.append('notdm_flg = :notdm_flg') self.query_parameter['notdm_flg'] = self.record.sectname if self.record.sectcode != '@' else 'NULL' - + make_history_query = self.TO_HISTORY_QUERY update_columns = ','.join(set_clauses) @@ -215,7 +215,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): update_query = self.UPDATE_QUERY.format( update_columns=update_columns ) - + return [make_history_query, update_query] def __make_update_columns_with_historical(self): @@ -244,5 +244,5 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): if len(set_clauses) != 0: # 処理日はパラメータに設定済み set_clauses.append("aply_start_ymd = DATE_FORMAT(:syor_date, '%Y%m%d')") - + return set_clauses diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index 7a6f8591..b77a4d7f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -39,7 +39,7 @@ class ComHamtecMapper(UltmarcTableMapper): :program_name ) """ - + UPDATE_QUERY = """\ UPDATE src05.com_hamtec @@ -73,7 +73,7 @@ class ComHamtecMapper(UltmarcTableMapper): self.query_parameter['program_name'] = program_name # 読み込んだレコード値もクエリパラメータに追加 self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} - + def make_query(self): # 修正区分がC(削除)の場合、論理削除 if self.record.maint_flag == 'C': diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index 924e657d..6a34c446 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -3,5 +3,7 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ class ComInstMapper(UltmarcTableMapper): + """COM_施設 登録処理: TODO""" + def make_query(self): self.queries.append(None) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py index 62434401..9b5d93a1 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/null_mapper.py @@ -3,6 +3,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ class NullMapper(UltmarcTableMapper): - + def make_query(self): return super().make_query() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py index a633d9fa..0a19be2a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -8,12 +8,13 @@ from src.db.database import Database # 処理日を使用するために、configを使用 batch_config = BatchConfig.get_instance() + class UltmarcTableMapper(metaclass=ABCMeta): record: UltmarcTable db: Database queries: list[str] query_parameter: dict - + def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None: self.record = table_class(record) self.db = db @@ -31,7 +32,7 @@ class UltmarcTableMapper(metaclass=ABCMeta): # バッチ共通設定から処理日を取得 'syor_date': batch_config.syor_date } - + @abstractmethod def make_query(self): pass @@ -43,5 +44,5 @@ class UltmarcTableMapper(metaclass=ABCMeta): for query in self.queries: if query is None: continue - + self.db.execute(query, self.query_parameter) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 842b6e3a..a086a250 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -82,6 +82,7 @@ COM_TABLE_LIST = { "124": null_mapper.NullMapper } + class UltmarcTableMapperFactory: def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper: From f6d047684689145cb439e382d532ed7fa40420b0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 14:16:48 +0900 Subject: [PATCH 029/962] =?UTF-8?q?docs:=20README=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 65 ++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index c0bfb248..ecc58e03 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -16,7 +16,7 @@ - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 - 「Pipenvの導入」までを行っておくこと - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する - - `pipenv install --python ` + - `pipenv install --dev --python ` - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく - MySQLの環境構築 @@ -47,27 +47,44 @@ ```text . -├── Pipfile -- Pythonモジュールの依存関係を管理するファイル -├── Dockerfile -- Dockerイメージを作成するためのファイル -├── Pipfile -- Pythonモジュールの依存関係を管理するファイル -├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル -├── README.md -- 当ファイル -├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル -└── src -- ソースコードの保管場所 - ├── batch -- バッチ処理関連ソース置き場 - │ ├── batch_functions.py -- バッチ処理共通関数置き場 - │ ├── datachange -- 実績洗替関連ソース置き場 - │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 - │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント - ├── db - │ └── database.py -- データベース操作共通処理 - ├── error - │ └── exceptions.py -- カスタム例外 - ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 - ├── logging - │ └── get_logger.py -- ログ出力の共通処理 - ├── system_var - │ └── environment.py -- 環境変数 - └── time - └── elapsed_time.py -- 実行時間計測用 +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Dockerfile -- Dockerイメージを作成するためのファイル +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md -- 当ファイル +├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル +├── src -- ソースコードの保管場所 +│ ├── aws +│ │ └── s3.py +│ ├── batch -- バッチ処理関連ソース置き場 +│ │ ├── batch_functions.py -- バッチ処理共通関数置き場 +│ │ ├── datachange -- 実績洗替関連ソース置き場 +│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 +│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント +│ │ └── ultmarc -- アルトマーク関連処理 +│ │ ├── dat_insert.py -- アルトマーク関連処理のエントリーポイント +│ │ ├── datfile.py -- データファイル読込 +│ │ └── utmp_tables -- アルトマークテーブルへの登録関連 +│ │ ├── table_mapper -- テーブルへのデータマッピング処理 +│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分) +│ │ │ │ ├── com_alma_mapper.py +│ │ │ │ ├── ... +│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス +│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス +│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分) +│ │ │ ├── com_alma.py +│ │ │ ├── ... +│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス +│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス +│ ├── db +│ │ └── database.py -- データベース操作共通処理 +│ ├── error +│ │ └── exceptions.py -- カスタム例外 +│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 +│ ├── logging +│ │ └── get_logger.py -- ログ出力の共通処理 +│ ├── system_var +│ │ └── environment.py -- 環境変数 +│ └── time +│ └── elapsed_time.py -- 実行時間計測用 ``` From 8caef8acec2522454e9bacec761c6313ce45b24d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Apr 2023 23:25:36 +0900 Subject: [PATCH 030/962] =?UTF-8?q?fix:=20=E3=83=88=E3=83=A9=E3=83=B3?= =?UTF-8?q?=E3=82=B6=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=8C=E5=8B=9D?= =?UTF-8?q?=E6=89=8B=E3=81=AB=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82Web=E3=81=AE=E6=96=B9=E3=82=82=E6=A8=AA=E5=B1=95?= =?UTF-8?q?=E9=96=8B=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/db/database.py | 45 ++++++++++++++++++----- ecs/jskult-webapp/src/db/database.py | 44 +++++++++++++++++----- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py index 7e8f845c..288fc4ff 100644 --- a/ecs/jskult-batch-daily/src/db/database.py +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -1,6 +1,5 @@ from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, create_engine, text) -from sqlalchemy.engine.create import create_engine from sqlalchemy.engine.url import URL from tenacity import retry, stop_after_attempt, wait_exponential @@ -10,6 +9,7 @@ from src.system_var import environment logger = get_logger(__name__) + class Database: """データベース操作クラス""" __connection: Connection = None @@ -19,8 +19,7 @@ class Database: __username: str = None __password: str = None __schema: str = None - __connection_string:str = None - + __connection_string: str = None def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: """このクラスの新たなインスタンスを初期化します @@ -37,9 +36,9 @@ class Database: self.__host = host self.__port = int(port) self.__schema = schema - + self.__connection_string = URL.create( - drivername='mysql+pymysql', + drivername='mysql+pymysql', username=self.__username, password=self.__password, host=self.__host, @@ -47,12 +46,11 @@ class Database: database=self.__schema, query={"charset": "utf8mb4"} ) - + self.__engine = create_engine( self.__connection_string, pool_timeout=5, - poolclass=QueuePool, - isolation_level="AUTOCOMMIT" + poolclass=QueuePool ) @classmethod @@ -100,10 +98,18 @@ class Database: """ if self.__connection is None: raise DBException('DBに接続していません') + + result = None try: - result = self.__connection.execute(text(select_query), parameters=parameters) + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) except Exception as e: raise DBException(e) + result_rows = result.mappings().all() return result_rows @@ -122,10 +128,18 @@ class Database: """ if self.__connection is None: raise DBException('DBに接続していません') + + result = None try: - result = self.__connection.execute(text(query), parameters=parameters) + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) except Exception as e: raise DBException(e) + return result def begin(self): @@ -148,3 +162,14 @@ class Database: if self.__connection is not None: self.__connection.close() self.__connection = None + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 8308438d..c639a82a 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -1,6 +1,5 @@ from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, create_engine, text) -from sqlalchemy.engine.create import create_engine from sqlalchemy.engine.url import URL from src.error.exceptions import DBException @@ -16,8 +15,7 @@ class Database: __username: str = None __password: str = None __schema: str = None - __connection_string:str = None - + __connection_string: str = None def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: """このクラスの新たなインスタンスを初期化します @@ -34,9 +32,9 @@ class Database: self.__host = host self.__port = int(port) self.__schema = schema - + self.__connection_string = URL.create( - drivername='mysql+pymysql', + drivername='mysql+pymysql', username=self.__username, password=self.__password, host=self.__host, @@ -44,12 +42,11 @@ class Database: database=self.__schema, query={"charset": "utf8mb4"} ) - + self.__engine = create_engine( self.__connection_string, pool_timeout=5, - poolclass=QueuePool, - isolation_level="AUTOCOMMIT" + poolclass=QueuePool ) @classmethod @@ -97,10 +94,18 @@ class Database: """ if self.__connection is None: raise DBException('DBに接続していません') + + result = None try: - result = self.__connection.execute(text(select_query), parameters=parameters) + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) except Exception as e: raise DBException(e) + result_rows = result.mappings().all() return result_rows @@ -119,10 +124,18 @@ class Database: """ if self.__connection is None: raise DBException('DBに接続していません') + + result = None try: - result = self.__connection.execute(text(query), parameters=parameters) + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) except Exception as e: raise DBException(e) + return result def begin(self): @@ -145,3 +158,14 @@ class Database: if self.__connection is not None: self.__connection.close() self.__connection = None + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result From e9dad1aecfbdcd33254d1ab7255f870e396ae5b8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 00:58:48 +0900 Subject: [PATCH 031/962] =?UTF-8?q?feat:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E5=8F=96=E8=BE=BC=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?COM=5F=E5=87=BA=E8=BA=AB=E6=A0=A1=E3=81=AE=E7=99=BB=E9=8C=B2?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=921=E3=81=A4=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.gitignore | 10 +- ecs/jskult-batch-daily/Pipfile | 6 + ecs/jskult-batch-daily/Pipfile.lock | 214 ++++++++++++++---- ecs/jskult-batch-daily/pytest.ini | 3 + ecs/jskult-batch-daily/tests/__init__.py | 0 .../tests/batch/__init__.py | 0 .../tests/batch/ultmarc/__init__.py | 0 .../batch/ultmarc/utmp_tables/__init__.py | 0 .../utmp_tables/table_mapper/__init__.py | 0 .../table_mapper/test_com_alma_mapper.py | 85 +++++++ ecs/jskult-batch-daily/tests/conftest.py | 25 ++ .../tests/testing_utility.py | 102 +++++++++ 12 files changed, 394 insertions(+), 51 deletions(-) create mode 100644 ecs/jskult-batch-daily/pytest.ini create mode 100644 ecs/jskult-batch-daily/tests/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py create mode 100644 ecs/jskult-batch-daily/tests/conftest.py create mode 100644 ecs/jskult-batch-daily/tests/testing_utility.py diff --git a/ecs/jskult-batch-daily/.gitignore b/ecs/jskult-batch-daily/.gitignore index 705f2b57..bd0b37f8 100644 --- a/ecs/jskult-batch-daily/.gitignore +++ b/ecs/jskult-batch-daily/.gitignore @@ -1,4 +1,10 @@ -__pycache__ - .vscode/settings.json .env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile index 3cc5b359..a5d5dddd 100644 --- a/ecs/jskult-batch-daily/Pipfile +++ b/ecs/jskult-batch-daily/Pipfile @@ -3,6 +3,10 @@ url = "https://pypi.org/simple" verify_ssl = true name = "pypi" +[scripts] +"test:ultmarc" = "pytest tests/batch/ultmarc/" +"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" + [packages] boto3 = "*" PyMySQL = "*" @@ -12,6 +16,8 @@ tenacity = "*" [dev-packages] autopep8 = "*" flake8 = "*" +pytest = "*" +pytest-cov = "*" [requires] python_version = "3.9" diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index b6531ec3..519c60a0 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1b9b3da586499b64915b0cf14217a1bcfb26c5e3e1c6fbfc9cce99242bc4faed" + "sha256": "9bce8f43bcad5d6ae8e5a558b8ade00a83f6e1671993e91b0a883fffa6b95df9" }, "pipfile-spec": 6, "requires": { @@ -18,19 +18,19 @@ "default": { "boto3": { "hashes": [ - "sha256:043f8981d10c4e7c48736df4381dac557b46c5b369b0a450d8f3d7f5fdd24db5", - "sha256:b00f416832bc59863b96175045d2ebe067d9222289bce677c48fd72c006eaaad" + "sha256:816a198a6cc4f283af6b21439d85be6dbe4b73c2232dd906c6bafb4fece28d19", + "sha256:9de90a2c0b853f84436b032b28947fc8a765dc462573a8d543b13f16c6579b40" ], "index": "pypi", - "version": "==1.26.102" + "version": "==1.26.107" }, "botocore": { "hashes": [ - "sha256:4bae8f502507da18ff37c61cb18745cfb11d87a61dd0ea27e346adadff92aa3f", - "sha256:58b11c630d2044ea732ba4c403d29fab51e954465f9b3f7099cbf5ac0ce7ab47" + "sha256:ee1e43e6cd0864cc6811ba3f05123647612ee3f07a286a4c94f5885aa86d6922", + "sha256:f63942b4b7248c0b3d6ecbc2852cf0787c23ace2a91a012f7ee0b3ae3eb08f4f" ], "markers": "python_version >= '3.7'", - "version": "==1.29.102" + "version": "==1.29.107" }, "greenlet": { "hashes": [ @@ -140,50 +140,50 @@ }, "sqlalchemy": { "hashes": [ - "sha256:013f4f330001e84a2b0ef1f2c9bd73169c79d582e54e1a144be1be1dbc911711", - "sha256:0789e199fbce8cb1775337afc631ed12bcc5463dd77d7a06b8dafd758cde51f8", - "sha256:0b698440c477c00bdedff87348b19a79630a235864a8f4378098d61079c16ce9", - "sha256:0eac488be90dd3f7a655d2e34fa59e1305fccabc4abfbd002e3a72ae10bd2f89", - "sha256:14854bdb2a35af536d14f77dfa8dbc20e1bb1972996d64c4147e0d3165c9aaf5", - "sha256:18795e87601b4244fd08b542cd6bff9ef674b17bcd34e4a3c9935398e2cc762c", - "sha256:32f508fef9c5a7d19411d94ef64cf5405e42c4689e51ddbb81ac9a7be045cce8", - "sha256:33f73cc45ffa050f5c3b60ff4490e0ae9e02701461c1600d5ede1b008076b1b9", - "sha256:38e26cf6b9b4c6c37846f7e31b42e4d664b35f055691265f07e06aeb6167c494", - "sha256:3da3dff8d9833a7d7f66a3c45a79a3955f775c79f47bb7eea266d0b4c267b17a", - "sha256:432cfd77642771ee7ea0dd0f3fb664f18506a3625eab6e6d5d1d771569171270", - "sha256:4339110be209fea37a2bb4f35f1127c7562a0393e9e6df5d9a65cc4f5c167cb6", - "sha256:486015a58c9a67f65a15b4f19468b35b97cee074ae55386a9c240f1da308fbfe", - "sha256:494db0026918e3f707466a1200a5dedbf254a4bce01a3115fd95f04ba8258f09", - "sha256:57b80e877eb6ec63295835f8a3b86ca3a44829f80c4748e1b019e03adea550fc", - "sha256:5f7c40ec2e3b31293184020daba95850832bea523a08496ac89b27a5276ec804", - "sha256:6d44ff7573016fc26311b5a5c54d5656fb9e0c39e138bc8b81cb7c8667485203", - "sha256:774965c41b71c8ebe3c5728bf5b9a948231fc3a0422d9fdace0686f5bb689ad6", - "sha256:7917632606fc5d4be661dcde45cc415df835e594e2c50cc999a44f24b6bf6d92", - "sha256:9020125e3be677c64d4dda7048e247343f1663089cf268a4cc98c957adb7dbe0", - "sha256:921485d1f69ed016e1f756de67d02ad4f143eb6b92b9776bfff78786d8978ab5", - "sha256:94556a2a7fc3de094ea056b62845e2e6e271e26d1e1b2540a1cd2d2506257a10", - "sha256:a4c1e1582492c66dfacc9eab52738f3e64d9a2a380e412668f75aa06e540f649", - "sha256:a65a8fd09bdffd63fa23b39cd902e6a4ca23d86ecfe129513e43767a1f3e91fb", - "sha256:a6f7d1debb233f1567d700ebcdde0781a0b63db0ef266246dfbf75ae41bfdf85", - "sha256:b0995b92612979d208189245bf87349ad9243b97b49652347a28ddee0803225a", - "sha256:b8ab8f90f4a13c979e6c41c9f011b655c1b9ae2df6cffa8fa2c7c4d740f3512e", - "sha256:bc370d53fee7408330099c4bcc2573a107757b203bc61f114467dfe586a0c7bd", - "sha256:c38641f5c3714505d65dbbd8fb1350408b9ad8461769ec8e440e1177f9c92d1d", - "sha256:cc337b96ec59ef29907eeadc2ac11188739281568f14c719e61550ca6d201a41", - "sha256:ce076e25f1170000b4ecdc57a1ff8a70dbe4a5648ec3da0563ef3064e8db4f15", - "sha256:cebd161f964af58290596523c65e41a5a161a99f7212b1ae675e288a4b5e0a7c", - "sha256:d2e7411d5ea164c6f4d003f5d4f5e72e202956aaa7496b95bb4a4c39669e001c", - "sha256:e735a635126b2338dfd3a0863b675437cb53d85885a7602b8cffb24345df33ed", - "sha256:e7e61e2e4dfe175dc3510889e44eda1c32f55870d6950ef40519640cb266704d", - "sha256:e90f0be674e0845c5c1ccfa5e31c9ee28fd406546a61afc734355cc7ea1f8f8b", - "sha256:ea1c63e61b5c13161c8468305f0a5837c80aae2070e33654c68dd12572b638eb", - "sha256:ea9461f6955f3cf9eff6eeec271686caed7792c76f5b966886a36a42ea46e6b2", - "sha256:f15c54713a8dd57a01c974c9f96476688f6f6374d348819ed7e459535844b614", - "sha256:fb649c5473f79c9a7b6133f53a31f4d87de14755c79224007eb7ec76e628551e", - "sha256:fc67667c8e8c04e5c3250ab2cd51df40bc7c28c7c253d0475b377eff86fe4bb0" + "sha256:07950fc82f844a2de67ddb4e535f29b65652b4d95e8b847823ce66a6d540a41d", + "sha256:0a865b5ec4ba24f57c33b633b728e43fde77b968911a6046443f581b25d29dd9", + "sha256:0b49f1f71d7a44329a43d3edd38cc5ee4c058dfef4487498393d16172007954b", + "sha256:13f984a190d249769a050634b248aef8991acc035e849d02b634ea006c028fa8", + "sha256:1b69666e25cc03c602d9d3d460e1281810109e6546739187044fc256c67941ef", + "sha256:1d06e119cf79a3d80ab069f064a07152eb9ba541d084bdaee728d8a6f03fd03d", + "sha256:246712af9fc761d6c13f4f065470982e175d902e77aa4218c9cb9fc9ff565a0c", + "sha256:34eb96c1de91d8f31e988302243357bef3f7785e1b728c7d4b98bd0c117dafeb", + "sha256:4c3020afb144572c7bfcba9d7cce57ad42bff6e6115dffcfe2d4ae6d444a214f", + "sha256:4f759eccb66e6d495fb622eb7f4ac146ae674d829942ec18b7f5a35ddf029597", + "sha256:68ed381bc340b4a3d373dbfec1a8b971f6350139590c4ca3cb722fdb50035777", + "sha256:6b72dccc5864ea95c93e0a9c4e397708917fb450f96737b4a8395d009f90b868", + "sha256:6e84ab63d25d8564d7a8c05dc080659931a459ee27f6ed1cf4c91f292d184038", + "sha256:734805708632e3965c2c40081f9a59263c29ffa27cba9b02d4d92dfd57ba869f", + "sha256:78612edf4ba50d407d0eb3a64e9ec76e6efc2b5d9a5c63415d53e540266a230a", + "sha256:7e472e9627882f2d75b87ff91c5a2bc45b31a226efc7cc0a054a94fffef85862", + "sha256:865392a50a721445156809c1a6d6ab6437be70c1c2599f591a8849ed95d3c693", + "sha256:8d118e233f416d713aac715e2c1101e17f91e696ff315fc9efbc75b70d11e740", + "sha256:8d3ece5960b3e821e43a4927cc851b6e84a431976d3ffe02aadb96519044807e", + "sha256:93c78d42c14aa9a9e0866eacd5b48df40a50d0e2790ee377af7910d224afddcf", + "sha256:95719215e3ec7337b9f57c3c2eda0e6a7619be194a5166c07c1e599f6afc20fa", + "sha256:9838bd247ee42eb74193d865e48dd62eb50e45e3fdceb0fdef3351133ee53dcf", + "sha256:aa5c270ece17c0c0e0a38f2530c16b20ea05d8b794e46c79171a86b93b758891", + "sha256:ac6a0311fb21a99855953f84c43fcff4bdca27a2ffcc4f4d806b26b54b5cddc9", + "sha256:ad5363a1c65fde7b7466769d4261126d07d872fc2e816487ae6cec93da604b6b", + "sha256:b3e5864eba71a3718236a120547e52c8da2ccb57cc96cecd0480106a0c799c92", + "sha256:bbda1da8d541904ba262825a833c9f619e93cb3fd1156be0a5e43cd54d588dcd", + "sha256:c6e27189ff9aebfb2c02fd252c629ea58657e7a5ff1a321b7fc9c2bf6dc0b5f3", + "sha256:c8239ce63a90007bce479adf5460d48c1adae4b933d8e39a4eafecfc084e503c", + "sha256:d209594e68bec103ad5243ecac1b40bf5770c9ebf482df7abf175748a34f4853", + "sha256:d5327f54a9c39e7871fc532639616f3777304364a0bb9b89d6033ad34ef6c5f8", + "sha256:db4bd1c4792da753f914ff0b688086b9a8fd78bb9bc5ae8b6d2e65f176b81eb9", + "sha256:e4780be0f19e5894c17f75fc8de2fe1ae233ab37827125239ceb593c6f6bd1e2", + "sha256:e4a019f723b6c1e6b3781be00fb9e0844bc6156f9951c836ff60787cc3938d76", + "sha256:e62c4e762d6fd2901692a093f208a6a6575b930e9458ad58c2a7f080dd6132da", + "sha256:e730603cae5747bc6d6dece98b45a57d647ed553c8d5ecef602697b1c1501cf2", + "sha256:ebc4eeb1737a5a9bdb0c24f4c982319fa6edd23cdee27180978c29cbb026f2bd", + "sha256:ee2946042cc7851842d7a086a92b9b7b494cbe8c3e7e4627e27bc912d3a7655e", + "sha256:f005245e1cb9b8ca53df73ee85e029ac43155e062405015e49ec6187a2e3fb44", + "sha256:f49c5d3c070a72ecb96df703966c9678dda0d4cb2e2736f88d15f5e1203b4159", + "sha256:f61ab84956dc628c8dfe9d105b6aec38afb96adae3e5e7da6085b583ff6ea789" ], "index": "pypi", - "version": "==2.0.7" + "version": "==2.0.9" }, "tenacity": { "hashes": [ @@ -211,6 +211,14 @@ } }, "develop": { + "attrs": { + "hashes": [ + "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", + "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + ], + "markers": "python_version >= '3.6'", + "version": "==22.2.0" + }, "autopep8": { "hashes": [ "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", @@ -219,6 +227,74 @@ "index": "pypi", "version": "==2.0.2" }, + "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" + ], + "markers": "python_version >= '3.7'", + "version": "==7.2.2" + }, + "exceptiongroup": { + "hashes": [ + "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", + "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + ], + "markers": "python_version < '3.11'", + "version": "==1.1.1" + }, "flake8": { "hashes": [ "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", @@ -227,6 +303,14 @@ "index": "pypi", "version": "==6.0.0" }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, "mccabe": { "hashes": [ "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", @@ -235,6 +319,22 @@ "markers": "python_version >= '3.6'", "version": "==0.7.0" }, + "packaging": { + "hashes": [ + "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", + "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + ], + "markers": "python_version >= '3.7'", + "version": "==23.0" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, "pycodestyle": { "hashes": [ "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", @@ -251,6 +351,22 @@ "markers": "python_version >= '3.6'", "version": "==3.0.1" }, + "pytest": { + "hashes": [ + "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", + "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" + ], + "index": "pypi", + "version": "==7.2.2" + }, + "pytest-cov": { + "hashes": [ + "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", + "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" + ], + "index": "pypi", + "version": "==4.0.0" + }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", diff --git a/ecs/jskult-batch-daily/pytest.ini b/ecs/jskult-batch-daily/pytest.ini new file mode 100644 index 00000000..5dbe2661 --- /dev/null +++ b/ecs/jskult-batch-daily/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +log_format = %(levelname)s %(asctime)s %(message)s +log_date_format = %Y-%m-%d %H:%M:%S diff --git a/ecs/jskult-batch-daily/tests/__init__.py b/ecs/jskult-batch-daily/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/__init__.py b/ecs/jskult-batch-daily/tests/batch/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py new file mode 100644 index 00000000..3d0b31d8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -0,0 +1,85 @@ +from datetime import datetime + +import pytest + +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper +from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ + UltmarcTableMapperFactory +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_ultmarc_common_column_names, + create_ultmarc_common_column_values, + create_ultmarc_test_csv, get_module_name) + + +class TestComAlmaMapper: + """COM_出身校""" + + db: Database + batch_config: BatchConfig + table_columns = ["alma_cd", "alma"] + create_ultmarc_common_column_names() + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_config = BatchConfig.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record_one(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_出身校テーブルにレコードを1件登録する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ1件作成 + test_csv = create_ultmarc_test_csv( + '"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + )[0] + # テスト対象のデータをDBから削除 + self.db.execute("DELETE FROM src05.com_alma WHERE alma_cd = '001'") + + # sut(system under test)作成 + layout_class = test_csv[0] + record_id = test_csv[1] + factory = UltmarcTableMapperFactory() + sut: com_alma_mapper.ComAlmaMapper = factory.create( + layout_class=layout_class, + record_id=record_id, + records=test_csv, + db=self.db + ) + assert type(sut) is com_alma_mapper.ComAlmaMapper, 'マッパークラスが期待通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値となるモジュール名 + module_name = get_module_name(com_alma_mapper) + # 実行日時 + expect_row = ["001", "北大"] + create_ultmarc_common_column_values(expect_datetime, expect_date_str, module_name) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows) diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py new file mode 100644 index 00000000..4eeb7bf8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -0,0 +1,25 @@ +"""共通テストフィクスチャ""" + +from datetime import datetime + +import pytest + +from src.db.database import Database + + +@pytest.fixture +def database() -> Database: + """データベース接続モジュールを作成""" + return Database.get_instance() + + +@pytest.fixture +def expect_datetime() -> datetime: + """テスト実行年月日時分秒を生成""" + return datetime.now() + + +@pytest.fixture +def expect_date_str(expect_datetime: datetime) -> str: + """テスト実行年月日の文字8桁を生成""" + return expect_datetime.strftime('%Y%m%d') diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py new file mode 100644 index 00000000..3ede232f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -0,0 +1,102 @@ +"""テスト用共通処理関数""" + +import csv +import io +from datetime import datetime +from types import ModuleType + + +def create_ultmarc_test_csv(*csv_rows: str) -> list[list[str]]: + """アルトマーク取込テストのCSVを作成 + Args: + csv_rows (tuple[str]): CSV文字列のリスト + Returns: + list[list[str]]: CSVデータ + """ + string_io = io.StringIO() + string_io.writelines(csv_rows) + string_io.seek(0) + reader = csv.reader(string_io) + test_csv = [r for r in reader] + + return test_csv + + +def create_ultmarc_common_column_names() -> list[str]: + """アルトマークテーブル共通のカラム名を作成 + Returns: + list[str]: 共通カラム名 + """ + + return [ + 'regist_ymd', + 'update_ymd', + 'delete_ymd', + 'regist_date', + 'create_user', + 'update_date', + 'update_user', + 'sys_regist_date', + 'regist_prgm_id', + 'sys_update_date', + 'update_prgm_id' + ] + + +def create_ultmarc_common_column_values(expect_datetime: datetime, expect_date_str: str, module_name: str) -> list: + """アルトマークテーブル共通のカラムを作成 + + Args: + expect_datetime (datetime): テスト実行年月日時分秒 + expect_date_str (str): テスト実行年月日の文字列 + module_name (str): モジュール名 + + Returns: + list: 共通カラム値 + """ + + return [ + expect_date_str, # 登録年月日(regist_ymd) + None, # 更新年月日(update_ymd) + None, # 削除年月日(delete_ymd) + None, # 登録日時(regist_date) + None, # 登録者(create_user) + None, # 更新日時(update_date) + None, # 更新者(update_user) + expect_datetime, # システム登録日時(sys_regist_date) + module_name, # 登録プログラムid(regist_prgm_id) + expect_datetime, # システム更新日時(sys_update_date) + module_name # 更新プログラムid(update_prgm_id) + ] + + +def get_module_name(module: ModuleType) -> str: + """登録プログラムID、更新プログラムIDに登録するモジュール名を作成 + + Args: + module (ModuleType): pythonモジュール + + Returns: + str: モジュール名 + """ + return module.__name__.split('.')[-1] + + +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict]) -> None: + """テーブル同士の取得結果突き合わせ + + Args: + actual_rows (list[dict]): テスト結果の辞書リスト + expect_rows (list[dict]): 期待値の辞書リスト + """ + # 取得件数が一致すること + assert len(actual_rows) == len(expect_rows) + + # 1カラムずつ調査 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + # システム日付が設定されるカラムは、期待値以前になっていること + if actual_col_name in ['sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + else: + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値と一致すること' From 6cc2ef5ca02ce643bfba38b65a8a7d9850e3c8bf Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 08:47:33 +0900 Subject: [PATCH 032/962] =?UTF-8?q?feat:=20DatFile=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=A6=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/dat_insert.py | 4 +- .../src/batch/ultmarc/datfile.py | 4 +- .../table_mapper/test_com_alma_mapper.py | 49 ++++++++++--------- .../tests/testing_utility.py | 10 ++-- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index a0884a00..96463ed5 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -56,7 +56,7 @@ def dat_insert_control(): mapper_class = mapper_factory.create( line.layout_class, line.record_id, - line.record, + line.records, db ) mapper_class.make_query() @@ -69,7 +69,7 @@ def dat_insert_control(): except Exception as e: # TODO: ログちゃんとする logger.warning(e) - record = line.record + record = line.records log_message = ','.join([f'"{r}"' for r in record]) logger.warning(log_message) dat_file.count_up_error() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py index 589d7eb3..a934a468 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -5,12 +5,12 @@ from io import TextIOWrapper class DatFileLine: layout_class: str record_id: str - record: list[str] + records: list[str] def __init__(self, dat_line: list[str]) -> None: self.layout_class = dat_line[0] self.record_id = dat_line[1] - self.record = dat_line + self.records = dat_line class DatFile: diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 3d0b31d8..0ae580b6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -51,35 +51,36 @@ class TestComAlmaMapper: # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テストデータ1件作成 - test_csv = create_ultmarc_test_csv( + test_dat_file = create_ultmarc_test_csv( '"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - )[0] + ) # テスト対象のデータをDBから削除 self.db.execute("DELETE FROM src05.com_alma WHERE alma_cd = '001'") # sut(system under test)作成 - layout_class = test_csv[0] - record_id = test_csv[1] - factory = UltmarcTableMapperFactory() - sut: com_alma_mapper.ComAlmaMapper = factory.create( - layout_class=layout_class, - record_id=record_id, - records=test_csv, - db=self.db - ) - assert type(sut) is com_alma_mapper.ComAlmaMapper, 'マッパークラスが期待通りか' + for line in test_dat_file: + layout_class = line.layout_class + record_id = line.record_id + factory = UltmarcTableMapperFactory() + sut: com_alma_mapper.ComAlmaMapper = factory.create( + layout_class=layout_class, + record_id=record_id, + records=line.records, + db=self.db + ) + assert type(sut) is com_alma_mapper.ComAlmaMapper, 'マッパークラスが期待通りか' - # Act - sut.make_query() - sut.execute_queries() + # Act + sut.make_query() + sut.execute_queries() - # Assert - # 期待値となるモジュール名 - module_name = get_module_name(com_alma_mapper) - # 実行日時 - expect_row = ["001", "北大"] + create_ultmarc_common_column_values(expect_datetime, expect_date_str, module_name) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + # Assert + # 期待値となるモジュール名 + module_name = get_module_name(com_alma_mapper) + # 実行日時 + expect_row = ["001", "北大"] + create_ultmarc_common_column_values(expect_datetime, expect_date_str, module_name) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") - # 期待値検査 - assert_table_results(actual_rows, expect_rows) + # 期待値検査 + assert_table_results(actual_rows, expect_rows) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 3ede232f..540b8ad0 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,12 +1,13 @@ """テスト用共通処理関数""" -import csv import io from datetime import datetime from types import ModuleType +from src.batch.ultmarc.datfile import DatFile -def create_ultmarc_test_csv(*csv_rows: str) -> list[list[str]]: + +def create_ultmarc_test_csv(*csv_rows: str) -> DatFile: """アルトマーク取込テストのCSVを作成 Args: csv_rows (tuple[str]): CSV文字列のリスト @@ -16,10 +17,9 @@ def create_ultmarc_test_csv(*csv_rows: str) -> list[list[str]]: string_io = io.StringIO() string_io.writelines(csv_rows) string_io.seek(0) - reader = csv.reader(string_io) - test_csv = [r for r in reader] + dat_file = DatFile(string_io) - return test_csv + return dat_file def create_ultmarc_common_column_names() -> list[str]: From eb1f640c0c97bfded268be2b10a686e75894253b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 08:48:02 +0900 Subject: [PATCH 033/962] =?UTF-8?q?style:=20=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/datachange/emp_chg_inst_lau.py | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py index ed13f855..64a6a363 100644 --- a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py +++ b/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py @@ -1,4 +1,4 @@ -from src.batch.batch_functions import get_syor_date_as_date_format, logging_sql +from src.batch.batch_functions import logging_sql from src.batch.common.batch_config import BatchConfig from src.db.database import Database from src.error.exceptions import BatchOperationException @@ -8,6 +8,7 @@ from src.time.elapsed_time import ElapsedTime logger = get_logger('48-施設担当者マスタ洗替') batch_config = BatchConfig.get_instance() + def batch_process(): db = Database.get_instance() db.connect() @@ -39,6 +40,7 @@ def truncate_emp_chg_inst_lau(db: Database): logger.info("Table `emp_chg_inst_lau` was truncated!") return + def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): logger.info("##########################") try: @@ -46,7 +48,7 @@ def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): sql = """ INSERT INTO src05.emp_chg_inst_lau - SELECT + SELECT inst_cd, ta_cd,emp_cd, bu_cd, @@ -71,9 +73,10 @@ def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): logger.info("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") raise BatchOperationException(e) logger.info("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") - + return + def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする logger.info("##########################") @@ -96,7 +99,7 @@ def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): if count == 0: logger.info('vop_hco_merge_v Table Data is not exists!') return - + logger.info('vop_hco_merge_v Table Data is exists!') # vop_hco_merge_v から、emp_chg_inst_lauをUpdateします result = db.execute_select( @@ -104,11 +107,11 @@ def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): SELECT v_inst_cd, v_inst_cd_merg - FROM + FROM src05.vop_hco_merge_v WHERE STR_TO_DATE(apply_dt, '%Y-%m-%d') <= :syor_date - ORDER BY + ORDER BY STR_TO_DATE(apply_dt, '%Y-%m-%d') ASC """, {'syor_date': syor_date} @@ -166,27 +169,27 @@ def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): if count == 0: logger.info('dcf_inst_merge Table Data is not exists!') return - + logger.info('dcf_inst_merge Table Data is exists!') # dcf_inst_mergeから、emp_chg_inst_lauをUpdate logger.info("##########################") logger.info("#### UPDATE DATA #########") - logger.info("##########################") + logger.info("##########################") try: elapsed_time = ElapsedTime() update_sql = """ UPDATE src05.emp_chg_inst_lau el, ( - SELECT + SELECT dcf_inst_cd, - dcf_inst_cd_new + dcf_inst_cd_new FROM src05.dcf_inst_merge - WHERE - muko_flg = '0' - AND dcf_inst_cd_new IS NOT NULL - AND enabled_flg = 'Y' + WHERE + muko_flg = '0' + AND dcf_inst_cd_new IS NOT NULL + AND enabled_flg = 'Y' AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date ) dm SET @@ -206,5 +209,5 @@ def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): raise BatchOperationException(e) logger.info("emp_chg_inst_lau.v_inst_cd was set!") - + return From 5a5ffcd25ff4151ef5640aaaa1b17a0eb6593143 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 09:58:22 +0900 Subject: [PATCH 034/962] =?UTF-8?q?feat:=20=E3=82=AF=E3=82=A8=E3=83=AA?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E5=87=A6=E7=90=86=E3=82=82=E5=85=B1=E9=80=9A?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 4 +- .../tests/testing_utility.py | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 0ae580b6..b5bf2f1b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -8,6 +8,7 @@ from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database from tests.testing_utility import (assert_table_results, + create_delete_sql_with_parameter, create_ultmarc_common_column_names, create_ultmarc_common_column_values, create_ultmarc_test_csv, get_module_name) @@ -55,7 +56,8 @@ class TestComAlmaMapper: '"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' ) # テスト対象のデータをDBから削除 - self.db.execute("DELETE FROM src05.com_alma WHERE alma_cd = '001'") + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'alma_cd': '001'}) + self.db.execute(delete_sql, delete_parameter) # sut(system under test)作成 for line in test_dat_file: diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 540b8ad0..f9d1aa2f 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -43,6 +43,43 @@ def create_ultmarc_common_column_names() -> list[str]: ] +def create_insert_sql_with_parameter(table_name: str, column_names: list[str], test_data: list[str]) -> tuple[str, dict]: + """INSERT文と登録値のパラメータを返す + + Args: + table_name (str): スキーマ完全修飾のテーブル名(例:src05.com_alma) + column_names (list[str]): カラム名のリスト + test_data (list[str]): 値のリスト + + Returns: + tuple[str, dict]: [0]→INSERT文,[1]→値のパラメータ + """ + placeholders = ','.join([f':{column_name}' for column_name in column_names]) + insert_sql = f"INSERT INTO {table_name} ({','.join(column_names)}) VALUES({placeholders})" + parameter = {k: v for k, v in zip(column_names, test_data)} + + return insert_sql, parameter + + +def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str, str]): + """DELETE文と削除条件値のパラメータを返す + + Args: + table_name (str): スキーマ完全修飾のテーブル名(例:src05.com_alma) + delete_parameter (dict[str, str]): 削除条件に使用するカラム名と値の辞書 + + Returns: + tuple[str, dict]: [0]→DELETE文,[1]→値のパラメータ + """ + where_clause_list = [] + for k in delete_parameter: + where_clause_list.append(f'{k} = :{k}') + where_clauses = ' AND '.join(where_clause_list) + delete_sql = f"DELETE FROM {table_name} WHERE {where_clauses}" + + return delete_sql, delete_parameter + + def create_ultmarc_common_column_values(expect_datetime: datetime, expect_date_str: str, module_name: str) -> list: """アルトマークテーブル共通のカラムを作成 From cd15c199ec5eb08d8565fc2a3a1a02b0a8eb14a0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 10:46:07 +0900 Subject: [PATCH 035/962] =?UTF-8?q?feat:=20COM=5F=E5=87=BA=E8=BA=AB?= =?UTF-8?q?=E6=A0=A1=E3=81=AE=E6=9B=B4=E6=96=B0=E3=82=AF=E3=82=A8=E3=83=AA?= =?UTF-8?q?=E3=81=AE=E7=A2=BA=E8=AA=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 107 +++++++++++++++++- .../tests/testing_utility.py | 51 +++++---- 2 files changed, 130 insertions(+), 28 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index b5bf2f1b..26c182b2 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -9,6 +9,7 @@ from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ from src.db.database import Database from tests.testing_utility import (assert_table_results, create_delete_sql_with_parameter, + create_insert_sql_with_parameter, create_ultmarc_common_column_names, create_ultmarc_common_column_values, create_ultmarc_test_csv, get_module_name) @@ -55,12 +56,12 @@ class TestComAlmaMapper: test_dat_file = create_ultmarc_test_csv( '"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' ) - # テスト対象のデータをDBから削除 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'alma_cd': '001'}) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) # sut(system under test)作成 - for line in test_dat_file: + for i, line in enumerate(test_dat_file, start=1): layout_class = line.layout_class record_id = line.record_id factory = UltmarcTableMapperFactory() @@ -70,7 +71,7 @@ class TestComAlmaMapper: records=line.records, db=self.db ) - assert type(sut) is com_alma_mapper.ComAlmaMapper, 'マッパークラスが期待通りか' + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期待通りか' # Act sut.make_query() @@ -80,9 +81,103 @@ class TestComAlmaMapper: # 期待値となるモジュール名 module_name = get_module_name(com_alma_mapper) # 実行日時 - expect_row = ["001", "北大"] + create_ultmarc_common_column_values(expect_datetime, expect_date_str, module_name) + expect_row = ["001", "北大"] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") # 期待値検査 - assert_table_results(actual_rows, expect_rows) + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_regist_date', 'sys_update_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + + def test_update_record_one(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_出身校テーブルにレコードを1件更新する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ1件作成 + test_dat_file = create_ultmarc_test_csv( + '"004","001","B","20141113","20141114","テスト大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ) + + # モジュール名 + module_name = get_module_name(com_alma_mapper) + # DBに登録するテストデータ + test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime.replace(microsecond=0), + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テスト対象のデータをDBに登録 + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + layout_class = line.layout_class + record_id = line.record_id + factory = UltmarcTableMapperFactory() + sut: com_alma_mapper.ComAlmaMapper = factory.create( + layout_class=layout_class, + record_id=record_id, + records=line.records, + db=self.db + ) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値となるモジュール名 + module_name = get_module_name(com_alma_mapper) + # 実行日時 + expect_row = ["001", "テスト大"] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + update_ymd=expect_date_str, + sys_regist_date=expect_datetime.replace(microsecond=0), + regist_prgm_id=module_name, + sys_update_date=datetime.now(), + update_prgm_id=module_name + ) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index f9d1aa2f..a517af1b 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,7 +1,6 @@ """テスト用共通処理関数""" import io -from datetime import datetime from types import ModuleType from src.batch.ultmarc.datfile import DatFile @@ -80,30 +79,38 @@ def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str return delete_sql, delete_parameter -def create_ultmarc_common_column_values(expect_datetime: datetime, expect_date_str: str, module_name: str) -> list: +def create_ultmarc_common_column_values(**kwargs) -> list: """アルトマークテーブル共通のカラムを作成 Args: - expect_datetime (datetime): テスト実行年月日時分秒 - expect_date_str (str): テスト実行年月日の文字列 - module_name (str): モジュール名 - + kwargs 有効なキー一覧 + regist_ymd (str): 登録年月日 + update_ymd (str): 更新年月日 + delete_ymd (str): 削除年月日 + regist_date (datetime): 登録日時 + create_user (str): 登録者 + update_date (datetime): 更新日時 + update_user (str): 更新者 + sys_regist_date (datetime): システム登録日時 + regist_prgm_id (str): 登録プログラムid + sys_update_date (datetime): システム更新日時 + update_prgm_id (str): 更新プログラムid Returns: list: 共通カラム値 """ return [ - expect_date_str, # 登録年月日(regist_ymd) - None, # 更新年月日(update_ymd) - None, # 削除年月日(delete_ymd) - None, # 登録日時(regist_date) - None, # 登録者(create_user) - None, # 更新日時(update_date) - None, # 更新者(update_user) - expect_datetime, # システム登録日時(sys_regist_date) - module_name, # 登録プログラムid(regist_prgm_id) - expect_datetime, # システム更新日時(sys_update_date) - module_name # 更新プログラムid(update_prgm_id) + kwargs.get('regist_ymd'), # 登録年月日(regist_ymd) + kwargs.get('update_ymd'), # 更新年月日(update_ymd) + kwargs.get('delete_ymd'), # 削除年月日(delete_ymd) + kwargs.get('regist_date'), # 登録日時(regist_date) + kwargs.get('create_user'), # 登録者(create_user) + kwargs.get('update_date'), # 更新日時(update_date) + kwargs.get('update_user'), # 更新者(update_user) + kwargs.get('sys_regist_date'), # システム登録日時(sys_regist_date) + kwargs.get('regist_prgm_id'), # 登録プログラムid(regist_prgm_id) + kwargs.get('sys_update_date'), # システム更新日時(sys_update_date) + kwargs.get('update_prgm_id') # 更新プログラムid(update_prgm_id) ] @@ -119,7 +126,7 @@ def get_module_name(module: ModuleType) -> str: return module.__name__.split('.')[-1] -def assert_table_results(actual_rows: list[dict], expect_rows: list[dict]) -> None: +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], line_number: int, ignore_col_name: list = None) -> None: """テーブル同士の取得結果突き合わせ Args: @@ -132,8 +139,8 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict]) -> No # 1カラムずつ調査 for actual_row, expect_row in zip(actual_rows, expect_rows): for actual_col_name, expect_col_name in zip(actual_row, expect_row): - # システム日付が設定されるカラムは、期待値以前になっていること - if actual_col_name in ['sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + # テストメソッド側で個別に確認するものはスキップさせる + if ignore_col_name is not None and actual_col_name in ignore_col_name: + continue else: - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値と一致すること' + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値と一致すること' From 8fac8401bfb29fd03402703a359c933c9b5c79f7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 10:55:59 +0900 Subject: [PATCH 036/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=81=E4=BE=8B=E5=A4=96=E3=83=A1=E3=83=83=E3=82=BB?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=82=82=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py | 6 ++++-- ecs/jskult-batch-daily/src/db/database.py | 9 ++++++--- ecs/jskult-batch-daily/src/error/exceptions.py | 5 ++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py index 96463ed5..44e53cbc 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py @@ -7,6 +7,7 @@ from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database +from src.error.exceptions import DBException from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') @@ -21,6 +22,7 @@ def dat_insert_control(): db.connect() # ファイル単位でトランザクションを行う db.begin() + logger.info('Transaction BEGIN') # datファイルをS3から取得する dat_file_list = ultmarc_bucket.list_edi_file() # ファイルがない場合は処理せず、正常終了とする @@ -66,8 +68,7 @@ def dat_insert_control(): # これいる?? if log_count % 5000 == 0: logger.info(f'Count: {log_count}') - except Exception as e: - # TODO: ログちゃんとする + except DBException as e: logger.warning(e) record = line.records log_message = ','.join([f'"{r}"' for r in record]) @@ -75,6 +76,7 @@ def dat_insert_control(): dat_file.count_up_error() # すべての行を登録終えたらコミットする db.commit() + logger.info('Transaction COMMIT') logger.info(f'datInsert RESULT') logger.info(f'SUCCESS_COUNT={dat_file.success_count}') logger.info(f'ERROR_COUNT={dat_file.error_count}') diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py index 288fc4ff..59ac0d81 100644 --- a/ecs/jskult-batch-daily/src/db/database.py +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -81,7 +81,10 @@ class Database: Raises: DBException: 接続失敗 """ - self.__connection = self.__engine.connect() + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(f'SQL Error: {e}') def execute_select(self, select_query: str, parameters=None) -> list[dict]: """SELECTクエリを実行します。 @@ -108,7 +111,7 @@ class Database: # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 result = self.__execute_with_transaction(select_query, parameters) except Exception as e: - raise DBException(e) + raise DBException(f'SQL Error: {e}') result_rows = result.mappings().all() return result_rows @@ -138,7 +141,7 @@ class Database: # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 result = self.__execute_with_transaction(query, parameters) except Exception as e: - raise DBException(e) + raise DBException(f'SQL Error: {e}') return result diff --git a/ecs/jskult-batch-daily/src/error/exceptions.py b/ecs/jskult-batch-daily/src/error/exceptions.py index 612060c5..c9effa01 100644 --- a/ecs/jskult-batch-daily/src/error/exceptions.py +++ b/ecs/jskult-batch-daily/src/error/exceptions.py @@ -4,11 +4,14 @@ from tenacity import RetryError class MeDaCaException(Exception): pass + class DBException(MeDaCaException): pass + class BatchOperationException(MeDaCaException): pass + class MaxRetryExceededException(MeDaCaException, RetryError): - pass \ No newline at end of file + pass From d49188c1f0a5797eacf4882a83f4d1ef81f63207 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 11:16:42 +0900 Subject: [PATCH 037/962] =?UTF-8?q?feat:=20=E8=AB=96=E7=90=86=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=AE=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 26c182b2..8b90bb8c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -102,7 +102,7 @@ class TestComAlmaMapper: def test_update_record_one(self, expect_datetime: datetime, expect_date_str: str): """ Cases: - COM_出身校テーブルにレコードを1件更新する + COM_出身校テーブルのレコードを1件更新する Arranges: - CSVデータを用意する - 追加対象となるレコードを登録する @@ -163,7 +163,90 @@ class TestComAlmaMapper: # 実行日時 expect_row = ["001", "テスト大"] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - update_ymd=expect_date_str, + update_ymd=expect_date_str, # 更新日時が登録される + sys_regist_date=expect_datetime.replace(microsecond=0), + regist_prgm_id=module_name, + sys_update_date=datetime.now(), + update_prgm_id=module_name + ) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + + def test_logical_delete_record_one(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_出身校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ1件作成 + test_dat_file = create_ultmarc_test_csv( + '"004","001","C","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ) + + # モジュール名 + module_name = get_module_name(com_alma_mapper) + # DBに登録するテストデータ + test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime.replace(microsecond=0), + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テスト対象のデータをDBに登録 + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + layout_class = line.layout_class + record_id = line.record_id + factory = UltmarcTableMapperFactory() + sut: com_alma_mapper.ComAlmaMapper = factory.create( + layout_class=layout_class, + record_id=record_id, + records=line.records, + db=self.db + ) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値となるモジュール名 + module_name = get_module_name(com_alma_mapper) + # 実行日時 + expect_row = ["001", "北大"] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + delete_ymd=expect_date_str, # 削除日が登録される sys_regist_date=expect_datetime.replace(microsecond=0), regist_prgm_id=module_name, sys_update_date=datetime.now(), From cbf6c090252b20bdc8e3ab563bd425e4b7f0aa74 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 11:23:37 +0900 Subject: [PATCH 038/962] =?UTF-8?q?feat:=20=E6=97=A5=E4=BB=98=E3=81=AE?= =?UTF-8?q?=E6=AF=94=E8=BC=83=E3=82=92=E6=AD=A3=E7=A2=BA=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 15 +++++---------- ecs/jskult-batch-daily/tests/conftest.py | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 8b90bb8c..614fd096 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -92,12 +92,7 @@ class TestComAlmaMapper: actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_regist_date', 'sys_update_date']) - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + assert_table_results(actual_rows, expect_rows, line_number=i) def test_update_record_one(self, expect_datetime: datetime, expect_date_str: str): """ @@ -123,7 +118,7 @@ class TestComAlmaMapper: # DBに登録するテストデータ test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - sys_regist_date=expect_datetime.replace(microsecond=0), + sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=expect_datetime, update_prgm_id=module_name @@ -164,7 +159,7 @@ class TestComAlmaMapper: expect_row = ["001", "テスト大"] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, update_ymd=expect_date_str, # 更新日時が登録される - sys_regist_date=expect_datetime.replace(microsecond=0), + sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=datetime.now(), update_prgm_id=module_name @@ -206,7 +201,7 @@ class TestComAlmaMapper: # DBに登録するテストデータ test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - sys_regist_date=expect_datetime.replace(microsecond=0), + sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=expect_datetime, update_prgm_id=module_name @@ -247,7 +242,7 @@ class TestComAlmaMapper: expect_row = ["001", "北大"] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, delete_ymd=expect_date_str, # 削除日が登録される - sys_regist_date=expect_datetime.replace(microsecond=0), + sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=datetime.now(), update_prgm_id=module_name diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py index 4eeb7bf8..0a6ce31c 100644 --- a/ecs/jskult-batch-daily/tests/conftest.py +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -16,7 +16,7 @@ def database() -> Database: @pytest.fixture def expect_datetime() -> datetime: """テスト実行年月日時分秒を生成""" - return datetime.now() + return datetime.now().replace(microsecond=0) @pytest.fixture From d5f305c56193c59111ea70edcaa37179b44fdde0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 11:34:45 +0900 Subject: [PATCH 039/962] =?UTF-8?q?feta:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=AF=BE=E8=B1=A1=E4=BD=9C=E6=88=90=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=85=B1=E9=80=9A=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 35 +++---------------- .../tests/testing_utility.py | 30 +++++++++++++++- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 614fd096..a46e9f03 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -4,14 +4,13 @@ import pytest from src.batch.common.batch_config import BatchConfig from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper -from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ - UltmarcTableMapperFactory from src.db.database import Database from tests.testing_utility import (assert_table_results, create_delete_sql_with_parameter, create_insert_sql_with_parameter, create_ultmarc_common_column_names, create_ultmarc_common_column_values, + create_ultmarc_table_mapper_sut, create_ultmarc_test_csv, get_module_name) @@ -62,16 +61,8 @@ class TestComAlmaMapper: # sut(system under test)作成 for i, line in enumerate(test_dat_file, start=1): - layout_class = line.layout_class - record_id = line.record_id - factory = UltmarcTableMapperFactory() - sut: com_alma_mapper.ComAlmaMapper = factory.create( - layout_class=layout_class, - record_id=record_id, - records=line.records, - db=self.db - ) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期待通りか' + sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' # Act sut.make_query() @@ -137,15 +128,7 @@ class TestComAlmaMapper: # sut(system under test)作成 for i, line in enumerate(test_dat_file, start=1): - layout_class = line.layout_class - record_id = line.record_id - factory = UltmarcTableMapperFactory() - sut: com_alma_mapper.ComAlmaMapper = factory.create( - layout_class=layout_class, - record_id=record_id, - records=line.records, - db=self.db - ) + sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' # Act @@ -220,15 +203,7 @@ class TestComAlmaMapper: # sut(system under test)作成 for i, line in enumerate(test_dat_file, start=1): - layout_class = line.layout_class - record_id = line.record_id - factory = UltmarcTableMapperFactory() - sut: com_alma_mapper.ComAlmaMapper = factory.create( - layout_class=layout_class, - record_id=record_id, - records=line.records, - db=self.db - ) + sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' # Act diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index a517af1b..c483c9af 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -3,7 +3,12 @@ import io from types import ModuleType -from src.batch.ultmarc.datfile import DatFile +from src.batch.ultmarc.datfile import DatFile, DatFileLine +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ + UltmarcTableMapperFactory +from src.db.database import Database def create_ultmarc_test_csv(*csv_rows: str) -> DatFile: @@ -114,6 +119,29 @@ def create_ultmarc_common_column_values(**kwargs) -> list: ] +def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcTableMapper: + """アルトマークテーブルマッパーのインスタンスを返す + + Args: + line (DatFileLine): テストデータの1行 + db (Database): 接続済みDBインスタンス + + Returns: + UltmarcTableMapper: マッパークラス + """ + layout_class = line.layout_class + record_id = line.record_id + factory = UltmarcTableMapperFactory() + sut = factory.create( + layout_class=layout_class, + record_id=record_id, + records=line.records, + db=db + ) + + return sut + + def get_module_name(module: ModuleType) -> str: """登録プログラムID、更新プログラムIDに登録するモジュール名を作成 From b2e0582458eea423a82fe68c8bdba7a6e6b3c31b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 12:25:33 +0900 Subject: [PATCH 040/962] =?UTF-8?q?feat:=20=E8=BF=BD=E5=8A=A0=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AE=E3=83=AC=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E4=BB=B6=E6=95=B0=E3=82=92=E5=A2=97=E3=82=84=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 47 ++++++++++++++++--- .../tests/testing_utility.py | 6 ++- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index a46e9f03..3a800949 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -37,7 +37,7 @@ class TestComAlmaMapper: self.db.rollback() self.db.disconnect() - def test_insert_record_one(self, expect_datetime: datetime, expect_date_str: str): + def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): """ Cases: COM_出身校テーブルにレコードを1件登録する @@ -51,9 +51,24 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ1件作成 + # テストデータ作成 + code_and_name = [ + ['001', '北大'], + ['002', '札幌医'], + ['003', '弘大'], + ['004', '岩手医'], + ['005', '東北大'], + ['006', '福島医'] + ] test_dat_file = create_ultmarc_test_csv( - '"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + [ + f'"004","{code_and_name[0][0]}","A","20141113","20141114","{code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[1][0]}","A","20141113","20141114","{code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[2][0]}","A","20141113","20141114","{code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[3][0]}","A","20141113","20141114","{code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[4][0]}","A","20141113","20141114","{code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[5][0]}","A","20141113","20141114","{code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ] ) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) @@ -71,8 +86,7 @@ class TestComAlmaMapper: # Assert # 期待値となるモジュール名 module_name = get_module_name(com_alma_mapper) - # 実行日時 - expect_row = ["001", "北大"] + create_ultmarc_common_column_values( + expect_row = [code_and_name[i - 1][0], code_and_name[i - 1][1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, sys_regist_date=expect_datetime, regist_prgm_id=module_name, @@ -80,7 +94,7 @@ class TestComAlmaMapper: update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{code_and_name[i - 1][0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i) @@ -99,7 +113,26 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ1件作成 + # テストデータ作成 + code_and_name = [ + ['001', '北大'], + ['002', '札幌医'], + ['003', '弘大'], + ['004', '岩手医'], + ['005', '東北大'], + ['006', '福島医'] + ] + test_dat_file = create_ultmarc_test_csv( + [ + f'"004","{code_and_name[0][0]}","A","20141113","20141114","{code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[1][0]}","A","20141113","20141114","{code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[2][0]}","A","20141113","20141114","{code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[3][0]}","A","20141113","20141114","{code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[4][0]}","A","20141113","20141114","{code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{code_and_name[5][0]}","A","20141113","20141114","{code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ] + ) + # テストデータ作成 test_dat_file = create_ultmarc_test_csv( '"004","001","B","20141113","20141114","テスト大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' ) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index c483c9af..6f2c80f0 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -11,7 +11,7 @@ from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ from src.db.database import Database -def create_ultmarc_test_csv(*csv_rows: str) -> DatFile: +def create_ultmarc_test_csv(csv_rows: list[str]) -> DatFile: """アルトマーク取込テストのCSVを作成 Args: csv_rows (tuple[str]): CSV文字列のリスト @@ -19,7 +19,9 @@ def create_ultmarc_test_csv(*csv_rows: str) -> DatFile: list[list[str]]: CSVデータ """ string_io = io.StringIO() - string_io.writelines(csv_rows) + for csv_row in csv_rows: + string_io.write(csv_row) + string_io.write('\n') string_io.seek(0) dat_file = DatFile(string_io) From b1a8cf31cdb557c328b695ca0eb335265eb89ea8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 12:26:08 +0900 Subject: [PATCH 041/962] =?UTF-8?q?feat:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E5=AE=9F=E8=A1=8C=E5=A0=B4=E6=89=80?= =?UTF-8?q?=E3=82=92=E6=AD=A3=E3=81=97=E3=81=84=E4=BD=8D=E7=BD=AE=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vscode/recommended_settings.json | 4 ++-- .../{dat_insert.py => ultmarc_process.py} | 2 +- ecs/jskult-batch-daily/src/jobctrl_daily.py | 22 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) rename ecs/jskult-batch-daily/src/batch/ultmarc/{dat_insert.py => ultmarc_process.py} (99%) diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json index 4e6690ce..fd8ebd3c 100644 --- a/ecs/jskult-batch-daily/.vscode/recommended_settings.json +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -16,11 +16,11 @@ "python.formatting.provider": "autopep8", "python.formatting.autopep8Path": "autopep8", "python.formatting.autopep8Args": [ - "--max-line-length", "150", + "--max-line-length", "200", "--ignore=F541" ], "flake8.args": [ - "--max-line-length", "150", + "--max-line-length", "200", "--ignore=F541" ], "python.testing.pytestArgs": [ diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py similarity index 99% rename from ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 44e53cbc..569b6a09 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/dat_insert.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -14,7 +14,7 @@ logger = get_logger('アルトマークデータ保管') ultmarc_bucket = UltmarcBucket() -def dat_insert_control(): +def batch_process(): try: logger.info('datInsert START') # DBセットアップ diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index cf374ef5..6ac64fdf 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,7 +1,7 @@ from src.batch import jissekiaraigae from src.batch.batch_functions import get_syor_date_as_date_format from src.batch.common.batch_config import BatchConfig -from src.batch.ultmarc.dat_insert import dat_insert_control +from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -10,6 +10,7 @@ logger = get_logger('日次処理コントロール') # ここを処理IDとか # バッチ共通設定を取得 batch_config = BatchConfig.get_instance() + def batch_process(): try: logger.info('日次ジョブ:開始') @@ -21,17 +22,15 @@ def batch_process(): try: logger.info('処理日取得') syor_date = get_syor_date_as_date_format() - except BatchOperationException as e: + except BatchOperationException as e: logger.error(f'処理日取得エラー(異常終了){e}') logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 batch_config.syor_date = syor_date - # TODO: 本来のアルトマーク取り込み実施場所に移動させること - dat_insert_control() # 休日判定ファイルを読み込み logger.info('休日判定処理') if True: # 休日判定 - logger.info('非営業日かつ月、火、水以外です。') # 分岐 + logger.info('非営業日かつ月、火、水以外です。') # 分岐 try: # 処理中フラグ判定。ここでdumpのフラグも見る logger.info('処理フラグ更新中') @@ -41,7 +40,7 @@ def batch_process(): logger.info('日次ジョブ:終了(正常終了)') try: logger.info('日次ジョブ処理中判定') - if True: # 処理中判定 + if True: # 処理中判定 logger.error('処理フラグ処理中(異常終了)') logger.info('処理中フラグの更新:起動') logger.info('処理中フラグの更新:終了') @@ -63,21 +62,22 @@ def batch_process(): logger.debug('卸在庫データファイル名作成: {read_filename}') logger.debug('ファイル移動OK:{_MOVE_OROSHI_ZAIKO}') # S3からダウンロード logger.debug('ファイル解凍OK:{sprintf(_ZIP_OROSHI_ZAIKO, $read_filename)}') # gunzip -fなので、gzipを使う - logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') #S3にアップロード + logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') # S3にアップロード try: logger.info('卸在庫データ取込:起動') logger.info('卸在庫データ取込:終了') except BatchOperationException as e: logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') logger.info('日次処理(アルトマーク)') - if True: # アルトマークなければ + if True: # アルトマークなければ logger.info('日次処理(アルトマーク)実行対象日でない為未実行') try: logger.info('アルトマーク取込:起動') + ultmarc_process.batch_process() logger.info('アルトマーク取込:終了') except BatchOperationException as e: logger.error(f'アルトマーク取込処理エラー(異常終了){e}') - if True: # 休日判定 + if True: # 休日判定 try: logger.info('メルク施設マスタ作成') logger.info('メルク施設マスタ作成終了') @@ -92,7 +92,7 @@ def batch_process(): logger.info('V実消化連携データ存在確認') if True: logger.error('V実消化連携データ存在確認(異常終了)') - + logger.info('日次処理(V実消化)') try: logger.info('V実消化取込:起動') @@ -120,7 +120,7 @@ def batch_process(): logger.exception(f'処理中フラグ更新エラー(異常終了){e}') logger.info('ワークディレクトリクリーニング') logger.info('日次ジョブ:終了(正常終了)') - + return 0 except Exception as e: raise e From 910ce6929dfcf208514dbe17bca4fc8373d86abe Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 13:23:17 +0900 Subject: [PATCH 042/962] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E3=80=81?= =?UTF-8?q?=E8=AB=96=E7=90=86=E5=89=8A=E9=99=A4=E3=81=AE=E3=83=91=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=B3=E3=82=82=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92?= =?UTF-8?q?=E5=A2=97=E3=82=84=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 167 ++++++++++-------- 1 file changed, 98 insertions(+), 69 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 3a800949..0dfa56d6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -40,7 +40,7 @@ class TestComAlmaMapper: def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): """ Cases: - COM_出身校テーブルにレコードを1件登録する + COM_出身校テーブルにレコードを登録する Arranges: - CSVデータを用意する - 追加対象となるレコードを削除する @@ -84,6 +84,7 @@ class TestComAlmaMapper: sut.execute_queries() # Assert + # 期待値作成 # 期待値となるモジュール名 module_name = get_module_name(com_alma_mapper) expect_row = [code_and_name[i - 1][0], code_and_name[i - 1][1]] + create_ultmarc_common_column_values( @@ -99,10 +100,10 @@ class TestComAlmaMapper: # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i) - def test_update_record_one(self, expect_datetime: datetime, expect_date_str: str): + def test_update_record(self, expect_datetime: datetime, expect_date_str: str): """ Cases: - COM_出身校テーブルのレコードを1件更新する + COM_出身校テーブルのレコードを更新する Arranges: - CSVデータを用意する - 追加対象となるレコードを登録する @@ -114,7 +115,30 @@ class TestComAlmaMapper: # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テストデータ作成 - code_and_name = [ + csv_in_code_and_name = [ + ['001', '北大'], + ['002', '札幌医'], + ['003', '弘大'], + ['004', ''], + ['005', '福島医'], + ['006', '東北大'] + ] + test_dat_file = create_ultmarc_test_csv( + [ + f'"004","{csv_in_code_and_name[0][0]}","B","20141113","20141114","{csv_in_code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[1][0]}","B","20141113","20141114","{csv_in_code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[2][0]}","B","20141113","20141114","{csv_in_code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[3][0]}","B","20141113","20141114","{csv_in_code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[4][0]}","B","20141113","20141114","{csv_in_code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[5][0]}","B","20141113","20141114","{csv_in_code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ] + ) + + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + db_in_code_and_name = [ ['001', '北大'], ['002', '札幌医'], ['003', '弘大'], @@ -122,42 +146,25 @@ class TestComAlmaMapper: ['005', '東北大'], ['006', '福島医'] ] - test_dat_file = create_ultmarc_test_csv( - [ - f'"004","{code_and_name[0][0]}","A","20141113","20141114","{code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[1][0]}","A","20141113","20141114","{code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[2][0]}","A","20141113","20141114","{code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[3][0]}","A","20141113","20141114","{code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[4][0]}","A","20141113","20141114","{code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[5][0]}","A","20141113","20141114","{code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - ] - ) - # テストデータ作成 - test_dat_file = create_ultmarc_test_csv( - '"004","001","B","20141113","20141114","テスト大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - ) - # モジュール名 module_name = get_module_name(com_alma_mapper) - # DBに登録するテストデータ - test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - - # 一旦全データをDBから削除 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) - self.db.execute(delete_sql, delete_parameter) # テスト対象のデータをDBに登録 - insert_sql, insert_parameter = create_insert_sql_with_parameter( - 'src05.com_alma', - self.table_columns, - test_sql_data - ) - self.db.execute(insert_sql, insert_parameter) + for row in db_in_code_and_name: + code, name = row + # DBに登録するテストデータ + test_sql_data = [code, name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) # sut(system under test)作成 for i, line in enumerate(test_dat_file, start=1): @@ -169,19 +176,17 @@ class TestComAlmaMapper: sut.execute_queries() # Assert - # 期待値となるモジュール名 - module_name = get_module_name(com_alma_mapper) - # 実行日時 - expect_row = ["001", "テスト大"] + create_ultmarc_common_column_values( + # 期待値作成 + expect_row = [csv_in_code_and_name[i - 1][0], csv_in_code_and_name[i - 1][1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - update_ymd=expect_date_str, # 更新日時が登録される + update_ymd=expect_date_str, # 更新日が登録される sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=datetime.now(), update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{csv_in_code_and_name[i - 1][0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) @@ -207,32 +212,57 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ1件作成 + # テストデータ作成 + # 3カラム目、論理削除されるかどうか + csv_in_code_and_name = [ + ['001', '北大', False], + ['002', '札幌医', False], + ['003', '弘大', False], + ['004', '岩手医', False], + ['005', '東北大', False], + ['006', '福島医', True] + ] test_dat_file = create_ultmarc_test_csv( - '"004","001","C","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + [ + f'"004","{csv_in_code_and_name[0][0]}","A","20141113","20141114","{csv_in_code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[1][0]}","A","20141113","20141114","{csv_in_code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[2][0]}","A","20141113","20141114","{csv_in_code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[3][0]}","A","20141113","20141114","{csv_in_code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[4][0]}","A","20141113","20141114","{csv_in_code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', + f'"004","{csv_in_code_and_name[5][0]}","C","20141113","20141114","{csv_in_code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + ] ) - - # モジュール名 - module_name = get_module_name(com_alma_mapper) - # DBに登録するテストデータ - test_sql_data = ["001", "北大"] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) + # テスト対象のデータをDBに登録 - insert_sql, insert_parameter = create_insert_sql_with_parameter( - 'src05.com_alma', - self.table_columns, - test_sql_data - ) - self.db.execute(insert_sql, insert_parameter) + db_in_code_and_name = [ + ['001', '北大'], + ['002', '札幌医'], + ['003', '弘大'], + ['004', ''], + ['005', '東北大'], + ['006', '福島医'] + ] + # モジュール名 + module_name = get_module_name(com_alma_mapper) + for row in db_in_code_and_name: + code, name = row + # DBに登録するテストデータ + test_sql_data = [code, name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) # sut(system under test)作成 for i, line in enumerate(test_dat_file, start=1): @@ -244,19 +274,18 @@ class TestComAlmaMapper: sut.execute_queries() # Assert - # 期待値となるモジュール名 - module_name = get_module_name(com_alma_mapper) - # 実行日時 - expect_row = ["001", "北大"] + create_ultmarc_common_column_values( + # 期待値作成 + expect_row = [csv_in_code_and_name[i - 1][0], csv_in_code_and_name[i - 1][1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - delete_ymd=expect_date_str, # 削除日が登録される + update_ymd=expect_date_str if csv_in_code_and_name[i - 1][2] is False else None, # メンテナンス区分!=C 更新日が登録される + delete_ymd=expect_date_str if csv_in_code_and_name[i - 1][2] is True else None, # メンテナンス区分==C 削除日が登録される sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=datetime.now(), update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select("SELECT * FROM src05.com_alma WHERE alma_cd = '001'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{csv_in_code_and_name[i - 1][0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) From aff5013f155ead1e71f2971e67a45113a9e806cd Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 13:38:38 +0900 Subject: [PATCH 043/962] =?UTF-8?q?feat:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E4=BD=9C=E6=88=90=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E3=82=B7=E3=83=B3=E3=83=97=E3=83=AB=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 107 ++++++++---------- 1 file changed, 48 insertions(+), 59 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index 0dfa56d6..b5c29081 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -52,24 +52,19 @@ class TestComAlmaMapper: # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テストデータ作成 - code_and_name = [ - ['001', '北大'], - ['002', '札幌医'], - ['003', '弘大'], - ['004', '岩手医'], - ['005', '東北大'], - ['006', '福島医'] + csv_floating_data_lst = [ + ['001', '北大', 'A'], + ['002', '札幌医', 'A'], + ['003', '弘大', 'A'], + ['004', '岩手医', 'A'], + ['005', '東北大', 'A'], + ['006', '福島医', 'A'] ] - test_dat_file = create_ultmarc_test_csv( - [ - f'"004","{code_and_name[0][0]}","A","20141113","20141114","{code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[1][0]}","A","20141113","20141114","{code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[2][0]}","A","20141113","20141114","{code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[3][0]}","A","20141113","20141114","{code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[4][0]}","A","20141113","20141114","{code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{code_and_name[5][0]}","A","20141113","20141114","{code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - ] - ) + test_data_list = [ + f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) @@ -87,7 +82,8 @@ class TestComAlmaMapper: # 期待値作成 # 期待値となるモジュール名 module_name = get_module_name(com_alma_mapper) - expect_row = [code_and_name[i - 1][0], code_and_name[i - 1][1]] + create_ultmarc_common_column_values( + expect_data = csv_floating_data_lst[i - 1] + expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, sys_regist_date=expect_datetime, regist_prgm_id=module_name, @@ -95,7 +91,7 @@ class TestComAlmaMapper: update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{code_and_name[i - 1][0]}'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i) @@ -115,24 +111,19 @@ class TestComAlmaMapper: # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テストデータ作成 - csv_in_code_and_name = [ - ['001', '北大'], - ['002', '札幌医'], - ['003', '弘大'], - ['004', ''], - ['005', '福島医'], - ['006', '東北大'] + csv_floating_data_lst = [ + ['001', '北大', 'B'], + ['002', '札幌医', 'B'], + ['003', '弘大', 'B'], + ['004', '', 'B'], + ['005', '福島医', 'B'], + ['006', '東北大', 'A'] ] - test_dat_file = create_ultmarc_test_csv( - [ - f'"004","{csv_in_code_and_name[0][0]}","B","20141113","20141114","{csv_in_code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[1][0]}","B","20141113","20141114","{csv_in_code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[2][0]}","B","20141113","20141114","{csv_in_code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[3][0]}","B","20141113","20141114","{csv_in_code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[4][0]}","B","20141113","20141114","{csv_in_code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[5][0]}","B","20141113","20141114","{csv_in_code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - ] - ) + test_data_list = [ + f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) @@ -177,7 +168,9 @@ class TestComAlmaMapper: # Assert # 期待値作成 - expect_row = [csv_in_code_and_name[i - 1][0], csv_in_code_and_name[i - 1][1]] + create_ultmarc_common_column_values( + + expect_date = csv_floating_data_lst[i - 1] + expect_row = [expect_date[0], expect_date[1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, update_ymd=expect_date_str, # 更新日が登録される sys_regist_date=expect_datetime, @@ -186,7 +179,7 @@ class TestComAlmaMapper: update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{csv_in_code_and_name[i - 1][0]}'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_date[0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) @@ -214,24 +207,19 @@ class TestComAlmaMapper: self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テストデータ作成 # 3カラム目、論理削除されるかどうか - csv_in_code_and_name = [ - ['001', '北大', False], - ['002', '札幌医', False], - ['003', '弘大', False], - ['004', '岩手医', False], - ['005', '東北大', False], - ['006', '福島医', True] + csv_floating_data_lst = [ + ['001', '北大', 'A'], + ['002', '札幌医', 'A'], + ['003', '弘大', 'A'], + ['004', '岩手医', 'A'], + ['005', '東北大', 'A'], + ['006', '福島医', 'C'] ] - test_dat_file = create_ultmarc_test_csv( - [ - f'"004","{csv_in_code_and_name[0][0]}","A","20141113","20141114","{csv_in_code_and_name[0][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[1][0]}","A","20141113","20141114","{csv_in_code_and_name[1][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[2][0]}","A","20141113","20141114","{csv_in_code_and_name[2][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[3][0]}","A","20141113","20141114","{csv_in_code_and_name[3][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[4][0]}","A","20141113","20141114","{csv_in_code_and_name[4][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"', - f'"004","{csv_in_code_and_name[5][0]}","C","20141113","20141114","{csv_in_code_and_name[5][1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - ] - ) + test_data_list = [ + f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) @@ -275,17 +263,18 @@ class TestComAlmaMapper: # Assert # 期待値作成 - expect_row = [csv_in_code_and_name[i - 1][0], csv_in_code_and_name[i - 1][1]] + create_ultmarc_common_column_values( + expect_data = csv_floating_data_lst[i - 1] + expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, - update_ymd=expect_date_str if csv_in_code_and_name[i - 1][2] is False else None, # メンテナンス区分!=C 更新日が登録される - delete_ymd=expect_date_str if csv_in_code_and_name[i - 1][2] is True else None, # メンテナンス区分==C 削除日が登録される + update_ymd=expect_date_str if expect_data[2] != 'C' else None, # メンテナンス区分!=C 更新日が登録される + delete_ymd=expect_date_str if expect_data[2] == 'C' else None, # メンテナンス区分==C 削除日が登録される sys_regist_date=expect_datetime, regist_prgm_id=module_name, sys_update_date=datetime.now(), update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{csv_in_code_and_name[i - 1][0]}'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) From 4cd848afdec46a5a40c75eafad039e4b8d3ed1b1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 15:13:20 +0900 Subject: [PATCH 044/962] =?UTF-8?q?feat:=20COM=5F=E9=AB=98=E5=BA=A6?= =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_hamtec_mapper.py | 305 ++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py new file mode 100644 index 00000000..ac16b47c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py @@ -0,0 +1,305 @@ +from datetime import datetime + +import pytest + +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_hamtec_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_common_column_names, + create_ultmarc_common_column_values, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_csv, get_module_name) + + +class TestComHamtecMapper: + """COM_高度先進医療""" + + db: Database + batch_config: BatchConfig + table_columns = ["hamtec_cd", "hamtec_div", "hamtec_name"] + create_ultmarc_common_column_names() + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_config = BatchConfig.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_高度先進医療テーブルにレコードを登録する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ作成 + csv_floating_data_lst = [ + ['001', '2', '直流電流による骨電気治療法', 'A'], + ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'A'], + ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'A'], + ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'A'], + ['005', '1', '造血器腫瘍のDNA診断', 'A'], + ['006', '1', '培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)', 'A'] + ] + test_data_list = [ + f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値作成 + # 期待値となるモジュール名 + module_name = get_module_name(com_hamtec_mapper) + expect_data = csv_floating_data_lst[i - 1] + expect_row = [expect_data[0], expect_data[1], expect_data[2]] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + + def test_update_record(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_高度先進医療テーブルのレコードを更新する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ作成 + csv_floating_data_lst = [ + ['001', '', '', 'A'], + ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'B'], + ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'B'], + ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'B'], + ['005', '', '造血器腫瘍のDNA診断', 'B'], + ['006', '1', '', 'B'] + ] + test_data_list = [ + f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) + + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + db_floating_data_list = [ + ['001', '2', '直流電流による骨電気治療法'], + ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)'], + ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療'], + ['004', '1', '顔面骨、頭蓋骨の観血的移動術'], + ['005', '1', '造血器腫瘍のDNA診断'], + ['006', '1', '培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)'] + ] + # モジュール名 + module_name = get_module_name(com_hamtec_mapper) + # テスト対象のデータをDBに登録 + for row in db_floating_data_list: + code, div, name = row + # DBに登録するテストデータ + test_sql_data = [code, div, name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hamtec', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目: マッパークラスが期待通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値作成 + + expect_data = csv_floating_data_lst[i - 1] + hamtec_div = expect_data[1] if expect_data[3] == 'B' else db_floating_data_list[i - 1][1] + hamtec_name = expect_data[2] if expect_data[3] == 'B' else db_floating_data_list[i - 1][2] + expect_row = [expect_data[0], hamtec_div, hamtec_name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + update_ymd=expect_date_str if expect_data[3] == 'B' else None, # レコードがあり、項目が設定されている場合、更新日が登録される + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=datetime.now() if expect_data[3] == 'B' else expect_datetime, # レコードがあり、項目が設定されている場合、更新日が登録される + update_prgm_id=module_name + ) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + # 更新されている場合 + if expect_data[3] == 'B': + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + else: + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + + def test_logical_delete_record_one(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_高度先進医療テーブルのレコードを論理削除する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ作成 + # 3カラム目、論理削除されるかどうか + csv_floating_data_lst = [ + ['001', '', '', 'A'], + ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'B'], + ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'B'], + ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'C'], + ['005', '', '造血器腫瘍のDNA診断', 'B'], + ['006', '1', '', 'B'] + ] + test_data_list = [ + f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # テスト対象のデータをDBに登録 + db_floating_data_list = [ + ['001', '', ''], + ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)'], + ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療'], + ['004', '1', '顔面骨、頭蓋骨の観血的移動術'], + ['005', '', '造血器腫瘍のDNA診断'], + ['006', '1', ''] + ] + # モジュール名 + module_name = get_module_name(com_hamtec_mapper) + for row in db_floating_data_list: + code, div, name = row + # DBに登録するテストデータ + test_sql_data = [code, div, name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hamtec', + self.table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目: マッパークラスが期待通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値作成 + expect_data = csv_floating_data_lst[i - 1] + hamtec_div = expect_data[1] if expect_data[3] == 'B' else db_floating_data_list[i - 1][1] + hamtec_name = expect_data[2] if expect_data[3] == 'B' else db_floating_data_list[i - 1][2] + expect_row = [expect_data[0], hamtec_div, hamtec_name] + create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + update_ymd=expect_date_str if expect_data[3] == 'B' else None, # メンテナンス区分!=C 更新日が登録される + delete_ymd=expect_date_str if expect_data[3] == 'C' else None, # メンテナンス区分==C 削除日が登録される + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=datetime.now() if expect_data[3] != 'A' else expect_datetime, + update_prgm_id=module_name + ) + expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + if expect_data[3] != 'A': + assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + else: + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' From 47e4801f468c3aeeae4fc4f9d8e5e2cc3cb8f552 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 7 Apr 2023 15:13:37 +0900 Subject: [PATCH 045/962] =?UTF-8?q?feat:=20=E6=A8=AA=E5=B1=95=E9=96=8B?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/test_com_alma_mapper.py | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py index b5c29081..5404b43a 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py @@ -94,7 +94,13 @@ class TestComAlmaMapper: actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i) + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' def test_update_record(self, expect_datetime: datetime, expect_date_str: str): """ @@ -129,7 +135,7 @@ class TestComAlmaMapper: delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - db_in_code_and_name = [ + db_floating_data_list = [ ['001', '北大'], ['002', '札幌医'], ['003', '弘大'], @@ -140,7 +146,7 @@ class TestComAlmaMapper: # モジュール名 module_name = get_module_name(com_alma_mapper) # テスト対象のデータをDBに登録 - for row in db_in_code_and_name: + for row in db_floating_data_list: code, name = row # DBに登録するテストデータ test_sql_data = [code, name] + create_ultmarc_common_column_values( @@ -169,8 +175,8 @@ class TestComAlmaMapper: # Assert # 期待値作成 - expect_date = csv_floating_data_lst[i - 1] - expect_row = [expect_date[0], expect_date[1]] + create_ultmarc_common_column_values( + expect_data = csv_floating_data_lst[i - 1] + expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( regist_ymd=expect_date_str, update_ymd=expect_date_str, # 更新日が登録される sys_regist_date=expect_datetime, @@ -179,7 +185,7 @@ class TestComAlmaMapper: update_prgm_id=module_name ) expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_date[0]}'") + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") # 期待値検査 assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) @@ -187,9 +193,9 @@ class TestComAlmaMapper: for actual_row, expect_row in zip(actual_rows, expect_rows): for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時と一致すること' + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' if actual_col_name == 'sys_update_date': - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' def test_logical_delete_record_one(self, expect_datetime: datetime, expect_date_str: str): """ @@ -225,7 +231,7 @@ class TestComAlmaMapper: self.db.execute(delete_sql, delete_parameter) # テスト対象のデータをDBに登録 - db_in_code_and_name = [ + db_floating_data_list = [ ['001', '北大'], ['002', '札幌医'], ['003', '弘大'], @@ -235,7 +241,7 @@ class TestComAlmaMapper: ] # モジュール名 module_name = get_module_name(com_alma_mapper) - for row in db_in_code_and_name: + for row in db_floating_data_list: code, name = row # DBに登録するテストデータ test_sql_data = [code, name] + create_ultmarc_common_column_values( @@ -282,6 +288,6 @@ class TestComAlmaMapper: for actual_row, expect_row in zip(actual_rows, expect_rows): for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時と一致すること' + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' if actual_col_name == 'sys_update_date': - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{actual_col_name}が、期待値の日時以前であること' + assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' From 1a42020176ed6ee2b4de5d7d8795e229d2556c29 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 10 Apr 2023 23:41:12 +0900 Subject: [PATCH 046/962] =?UTF-8?q?feat:=20=E3=83=90=E3=82=B0=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=80=82=E3=83=86=E3=82=B9=E3=83=88=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82=E3=82=82=E3=81=A3=E3=81=A8=E3=82=B3=E3=83=B3=E3=83=91?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=81=AB=E3=81=A7=E3=81=8D=E3=82=8B=E3=81=AF?= =?UTF-8?q?=E3=81=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_wrkplace_mapper.py | 41 ++- .../test_com_dr_wrkplace_mapper.py | 341 ++++++++++++++++++ .../tests/testing_utility.py | 4 +- 3 files changed, 368 insertions(+), 18 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index f8b578af..0e816f06 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -196,18 +196,20 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): def __make_update_query(self): make_history_query = None # 履歴レコード作成判断となる、UPDATE SET句を作成 - set_clauses = self.__make_update_columns_with_historical() + set_clauses_with_historical = self.__make_update_columns_with_historical() + # 履歴レコード作成判断とならない、UPDATE SET句 + set_clause_without_historical = [] + # DM不可フラグの値をセット + # 履歴レコード作成判断とならないため、後から設定 + if self.record.notdm_flg != '': + notdm_flg = None if self.record.notdm_flg == '@' else self.record.notdm_flg + self.query_parameter['notdm_flg'] = notdm_flg + set_clause_without_historical.append(f'notdm_flg = {"NULL" if notdm_flg is None else ":notdm_flg"}') # 何かしら更新がある場合、履歴作成クエリを作成 - if len(set_clauses) != 0: - # DM不可フラグの値をセット - # 履歴レコード作成判断とならないため、後から設定 - if self.record.notdm_flg != '': - set_clauses.append('notdm_flg = :notdm_flg') - self.query_parameter['notdm_flg'] = self.record.sectname if self.record.sectcode != '@' else 'NULL' - + if len(set_clauses_with_historical) != 0: make_history_query = self.TO_HISTORY_QUERY - update_columns = ','.join(set_clauses) + update_columns = ','.join(set_clauses_with_historical + set_clause_without_historical) if len(update_columns) > 0: # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる update_columns += ',' @@ -225,20 +227,25 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): # 役職コード if self.record.postcode != '': set_clauses.append('post_cd = :postcode') - self.query_parameter['postcode'] = self.record.postcode if self.record.postcode != '@' else '' + self.query_parameter['postcode'] = '' if self.record.postcode == '@' else self.record.postcode # 大学順位 if self.record.identitycode != '': set_clauses.append('identity_cd = :identitycode') - self.query_parameter['identitycode'] = self.record.identitycode if self.record.identitycode != '@' else '' + self.query_parameter['identitycode'] = '' if self.record.identitycode == '@' else self.record.identitycode # 所属部科(集合項目) if self.record.sectcode != '': + # 所属部科コード + self.query_parameter['sectcode'] = '9999' if self.record.sectcode == '@' else self.record.sectcode set_clauses.append('blng_sec_cd = :sectcode') - set_clauses.append('blng_sec_name_kana = :sectname_kana') - set_clauses.append('blng_sec_name = :sectname') - self.query_parameter['sectcode'] = self.record.sectcode if self.record.sectcode != '@' else '9999' - self.query_parameter['sectname_kana'] = self.record.sectname_kana if self.record.sectcode != '@' else 'NULL' - # 全角文字なので、全角@が連携されるパターンがある - self.query_parameter['sectname'] = self.record.sectname if self.record.sectcode != '@' else 'NULL' + # 所属部科(カナ) + sectname_kana = None if self.record.sectname_kana == '@' else self.record.sectname_kana + self.query_parameter['sectname_kana'] = sectname_kana + set_clauses.append(f'blng_sec_name_kana = {"NULL" if sectname_kana is None else ":sectname_kana"}') + # 所属部科(漢字) + # 全角文字なので、修正項目として全角@が連携されるパターンがある + sectname = None if self.record.sectname == '@' else self.record.sectname + self.query_parameter['sectname'] = sectname + set_clauses.append(f'blng_sec_name = {"NULL" if sectname is None else ":sectname"}') # 何かしら更新がある場合、適用開始日をセットする if len(set_clauses) != 0: diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py new file mode 100644 index 00000000..12fe23a2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py @@ -0,0 +1,341 @@ +from datetime import date, datetime + +import pytest + +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_dr_wrkplace_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_common_column_names, + create_ultmarc_common_column_values, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_csv, get_module_name) + + +class TestComDrWrkplaceMapper: + """COM_DCF医師勤務先""" + + db: Database + batch_config: BatchConfig + dr_wrkplace_table_columns = [ + "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", + "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"] \ + + create_ultmarc_common_column_names() + # 削除日カラムはないので消す + dr_wrkplace_table_columns.remove('delete_ymd') + + dr_wrkplace_his_table_columns = [ + "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", + "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \ + + create_ultmarc_common_column_names() + # 削除日カラムはないので消す + dr_wrkplace_his_table_columns.remove('delete_ymd') + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_config = BatchConfig.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_DCF医師勤務先テーブルにレコードを登録する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを削除する + Expects: + - COM_医師勤務先の登録内容が期待値と一致すること + - COM_医師勤務先履歴にデータが登録されないこと + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テストデータ作成 + csv_floating_data_lst = [ + ['01', '995783', '00', '5414992', '2', '501', '', '', '', '', '1', 'A'], + ['01', '995783', '00', '5507600', '2', '133', '144', '9112', '', '', '', 'A'], + ['01', '997682', '00', '5402984', '2', '165', '144', '1512', '', '', '', 'A'], + ['01', '997682', '00', '5408060', '2', '', '144', '6802', '', '', '', 'A'], + ['01', '997682', '00', '5412977', '2', '', '144', '6720', '', '', '', 'A'], + ['01', '997906', '00', '5409446', '2', '501', '', '1118', '', '', '', 'A'], + ['01', '997906', '00', '5503358', '2', '172', '144', '1118', '', '', '', 'A'], + ['01', '997906', '00', '5504428', '2', '', '144', '7212', '', '', '', 'A'], + ['01', '997906', '00', '5507600', '2', '', '144', '9114', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'A'], + ['01', '999613', '00', '5504428', '2', '', '144', '5140', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'A'], + ] + test_data_list = [ + f'"502","{data[0]}","{data[1]}",,"{data[11]}","{data[2]}","{data[3]}",,"{data[4]}","20141113","20141114","{data[5]}","{data[6]}","{data[7]}","{data[8]}","{data[9]}","{data[10]}"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) + # 一旦全データをDBから削除 + # COM_医師勤務先 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_医師勤務先履歴 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # sut(system under test)作成 + for i, line in enumerate(test_dat_file, start=1): + sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{i}行目:マッパークラスが期通りか' + + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値作成 + # 期待値となるモジュール名 + module_name = get_module_name(com_dr_wrkplace_mapper) + expect_data = csv_floating_data_lst[i - 1] + + expect_row = [ + f'{expect_data[2]}{expect_data[3]}', + f'{expect_data[0]}{expect_data[1]}', + expect_data[7], + expect_data[5], + expect_data[6], + datetime.date(expect_datetime), + expect_data[9], + expect_data[8], + expect_data[10] + ] + ultmarc_common_column_values = create_ultmarc_common_column_values( + regist_ymd=datetime.date(expect_datetime), + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + # 削除日カラムが存在しないので消す + ultmarc_common_column_values.pop(2) + expect_row += ultmarc_common_column_values + + expect_rows = [{c: r for c, r in zip(self.dr_wrkplace_table_columns, expect_row)}] + dcf_pcf_dr_cd = f'{expect_data[0]}{expect_data[1]}' + dcf_dcf_inst_cd = f'{expect_data[2]}{expect_data[3]}' + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + + # 履歴テーブルの存在チェック + history_table = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace_his WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") + assert len(history_table) == 0, '履歴テーブルが作成されていないこと' + + def test_update_record(self, expect_datetime: datetime, expect_date_str: str): + """ + Cases: + COM_DCF医師勤務先テーブルのレコードを更新する + Arranges: + - CSVデータを用意する + - 追加対象となるレコードを削除する + Expects: + - COM_医師勤務先の登録内容が期待値と一致すること + - COM_医師勤務先履歴の登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = '2020/02/23' + # テストデータ作成 + csv_floating_data_lst = [ + ['01', '997906', '00', '5409446', '2', '', '', '', '', '', '@', 'B'], + ['01', '995783', '00', '5507600', '2', '@', '802', '@', '', '', '', 'B'], + ['01', '997682', '00', '5402984', '2', '165', '@', '', '', '', '', 'B'], + ['01', '999613', '00', '5504428', '2', '501', '', '9999', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'B'], + ] + test_data_list = [ + f'"502","{data[0]}","{data[1]}",,"{data[11]}","{data[2]}","{data[3]}",,"{data[4]}","20141113","20141114","{data[5]}","{data[6]}","{data[7]}","{data[8]}","{data[9]}","{data[10]}"' + for data in csv_floating_data_lst + ] + test_dat_file = create_ultmarc_test_csv(test_data_list) + # 一旦全データをDBから削除 + # COM_医師勤務先 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_医師勤務先履歴 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + db_floating_data_list = [ + ['005414992', '01995783', '', '501', '', '2020-02-22', '', '', ''], + ['005507600', '01995783', '9112', '133', '144', '2020-02-22', 'ハツセイ.セイシヨクブモン', '発生・生殖部門', '1'], + ['005402984', '01997682', '1512', '165', '144', '2020-02-22', 'シヨウカキゲカ', '消化器外科', ''], + ['005408060', '01997682', '6802', '', '144', '2020-02-22', 'シヨウカキゲカガク1', '消化器外科学Ⅰ', ''], + ['005412977', '01997682', '6720', '', '144', '2020-02-22', 'シヨウカキゲカガク', '消化器外科学', ''], + ['005409446', '01997906', '1118', '501', '', '2020-02-22', 'ケツエキナイカ', '血液内科', '1'], + ['005503358', '01997906', '1118', '172', '144', '2020-02-22', 'ケツエキナイカ', '血液内科', ''], + ['005504428', '01997906', '7212', '', '144', '2020-02-22', 'ユケツ.サイボウチリヨウガク', '輸血・細胞治療学', ''], + ['005507600', '01997906', '9114', '', '144', '2020-02-22', 'サイボウイシヨクブモン', '細胞移植部門', ''], + ['005504428', '01999613', '5140', '', '144', '2020-02-22', 'ヤクリガク', '薬理学', ''] + ] + # モジュール名 + module_name = get_module_name(com_dr_wrkplace_mapper) + # テスト対象のデータをDBに登録 + for row in db_floating_data_list: + (dcf_dsf_inst_cd, dcf_pcf_dr_cd, blng_sec_cd, post_cd, identity_cd, + aply_start_ymd, blng_sec_name_kana, blng_sec_name, not_db_flg) = row + # DBに登録するテストデータ + test_sql_data = [ + dcf_dsf_inst_cd, dcf_pcf_dr_cd, blng_sec_cd, post_cd, identity_cd, + aply_start_ymd, blng_sec_name_kana, blng_sec_name, not_db_flg + ] + common_ultmarc_values = create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + # 削除日カラムが存在しないので消す + common_ultmarc_values.pop(2) + test_sql_data += common_ultmarc_values + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_wrkplace', + self.dr_wrkplace_table_columns, + test_sql_data + ) + self.db.execute(insert_sql, insert_parameter) + + # 期待値データを先に作る + # 医師勤務先 + expect_dr_wrkplace_rows = [ + ['005414992', '01995783', '', '501', '', date(2020, 2, 22), '', '', ''], + ['005507600', '01995783', '9999', '', '802', date(2020, 2, 23), '', '', '1'], + ['005402984', '01997682', '1512', '165', '', date(2020, 2, 23), 'シヨウカキゲカ', '消化器外科', ''], + ['005408060', '01997682', '6802', '', '144', date(2020, 2, 22), 'シヨウカキゲカガク1', '消化器外科学Ⅰ', ''], + ['005412977', '01997682', '6720', '', '144', date(2020, 2, 22), 'シヨウカキゲカガク', '消化器外科学', ''], + ['005409446', '01997906', '1118', '501', '', date(2020, 2, 22), 'ケツエキナイカ', '血液内科', ''], + ['005503358', '01997906', '1118', '172', '144', date(2020, 2, 22), 'ケツエキナイカ', '血液内科', ''], + ['005504428', '01997906', '7212', '', '144', date(2020, 2, 22), 'ユケツ.サイボウチリヨウガク', '輸血・細胞治療学', ''], + ['005507600', '01997906', '9114', '', '144', date(2020, 2, 22), 'サイボウイシヨクブモン', '細胞移植部門', ''], + ['005504428', '01999613', '9999', '501', '144', date(2020, 2, 23), 'ナイブンピ.ホネタイシヤガイライ', '内分泌・骨代謝外来', ''] + ] + # 医師勤務先履歴 + # 更新されない行はNoneで埋める + expect_dr_wrkplace_his_rows = [ + None, + [1, '005507600', '01995783', '9112', '133', '144', '20200222', 'ハツセイ.セイシヨクブモン', '発生・生殖部門', '1', '20200222'], + [1, '005402984', '01997682', '1512', '165', '144', '20200222', 'シヨウカキゲカ', '消化器外科', '', '20200222'], + None, + None, + None, + None, + None, + None, + [1, '005504428', '01999613', '5140', '999', '144', '20200222', 'ヤクリガク', '薬理学', '', '20200222'] + ] + # 更新された行を示す(1=True, 0=False) + is_update_rows = [bool(flag) for flag in [0, 1, 1, 0, 0, 1, 0, 0, 0, 1]] + # 履歴が登録される行を示す(1=True, 0=False) + is_historical_rows = [bool(flag) for flag in [0, 1, 1, 0, 0, 0, 0, 0, 0, 1]] + # sut(system under test)作成 + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか' + # Act + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値作成 + # 期待値となるモジュール名 + module_name = get_module_name(com_dr_wrkplace_mapper) + for i, expect_dr_wrkplace_row in enumerate(expect_dr_wrkplace_rows, start=1): + ultmarc_common_column_values = create_ultmarc_common_column_values( + regist_ymd=datetime.date(expect_datetime), + update_ymd=datetime.date(expect_datetime) if is_update_rows[i - 1] else None, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + # 削除日カラムが存在しないので消す + ultmarc_common_column_values.pop(2) + expect_dr_wrkplace_row += ultmarc_common_column_values + + expect_rows = [{c: r for c, r in zip(self.dr_wrkplace_table_columns, expect_dr_wrkplace_row)}] + dcf_dcf_inst_cd = expect_dr_wrkplace_row[0] + dcf_pcf_dr_cd = expect_dr_wrkplace_row[1] + actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") + + # 期待値検査 + assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) + + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_rows, expect_rows): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + # 更新されている場合 + if is_update_rows[i - 1] is True: + assert actual_value <= expect_value, f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + else: + assert actual_value == expect_value, f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + + # 履歴テーブルの存在チェック + actual_history_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace_his WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") + # 履歴作成対象かどうか + if is_historical_rows[i - 1] is False: + assert len(actual_history_rows) == 0, '履歴テーブルが作成されていないこと' + else: + # 件数確認 + assert len(actual_history_rows) == 1, '履歴テーブルが作成されていること' + + # 期待値作成 + expect_history_row = expect_dr_wrkplace_his_rows[i - 1] + # アルトマーク共通カラムを追加 + ultmarc_common_column_values = create_ultmarc_common_column_values( + regist_ymd=expect_date_str, + sys_regist_date=expect_datetime, + regist_prgm_id=module_name, + sys_update_date=expect_datetime, + update_prgm_id=module_name + ) + # 削除日カラムが存在しないので消す + ultmarc_common_column_values.pop(2) + # アルトマーク共通カラムを追加(事前に宣言されているものを流用する) + expect_history_row += ultmarc_common_column_values + # ヘッダーを追加 + expect_history_rows_with_column = [{c: r for c, r in zip(self.dr_wrkplace_his_table_columns, expect_history_row)}] + + assert_table_results(actual_history_rows, expect_history_rows_with_column, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date', 'dr_wrkplace_his_key']) + + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_history_rows, expect_history_rows_with_column): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + if actual_col_name == 'dr_wrkplace_his_key': + assert actual_value >= expect_value, f'{i}行目:{actual_col_name}が、期待値の連番以上以前であること' + if actual_col_name == 'sys_regist_date': + assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + if actual_col_name == 'sys_update_date': + assert actual_value <= expect_value, f'{i}行目:{actual_col_name}が、期待値の日時以前であること' diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 6f2c80f0..88934496 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -173,4 +173,6 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], line_ if ignore_col_name is not None and actual_col_name in ignore_col_name: continue else: - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + assert actual_value == expect_value, f'{line_number}行目:{actual_col_name}が、期待値と一致すること' From 7fa98be71e5718f734414fd4ffb7a8f6564166c1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 10 Apr 2023 23:43:24 +0900 Subject: [PATCH 047/962] =?UTF-8?q?feat:=20=E5=80=8B=E3=80=85=E3=81=AE?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py | 0 .../table_mapper/{ => com_alma}/test_com_alma_mapper.py | 0 .../ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py | 0 .../{ => com_dr_wrkplace}/test_com_dr_wrkplace_mapper.py | 0 .../batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py | 0 .../table_mapper/{ => com_hamtec}/test_com_hamtec_mapper.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{ => com_alma}/test_com_alma_mapper.py (100%) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{ => com_dr_wrkplace}/test_com_dr_wrkplace_mapper.py (100%) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{ => com_hamtec}/test_com_hamtec_mapper.py (100%) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_alma_mapper.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_dr_wrkplace_mapper.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/test_com_hamtec_mapper.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py From 8f90e4a333d7bd13e5a6497a8623b3b512d35ca1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 00:41:42 +0900 Subject: [PATCH 048/962] =?UTF-8?q?feat:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E7=B0=A1=E7=95=A5=E5=8C=96?= =?UTF-8?q?=E3=80=82CSV=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=8B?= =?UTF-8?q?=E3=82=89=E3=83=86=E3=82=B9=E3=83=88=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=80=81=E6=9C=9F=E5=BE=85=E5=80=A4=E3=82=92=E8=AA=AD=E3=82=80?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_alma/com_alma_insert.csv | 6 ++ .../com_alma/expect_com_alma_insert.csv | 7 ++ .../com_alma/test_com_alma_mapper.py | 66 ++++++-------- .../tests/testing_utility.py | 85 ++++++++++++++++++- 4 files changed, 121 insertions(+), 43 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv new file mode 100644 index 00000000..c01c5605 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv @@ -0,0 +1,6 @@ +"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","004","A","20141113","20141114","岩手医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","006","A","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv new file mode 100644 index 00000000..8fafdb5f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_insert.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"002","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"003","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"005","東北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" +"006","福島医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:27:33","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 5404b43a..174aca65 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -1,3 +1,4 @@ +import os.path as path from datetime import datetime import pytest @@ -7,11 +8,14 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, create_delete_sql_with_parameter, + create_expect_data_from_csv, create_insert_sql_with_parameter, create_ultmarc_common_column_names, create_ultmarc_common_column_values, create_ultmarc_table_mapper_sut, - create_ultmarc_test_csv, get_module_name) + create_ultmarc_test_csv, + create_ultmarc_test_data_from_csv, + get_module_name) class TestComAlmaMapper: @@ -19,6 +23,7 @@ class TestComAlmaMapper: db: Database batch_config: BatchConfig + test_file_path: str = path.dirname(__file__) table_columns = ["alma_cd", "alma"] + create_ultmarc_common_column_names() @pytest.fixture(autouse=True, scope='function') @@ -37,12 +42,12 @@ class TestComAlmaMapper: self.db.rollback() self.db.disconnect() - def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): + def test_insert_record(self): """ Cases: COM_出身校テーブルにレコードを登録する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを削除する Expects: - 登録内容が期待値と一致すること @@ -51,56 +56,33 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - csv_floating_data_lst = [ - ['001', '北大', 'A'], - ['002', '札幌医', 'A'], - ['003', '弘大', 'A'], - ['004', '岩手医', 'A'], - ['005', '東北大', 'A'], - ['006', '福島医', 'A'] - ] - test_data_list = [ - f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_insert.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' - # Act sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 - # 期待値となるモジュール名 - module_name = get_module_name(com_alma_mapper) - expect_data = csv_floating_data_lst[i - 1] - expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_expect_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_insert.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=['regist_ymd', 'sys_update_date', 'sys_regist_date']) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の以降であること' def test_update_record(self, expect_datetime: datetime, expect_date_str: str): """ diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 88934496..032cb53a 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,6 +1,8 @@ """テスト用共通処理関数""" - +import csv import io +import tempfile +from datetime import datetime from types import ModuleType from src.batch.ultmarc.datfile import DatFile, DatFileLine @@ -11,6 +13,58 @@ from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ from src.db.database import Database +def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: + """ファイルから、アルトマーク取り込み用のテストデータを作成する + + Args: + file_path (str): csvファイルのパス + + Returns: + DatFile: データファイルオブジェクト + """ + + # 一度、Shift-JISファイルで書き出す + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932') as tmp_file: + tmp_file.write(csv_file.read()) + tmp_file.seek(0) + tmpfile_path = tmp_file.name + dat_file = DatFile.from_path(tmpfile_path) + + return dat_file + + +def create_expect_data_from_csv(file_path: str) -> list[dict]: + """ファイルから、DBの期待値データを作成する + + Args: + file_path (str): csvファイルのパス + + Returns: + DatFile: データファイルオブジェクト + """ + + with open(file_path, encoding='utf8') as csv_file: + # ヘッダ行を取得 + header = csv_file.readline().replace('"', '').split(',') + reader = csv.DictReader(csv_file, fieldnames=header) + rows = [r for r in reader] + + # データ型変換 + for row in rows: + for k, v in row.items(): + converted_value = v + if v == 'NULL': + converted_value = None + if is_valid_date(v) is True: + converted_value = datetime.strptime(v, '%Y/%m/%d') + if is_valid_datetime(v) is True: + converted_value = datetime.strptime(v, '%Y/%m/%d %H:%M:%S') + + row[k] = converted_value + + return rows + + def create_ultmarc_test_csv(csv_rows: list[str]) -> DatFile: """アルトマーク取込テストのCSVを作成 Args: @@ -156,6 +210,35 @@ def get_module_name(module: ModuleType) -> str: return module.__name__.split('.')[-1] +def is_valid_date(date_str: str, date_format='%Y/%m/%d'): + """日付文字列が、与えられたフォーマットにマッチするかを検査する + + Args: + date_str (str): 日付文字列 + date_format (str, optional): 日付のフォーマット. Defaults to '%Y/%m/%d'. + + Returns: + _type_: 正しい日付文字列の場合、True、それ以外はFalse + """ + try: + datetime.strptime(date_str, date_format) + return True + except ValueError: + return False + + +def is_valid_datetime(date_str: str): + """日付文字列が、YYYY/MM/DD HH:MM:SSとマッチするかを検査する + + Args: + date_str (str): 日付文字列 + + Returns: + _type_: 正しい日付文字列の場合、True、それ以外はFalse + """ + return is_valid_date(date_str, '%Y/%m/%d %H:%M:%S') + + def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], line_number: int, ignore_col_name: list = None) -> None: """テーブル同士の取得結果突き合わせ From fcaae9d5b50befbb5ea523ae883952112d50b062 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:20:46 +0900 Subject: [PATCH 049/962] =?UTF-8?q?feat:=20COM=5F=E5=87=BA=E8=BA=AB?= =?UTF-8?q?=E6=A0=A1=E3=81=AE=E6=9B=B4=E6=96=B0=E3=80=81=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_alma_mapper.py | 2 +- .../ultmarc/utmp_tables/tables/com_alma.py | 6 +- .../table_mapper/com_alma/com_alma_delete.csv | 7 + .../table_mapper/com_alma/com_alma_update.csv | 6 + .../com_alma/db_com_alma_before_delete.csv | 7 + .../com_alma/db_com_alma_before_update.csv | 7 + .../com_alma/expect_com_alma_delete.csv | 8 + .../com_alma/expect_com_alma_update.csv | 7 + .../com_alma/test_com_alma_mapper.py | 209 +++++------------- .../tests/testing_utility.py | 6 +- 10 files changed, 110 insertions(+), 155 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index 31049812..5963aa3f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_alma import ComAlma class ComAlmaMapper(UltmarcTableMapper): - """COM_出身校 登録処理""" + """レイアウト区分004: COM_出身校 登録処理""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py index 07d2af8f..80940b09 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComAlma(UltmarcTable): - """COM_出身校""" + """レイアウト区分004: COM_出身校""" maint_flag: str # 修正区分 alma_cd: str # 出身校コード alma: str # 出身校 @@ -10,5 +10,5 @@ class ComAlma(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) self.maint_flag = record[2] - self.alma_cd = record[1] - self.alma = record[5] + self.alma_cd = record[1] + self.alma = record[5] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv new file mode 100644 index 00000000..dac5bd09 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv @@ -0,0 +1,7 @@ +"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","004","A","20141113","20141114","","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","006","C","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" +"004","007","A","20141113","20141114","群馬大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv new file mode 100644 index 00000000..368cb15d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv @@ -0,0 +1,6 @@ +"004","001","B","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","002","B","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","003","B","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","004","B","20141113","20141114",,"1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","005","B","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","006","B","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv new file mode 100644 index 00000000..259afa23 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"004",,"20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"006","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv new file mode 100644 index 00000000..5284785e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_update.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"002","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"003","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"005","東北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"006","福島医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv new file mode 100644 index 00000000..6cb36d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv @@ -0,0 +1,8 @@ +"alma_cd","alma","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"006","福島医","20171020","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"007","群馬大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:43:15","com_alma_mapper","2017/10/20 10:43:15","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv new file mode 100644 index 00000000..1242b1d7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv @@ -0,0 +1,7 @@ +"alma_cd","alma","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"004",,"20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"005","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 174aca65..0d292f8e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -7,15 +7,11 @@ from src.batch.common.batch_config import BatchConfig from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, create_delete_sql_with_parameter, - create_expect_data_from_csv, create_insert_sql_with_parameter, - create_ultmarc_common_column_names, - create_ultmarc_common_column_values, create_ultmarc_table_mapper_sut, - create_ultmarc_test_csv, - create_ultmarc_test_data_from_csv, - get_module_name) + create_ultmarc_test_data_from_csv) class TestComAlmaMapper: @@ -24,7 +20,6 @@ class TestComAlmaMapper: db: Database batch_config: BatchConfig test_file_path: str = path.dirname(__file__) - table_columns = ["alma_cd", "alma"] + create_ultmarc_common_column_names() @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): @@ -72,24 +67,25 @@ class TestComAlmaMapper: # Assert # 期待値ファイルを読み込む - expect_data_list = create_expect_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_insert.csv')) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_insert.csv')) primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=['regist_ymd', 'sys_update_date', 'sys_regist_date']) + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 for actual_row, expect_row in zip(actual_data_list, expect_data_list): for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' - def test_update_record(self, expect_datetime: datetime, expect_date_str: str): + def test_update_record(self): """ Cases: COM_出身校テーブルのレコードを更新する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること @@ -98,93 +94,50 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - csv_floating_data_lst = [ - ['001', '北大', 'B'], - ['002', '札幌医', 'B'], - ['003', '弘大', 'B'], - ['004', '', 'B'], - ['005', '福島医', 'B'], - ['006', '東北大', 'A'] - ] - test_data_list = [ - f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) - + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_update.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - - db_floating_data_list = [ - ['001', '北大'], - ['002', '札幌医'], - ['003', '弘大'], - ['004', '岩手医'], - ['005', '東北大'], - ['006', '福島医'] - ] - # モジュール名 - module_name = get_module_name(com_alma_mapper) - # テスト対象のデータをDBに登録 - for row in db_floating_data_list: - code, name = row - # DBに登録するテストデータ - test_sql_data = [code, name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_before_update.csv')) + for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_alma', - self.table_columns, - test_sql_data + test_data.keys(), + test_data.values() ) self.db.execute(insert_sql, insert_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' - - # Act + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_update.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' - expect_data = csv_floating_data_lst[i - 1] - expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - update_ymd=expect_date_str, # 更新日が登録される - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=datetime.now(), - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - - def test_logical_delete_record_one(self, expect_datetime: datetime, expect_date_str: str): + def test_logical_delete(self): """ Cases: COM_出身校テーブルのレコードを1件論理削除する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること @@ -193,83 +146,43 @@ class TestComAlmaMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - # 3カラム目、論理削除されるかどうか - csv_floating_data_lst = [ - ['001', '北大', 'A'], - ['002', '札幌医', 'A'], - ['003', '弘大', 'A'], - ['004', '岩手医', 'A'], - ['005', '東北大', 'A'], - ['006', '福島医', 'C'] - ] - test_data_list = [ - f'"004","{data[0]}","{data[2]}","20141113","20141114","{data[1]}","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_delete.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - - # テスト対象のデータをDBに登録 - db_floating_data_list = [ - ['001', '北大'], - ['002', '札幌医'], - ['003', '弘大'], - ['004', ''], - ['005', '東北大'], - ['006', '福島医'] - ] - # モジュール名 - module_name = get_module_name(com_alma_mapper) - for row in db_floating_data_list: - code, name = row - # DBに登録するテストデータ - test_sql_data = [code, name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_before_delete.csv')) + for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_alma', - self.table_columns, - test_sql_data + test_data.keys(), + test_data.values() ) self.db.execute(insert_sql, insert_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目: マッパークラスが期待通りか' - - # Act + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 - expect_data = csv_floating_data_lst[i - 1] - expect_row = [expect_data[0], expect_data[1]] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - update_ymd=expect_date_str if expect_data[2] != 'C' else None, # メンテナンス区分!=C 更新日が登録される - delete_ymd=expect_date_str if expect_data[2] == 'C' else None, # メンテナンス区分==C 削除日が登録される - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=datetime.now(), - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_alma WHERE alma_cd = '{expect_data[0]}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_delete.csv')) + primary_keys = [f"'{primary_key['alma_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_alma WHERE alma_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 032cb53a..a321f343 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -33,7 +33,7 @@ def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: return dat_file -def create_expect_data_from_csv(file_path: str) -> list[dict]: +def create_db_data_from_csv(file_path: str) -> list[dict]: """ファイルから、DBの期待値データを作成する Args: @@ -44,8 +44,8 @@ def create_expect_data_from_csv(file_path: str) -> list[dict]: """ with open(file_path, encoding='utf8') as csv_file: - # ヘッダ行を取得 - header = csv_file.readline().replace('"', '').split(',') + # ヘッダ行を取得し、改行とクォートを取り除く。 + header = csv_file.readline().strip('\n').replace('"', '').split(',') reader = csv.DictReader(csv_file, fieldnames=header) rows = [r for r in reader] From 3148067d2749a95dffbd24e3e45c4a61b340de6d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:43:40 +0900 Subject: [PATCH 050/962] =?UTF-8?q?feat:=20COM=5F=E9=AB=98=E5=BA=A6?= =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E7=B0=A1=E7=95=A5=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultmarc/utmp_tables/tables/com_hamtec.py | 8 +- .../com_hamtec/com_hamtec_delete.csv | 7 + .../com_hamtec/com_hamtec_insert.csv | 6 + .../com_hamtec/com_hamtec_update.csv | 6 + .../db_com_hamtec_before_delete.csv | 7 + .../db_com_hamtec_before_update.csv | 7 + .../com_hamtec/expect_com_hamtec_delete.csv | 8 + .../com_hamtec/expect_com_hamtec_insert.csv | 7 + .../com_hamtec/expect_com_hamtec_update.csv | 7 + .../com_hamtec/test_com_hamtec_mapper.py | 279 ++++++------------ 10 files changed, 142 insertions(+), 200 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py index 380e5fd3..0eb5ab1c 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hamtec.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComHamtec(UltmarcTable): - """COM_高度先進医療""" + """レイアウト区分021: COM_高度先進医療""" maint_flag: str # 修正区分 hamtec_cd: str # 高度先進医療コード hamtec_div: str # 高度先進医療区分 @@ -10,7 +10,7 @@ class ComHamtec(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.maint_flag = record[3] - self.hamtec_cd = record[1] - self.hamtec_div = record[2] + self.maint_flag = record[3] + self.hamtec_cd = record[1] + self.hamtec_div = record[2] self.hamtec_name = record[6] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv new file mode 100644 index 00000000..97b59772 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv @@ -0,0 +1,7 @@ +"021","001","","A","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","007","2","A","20141113","20141114","重症肥満の外科治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv new file mode 100644 index 00000000..d1b3a3f9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv @@ -0,0 +1,6 @@ +"021","001","2","A","20141113","20141114","直流電流による骨電気治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv new file mode 100644 index 00000000..d9c1bc94 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv @@ -0,0 +1,6 @@ +"021","001","","B","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv new file mode 100644 index 00000000..ac7de33a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_delete.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv new file mode 100644 index 00000000..f6d16401 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/db_com_hamtec_before_update.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" +"006","1","造血器腫瘍のDNA診断","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","clsComHamtec" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv new file mode 100644 index 00000000..9b5b62d9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv @@ -0,0 +1,8 @@ +"hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","20171018","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" +"007","2","重症肥満の外科治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:21:01","com_hamtec_mapper","2017/10/18 17:21:01","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv new file mode 100644 index 00000000..35b58442 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_insert.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"005","1","造血器腫瘍のDNA診断","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" +"006","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 16:24:26","com_hamtec_mapper","2017/10/18 16:24:26","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv new file mode 100644 index 00000000..1d9a61d4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv @@ -0,0 +1,7 @@ +"hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"005","1","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" +"006","1","造血器腫瘍のDNA診断","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py index ac16b47c..9e500212 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -1,3 +1,4 @@ +import os.path as path from datetime import datetime import pytest @@ -7,20 +8,19 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ com_hamtec_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, create_delete_sql_with_parameter, create_insert_sql_with_parameter, - create_ultmarc_common_column_names, - create_ultmarc_common_column_values, create_ultmarc_table_mapper_sut, - create_ultmarc_test_csv, get_module_name) + create_ultmarc_test_data_from_csv) -class TestComHamtecMapper: +class TestComAlmaMapper: """COM_高度先進医療""" db: Database batch_config: BatchConfig - table_columns = ["hamtec_cd", "hamtec_div", "hamtec_name"] + create_ultmarc_common_column_names() + test_file_path: str = path.dirname(__file__) @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): @@ -38,12 +38,12 @@ class TestComHamtecMapper: self.db.rollback() self.db.disconnect() - def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): + def test_insert_record(self): """ Cases: COM_高度先進医療テーブルにレコードを登録する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを削除する Expects: - 登録内容が期待値と一致すること @@ -52,63 +52,41 @@ class TestComHamtecMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - csv_floating_data_lst = [ - ['001', '2', '直流電流による骨電気治療法', 'A'], - ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'A'], - ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'A'], - ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'A'], - ['005', '1', '造血器腫瘍のDNA診断', 'A'], - ['006', '1', '培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)', 'A'] - ] - test_data_list = [ - f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_insert.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' - # Act sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 - # 期待値となるモジュール名 - module_name = get_module_name(com_hamtec_mapper) - expect_data = csv_floating_data_lst[i - 1] - expect_row = [expect_data[0], expect_data[1], expect_data[2]] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_insert.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - - def test_update_record(self, expect_datetime: datetime, expect_date_str: str): + def test_update_record(self): """ Cases: COM_高度先進医療テーブルのレコードを更新する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること @@ -117,99 +95,53 @@ class TestComHamtecMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - csv_floating_data_lst = [ - ['001', '', '', 'A'], - ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'B'], - ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'B'], - ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'B'], - ['005', '', '造血器腫瘍のDNA診断', 'B'], - ['006', '1', '', 'B'] - ] - test_data_list = [ - f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) - + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_update.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - - db_floating_data_list = [ - ['001', '2', '直流電流による骨電気治療法'], - ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)'], - ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療'], - ['004', '1', '顔面骨、頭蓋骨の観血的移動術'], - ['005', '1', '造血器腫瘍のDNA診断'], - ['006', '1', '培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)'] - ] - # モジュール名 - module_name = get_module_name(com_hamtec_mapper) - # テスト対象のデータをDBに登録 - for row in db_floating_data_list: - code, div, name = row - # DBに登録するテストデータ - test_sql_data = [code, div, name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hamtec_before_update.csv')) + for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_hamtec', - self.table_columns, - test_sql_data + test_data.keys(), + test_data.values() ) self.db.execute(insert_sql, insert_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目: マッパークラスが期待通りか' - - # Act + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_update.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' - expect_data = csv_floating_data_lst[i - 1] - hamtec_div = expect_data[1] if expect_data[3] == 'B' else db_floating_data_list[i - 1][1] - hamtec_name = expect_data[2] if expect_data[3] == 'B' else db_floating_data_list[i - 1][2] - expect_row = [expect_data[0], hamtec_div, hamtec_name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - update_ymd=expect_date_str if expect_data[3] == 'B' else None, # レコードがあり、項目が設定されている場合、更新日が登録される - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=datetime.now() if expect_data[3] == 'B' else expect_datetime, # レコードがあり、項目が設定されている場合、更新日が登録される - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - # 更新されている場合 - if expect_data[3] == 'B': - assert actual_row[actual_col_name] < expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - else: - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - - def test_logical_delete_record_one(self, expect_datetime: datetime, expect_date_str: str): + def test_logical_delete(self): """ Cases: - COM_高度先進医療テーブルのレコードを論理削除する + COM_高度先進医療テーブルのレコードを1件論理削除する Arranges: - - CSVデータを用意する + - CSVデータを用意し、読み込む - 追加対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること @@ -218,88 +150,43 @@ class TestComHamtecMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - # 3カラム目、論理削除されるかどうか - csv_floating_data_lst = [ - ['001', '', '', 'A'], - ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)', 'B'], - ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療', 'B'], - ['004', '1', '顔面骨、頭蓋骨の観血的移動術', 'C'], - ['005', '', '造血器腫瘍のDNA診断', 'B'], - ['006', '1', '', 'B'] - ] - test_data_list = [ - f'"021","{data[0]}","{data[1]}","{data[3]}","20141113","20141114","{data[2]}","1","2014/11/21 22:53:44","VANLOAD",,,"2014/11/21 22:53:44"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_delete.csv')) # 一旦全データをDBから削除 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hamtec', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - - # テスト対象のデータをDBに登録 - db_floating_data_list = [ - ['001', '', ''], - ['002', '1', '電磁波温熱療法(放射線療法と併用しないもの)'], - ['003', '2', '微小銅線による脳血管性病変に対しての電気的凝固治療'], - ['004', '1', '顔面骨、頭蓋骨の観血的移動術'], - ['005', '', '造血器腫瘍のDNA診断'], - ['006', '1', ''] - ] - # モジュール名 - module_name = get_module_name(com_hamtec_mapper) - for row in db_floating_data_list: - code, div, name = row - # DBに登録するテストデータ - test_sql_data = [code, div, name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hamtec_before_delete.csv')) + for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_hamtec', - self.table_columns, - test_sql_data + test_data.keys(), + test_data.values() ) self.db.execute(insert_sql, insert_parameter) - # sut(system under test)作成 + # Act for i, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目: マッパークラスが期待通りか' - - # Act + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() - # Assert - # 期待値作成 - expect_data = csv_floating_data_lst[i - 1] - hamtec_div = expect_data[1] if expect_data[3] == 'B' else db_floating_data_list[i - 1][1] - hamtec_name = expect_data[2] if expect_data[3] == 'B' else db_floating_data_list[i - 1][2] - expect_row = [expect_data[0], hamtec_div, hamtec_name] + create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - update_ymd=expect_date_str if expect_data[3] == 'B' else None, # メンテナンス区分!=C 更新日が登録される - delete_ymd=expect_date_str if expect_data[3] == 'C' else None, # メンテナンス区分==C 削除日が登録される - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=datetime.now() if expect_data[3] != 'A' else expect_datetime, - update_prgm_id=module_name - ) - expect_rows = [{c: r for c, r in zip(self.table_columns, expect_row)}] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd = '{expect_data[0]}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - if expect_data[3] != 'A': - assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - else: - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hamtec_delete.csv')) + primary_keys = [f"'{primary_key['hamtec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hamtec WHERE hamtec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' From 45d74926c00e915c853d60308081d62f17f6161f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:43:56 +0900 Subject: [PATCH 051/962] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_hamtec_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index b77a4d7f..4cb71bbf 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_hamtec import ComHamtec class ComHamtecMapper(UltmarcTableMapper): - """COM_高度先進医療 登録処理""" + """レイアウト区分021: COM_高度先進医療 登録処理""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ From 6079dcc4ca8d1220f710a81caf4848e0bd8bb1ed Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:50:55 +0900 Subject: [PATCH 052/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py | 2 +- .../table_mapper/com_hamtec/test_com_hamtec_mapper.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 0d292f8e..8df75d27 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -15,7 +15,7 @@ from tests.testing_utility import (assert_table_results, class TestComAlmaMapper: - """COM_出身校""" + """レイアウト区分004: COM_出身校""" db: Database batch_config: BatchConfig diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py index 9e500212..bc4858dc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -15,8 +15,8 @@ from tests.testing_utility import (assert_table_results, create_ultmarc_test_data_from_csv) -class TestComAlmaMapper: - """COM_高度先進医療""" +class TestComHamtecMapper: + """レイアウト区分021: COM_高度先進医療""" db: Database batch_config: BatchConfig From 3464b1c185f3949865d7707726715ca5827d0156 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:53:11 +0900 Subject: [PATCH 053/962] =?UTF-8?q?docs:=20README=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index ecc58e03..26a1d78c 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -54,15 +54,15 @@ ├── README.md -- 当ファイル ├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル ├── src -- ソースコードの保管場所 -│ ├── aws -│ │ └── s3.py +│ ├── aws -- AWS関連処理 +│ │ └── s3.py -- S3クライアントとバケット処理 │ ├── batch -- バッチ処理関連ソース置き場 │ │ ├── batch_functions.py -- バッチ処理共通関数置き場 │ │ ├── datachange -- 実績洗替関連ソース置き場 │ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 │ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント │ │ └── ultmarc -- アルトマーク関連処理 -│ │ ├── dat_insert.py -- アルトマーク関連処理のエントリーポイント +│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント │ │ ├── datfile.py -- データファイル読込 │ │ └── utmp_tables -- アルトマークテーブルへの登録関連 │ │ ├── table_mapper -- テーブルへのデータマッピング処理 From 0bf21ed194b2f8c844643b4380281059bb4f638f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 01:53:35 +0900 Subject: [PATCH 054/962] =?UTF-8?q?docs:=20README=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index 26a1d78c..57ae474b 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -7,7 +7,7 @@ ## 環境情報 - Python 3.9 -- MySQL 8.x +- MySQL 8.23 - VSCode ## 環境構築 From 92b7343216e0710fe0110275c7253698f5697a42 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 02:17:21 +0900 Subject: [PATCH 055/962] =?UTF-8?q?feat:=20COM=5F=E5=87=BA=E8=BA=AB?= =?UTF-8?q?=E6=A0=A1=20=E6=9B=B4=E6=96=B0=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=81=AE=E5=B9=B3=E4=BB=84=E5=90=88=E3=82=8F=E3=81=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_alma/com_alma_update.csv | 1 + .../table_mapper/com_alma/expect_com_alma_update.csv | 3 ++- .../table_mapper/com_alma/test_com_alma_mapper.py | 5 ++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv index 368cb15d..5a00d768 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv @@ -4,3 +4,4 @@ "004","004","B","20141113","20141114",,"1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" "004","005","B","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" "004","006","B","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","007","A","20141113","20141114","神大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv index 1242b1d7..50811ab3 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv @@ -4,4 +4,5 @@ "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "004",,"20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "005","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" -"006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" \ No newline at end of file +"006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"007","神大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:35:27","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 8df75d27..6799b279 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -130,7 +130,10 @@ class TestComAlmaMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' def test_logical_delete(self): """ From 16b291d3a6f30d8b4412018eb8c352dd5d6ea4bc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 11:36:32 +0900 Subject: [PATCH 056/962] =?UTF-8?q?feat:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_alma/test_com_alma_mapper.py | 34 +++++++++++-------- .../com_hamtec/test_com_hamtec_mapper.py | 34 +++++++++++-------- .../tests/testing_utility.py | 30 +++++++--------- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 6799b279..4c3a1960 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -58,9 +58,9 @@ class TestComAlmaMapper: self.db.execute(delete_sql, delete_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -73,12 +73,14 @@ class TestComAlmaMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 + line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): """ @@ -111,9 +113,9 @@ class TestComAlmaMapper: self.db.execute(insert_sql, insert_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -125,15 +127,17 @@ class TestComAlmaMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 + line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: if expect_row[expect_col_name] is None: - assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_logical_delete(self): """ @@ -166,9 +170,9 @@ class TestComAlmaMapper: self.db.execute(insert_sql, insert_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_alma_mapper.ComAlmaMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_alma_mapper.ComAlmaMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -180,12 +184,14 @@ class TestComAlmaMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 + line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: if expect_row[expect_col_name] is None: - assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py index bc4858dc..703858ca 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -59,9 +59,9 @@ class TestComHamtecMapper: self.db.execute(delete_sql, delete_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -74,12 +74,14 @@ class TestComHamtecMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + line_number = 0 # 動的日付項目の個別確認 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): """ @@ -112,9 +114,9 @@ class TestComHamtecMapper: self.db.execute(insert_sql, insert_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -126,15 +128,17 @@ class TestComHamtecMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + line_number = 0 # 動的日付項目の個別確認 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: if expect_row[expect_col_name] is None: - assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_logical_delete(self): """ @@ -167,9 +171,9 @@ class TestComHamtecMapper: self.db.execute(insert_sql, insert_parameter) # Act - for i, line in enumerate(test_dat_file, start=1): + for line_number, line in enumerate(test_dat_file, start=1): sut: com_hamtec_mapper.ComHamtecMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{i}行目:マッパークラスが期通りか' + assert type(sut) is com_hamtec_mapper.ComHamtecMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -181,12 +185,14 @@ class TestComHamtecMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] - assert_table_results(actual_data_list, expect_data_list, line_number=i, ignore_col_name=ignore_columns) + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 + line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: if expect_row[expect_col_name] is None: - assert actual_row[actual_col_name] is None, f'{i}行目:{actual_col_name}が、登録されていないこと' + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値以降であること' + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index a321f343..335ddf35 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -55,10 +55,14 @@ def create_db_data_from_csv(file_path: str) -> list[dict]: converted_value = v if v == 'NULL': converted_value = None - if is_valid_date(v) is True: - converted_value = datetime.strptime(v, '%Y/%m/%d') - if is_valid_datetime(v) is True: + if is_valid_date_format(v, '%Y/%m/%d') is True: # YYYY/MM/DD + converted_value = datetime.strptime(v, '%Y/%m/%d').date() + if is_valid_date_format(v, '%Y-%m-%d') is True: # YYYY-MM-DD + converted_value = datetime.strptime(v, '%Y-%m-%d').date() + if is_valid_date_format(v, '%Y/%m/%d %H:%M:%S') is True: # YYYY/MM/DD HH:MM:SS converted_value = datetime.strptime(v, '%Y/%m/%d %H:%M:%S') + if is_valid_date_format(v, '%Y-%m-%d %H:%M:%S') is True: # YYYY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y-%m-%d %H:%M:%S') row[k] = converted_value @@ -210,12 +214,12 @@ def get_module_name(module: ModuleType) -> str: return module.__name__.split('.')[-1] -def is_valid_date(date_str: str, date_format='%Y/%m/%d'): +def is_valid_date_format(date_str: str, date_format): """日付文字列が、与えられたフォーマットにマッチするかを検査する Args: date_str (str): 日付文字列 - date_format (str, optional): 日付のフォーマット. Defaults to '%Y/%m/%d'. + date_format (str, optional): 日付のフォーマット Returns: _type_: 正しい日付文字列の場合、True、それ以外はFalse @@ -227,19 +231,7 @@ def is_valid_date(date_str: str, date_format='%Y/%m/%d'): return False -def is_valid_datetime(date_str: str): - """日付文字列が、YYYY/MM/DD HH:MM:SSとマッチするかを検査する - - Args: - date_str (str): 日付文字列 - - Returns: - _type_: 正しい日付文字列の場合、True、それ以外はFalse - """ - return is_valid_date(date_str, '%Y/%m/%d %H:%M:%S') - - -def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], line_number: int, ignore_col_name: list = None) -> None: +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_name: list = None) -> None: """テーブル同士の取得結果突き合わせ Args: @@ -250,7 +242,9 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], line_ assert len(actual_rows) == len(expect_rows) # 1カラムずつ調査 + line_number = 0 for actual_row, expect_row in zip(actual_rows, expect_rows): + line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): # テストメソッド側で個別に確認するものはスキップさせる if ignore_col_name is not None and actual_col_name in ignore_col_name: From ea9b52c21eccb4506b05f8992f24142d2d10c655 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 11:54:40 +0900 Subject: [PATCH 057/962] =?UTF-8?q?feat:=20COM=5F=E5=8C=BB=E5=B8=AB?= =?UTF-8?q?=E5=8B=A4=E5=8B=99=E5=85=88=E3=81=AE=E7=99=BB=E9=8C=B2=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E5=86=8D=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_wrkplace_mapper.py | 12 +- .../utmp_tables/tables/com_dr_wrkplace.py | 36 +- .../com_dr_wrkplace_insert.csv | 10 + .../db_com_blng_sec_before_insert.csv | 9 + .../expect_com_dr_wrkplace_insert.csv | 11 + .../test_com_dr_wrkplace_mapper.py | 343 ++++-------------- 6 files changed, 128 insertions(+), 293 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index 0e816f06..493eb8a4 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace class ComDrWrkplaceMapper(UltmarcTableMapper): - """COM_医師勤務先 登録処理""" + """レイアウト区分501-01:COM_医師勤務先 登録処理""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ @@ -171,11 +171,13 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): return # 必ず1件 com_blng_sec_record = com_blng_sec_records[0] - if com_blng_sec_record['blig_sec_kane'] != '' and com_blng_sec_record['blig_sec_kane'] is not None: - self.record.sectname_kana = com_blng_sec_record['blig_sec_kane'] + if com_blng_sec_record['blng_sec_kana'] != '' and com_blng_sec_record['blng_sec_kana'] is not None: + self.record.sectname_kana = com_blng_sec_record['blng_sec_kana'] + self.query_parameter['sectname_kana'] = com_blng_sec_record['blng_sec_kana'] - if com_blng_sec_record['blig_sec_name'] != '' and com_blng_sec_record['blig_sec_name'] is not None: - self.record.sectname = com_blng_sec_record['blig_sec_name'] + if com_blng_sec_record['blng_sec_name'] != '' and com_blng_sec_record['blng_sec_name'] is not None: + self.record.sectname = com_blng_sec_record['blng_sec_name'] + self.query_parameter['sectname'] = com_blng_sec_record['blng_sec_name'] def __make_queries(self): # レコードの存在確認 diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py index ec501438..9472206d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComDrWrkplace(UltmarcTable): - """COM_医師勤務先""" + """レイアウト区分501-01:COM_医師勤務先""" maint_flag: str # 修正区分 dcfdr_id: str # 個人コード(ID) dcfdr_code: str # 個人コード(個人コード) @@ -24,26 +24,26 @@ class ComDrWrkplace(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.maintflag = record[4] - self.dcfdr_id = record[1] - self.dcfdr_code = record[2] - self.dcfdr_yobi = record[3].strip() - self.hp_id = record[5] - self.hp_code = record[6] - self.hp_yobi = record[7].strip() - self.drretflag = record[8] - self.maintdate = record[9] - self.trndate = record[10] - self.postcode = record[11].strip() - self.identitycode = record[12].strip() + self.maintflag = record[4] + self.dcfdr_id = record[1] + self.dcfdr_code = record[2] + self.dcfdr_yobi = record[3].strip() + self.hp_id = record[5] + self.hp_code = record[6] + self.hp_yobi = record[7].strip() + self.drretflag = record[8] + self.maintdate = record[9] + self.trndate = record[10] + self.postcode = record[11].strip() + self.identitycode = record[12].strip() # 所属部科の集合項目 - self.sectcode = record[13].strip() - self.sectname = record[14].strip() + self.sectcode = record[13].strip() + self.sectname = record[14].strip() self.sectname_kana = record[15].strip() - - self.notdm_flg = record[16].strip() - + + self.notdm_flg = record[16].strip() + # ID、コード、予備を結合してフル桁コードに変換 self.full_dcfdr_code = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfdr_yobi]) self.full_hp_code = ''.join([self.hp_id, self.hp_code, self.hp_yobi]) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv new file mode 100644 index 00000000..c0abf3ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_insert.csv @@ -0,0 +1,10 @@ +"502","01","995783","","A","00","5414992","","2","20141113","20141114","501","","","","","" +"502","01","995783","","A","00","5507600","","2","20141113","20141114","133","144","9112","","","" +"502","01","997682","","A","00","5402984","","2","20141113","20141114","165","144","1512","","","" +"502","01","997682","","A","00","5408060","","2","20141113","20141114","","144","6802","","","" +"502","01","997682","","A","00","5412977","","2","20141113","20141114","","144","6720","","","" +"502","01","997906","","A","00","5409446","","2","20141113","20141114","501","","1118","","","" +"502","01","997906","","A","00","5503358","","2","20141113","20141114","172","144","1118","","","" +"502","01","997906","","A","00","5504428","","2","20141113","20141114","","144","7212","","","" +"502","01","997906","","A","00","5507600","","2","20141113","20141114","","144","9114","","","" +"502","01","999613","","A","00","5504428","","2","20141113","20141114","","144","5140","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv new file mode 100644 index 00000000..bb604b15 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_insert.csv @@ -0,0 +1,9 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1512","シヨウカキゲカ","消化器外科","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-16 22:18:28","clsComBlngSec" +"6802","シヨウカキゲカガク1","消化器外科学Ⅰ","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-30 22:18:48","clsComBlngSec" +"6720","シヨウカキゲカガク","消化器外科学","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2019-12-23 22:13:44","clsComBlngSec" +"1118","ケツエキナイカ","血液内科","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2016-05-17 00:13:18","clsComBlngSec" +"7212","ユケツ.サイボウチリヨウガク","輸血・細胞治療学","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2021-01-11 22:15:40","clsComBlngSec" +"5140","ヤクリガク","薬理学","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-22 22:23:47","clsComBlngSec" +"9112","ハツセイ.セイシヨクブモン","発生・生殖部門","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-01 22:23:53","clsComBlngSec" +"9114","サイボウイシヨクブモン","細胞移植部門","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2022-08-01 22:23:53","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv new file mode 100644 index 00000000..3f8923af --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_insert.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 14:54:00","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005507600","01995783","9112","133","144","2020-02-22","ハツセイ.セイシヨクブモン","発生・生殖部門",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005402984","01997682","1512","165","144","2020-02-22","シヨウカキゲカ","消化器外科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" +"005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:17","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index 12fe23a2..6616176f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -1,4 +1,5 @@ -from datetime import date, datetime +import os.path as path +from datetime import datetime import pytest @@ -7,12 +8,11 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ com_dr_wrkplace_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, create_delete_sql_with_parameter, create_insert_sql_with_parameter, - create_ultmarc_common_column_names, - create_ultmarc_common_column_values, create_ultmarc_table_mapper_sut, - create_ultmarc_test_csv, get_module_name) + create_ultmarc_test_data_from_csv) class TestComDrWrkplaceMapper: @@ -20,24 +20,26 @@ class TestComDrWrkplaceMapper: db: Database batch_config: BatchConfig - dr_wrkplace_table_columns = [ - "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", - "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"] \ - + create_ultmarc_common_column_names() - # 削除日カラムはないので消す - dr_wrkplace_table_columns.remove('delete_ymd') + test_file_path: str = path.dirname(__file__) + # dr_wrkplace_table_columns = [ + # "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", + # "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"] + # + create_ultmarc_common_column_names() + # # 削除日カラムはないので消す + # dr_wrkplace_table_columns.remove('delete_ymd') - dr_wrkplace_his_table_columns = [ - "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", - "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \ - + create_ultmarc_common_column_names() - # 削除日カラムはないので消す - dr_wrkplace_his_table_columns.remove('delete_ymd') + # dr_wrkplace_his_table_columns = [ + # "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", + # "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \ + # + create_ultmarc_common_column_names() + # # 削除日カラムはないので消す + # dr_wrkplace_his_table_columns.remove('delete_ymd') - @pytest.fixture(autouse=True, scope='function') + @ pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" self.batch_config = BatchConfig.get_instance() + # setup self.db = database self.db.connect() @@ -50,7 +52,7 @@ class TestComDrWrkplaceMapper: self.db.rollback() self.db.disconnect() - def test_insert_record(self, expect_datetime: datetime, expect_date_str: str): + def test_insert_record(self): """ Cases: COM_DCF医師勤務先テーブルにレコードを登録する @@ -65,24 +67,8 @@ class TestComDrWrkplaceMapper: # Arrange # 処理日設定 self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') - # テストデータ作成 - csv_floating_data_lst = [ - ['01', '995783', '00', '5414992', '2', '501', '', '', '', '', '1', 'A'], - ['01', '995783', '00', '5507600', '2', '133', '144', '9112', '', '', '', 'A'], - ['01', '997682', '00', '5402984', '2', '165', '144', '1512', '', '', '', 'A'], - ['01', '997682', '00', '5408060', '2', '', '144', '6802', '', '', '', 'A'], - ['01', '997682', '00', '5412977', '2', '', '144', '6720', '', '', '', 'A'], - ['01', '997906', '00', '5409446', '2', '501', '', '1118', '', '', '', 'A'], - ['01', '997906', '00', '5503358', '2', '172', '144', '1118', '', '', '', 'A'], - ['01', '997906', '00', '5504428', '2', '', '144', '7212', '', '', '', 'A'], - ['01', '997906', '00', '5507600', '2', '', '144', '9114', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'A'], - ['01', '999613', '00', '5504428', '2', '', '144', '5140', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'A'], - ] - test_data_list = [ - f'"502","{data[0]}","{data[1]}",,"{data[11]}","{data[2]}","{data[3]}",,"{data[4]}","20141113","20141114","{data[5]}","{data[6]}","{data[7]}","{data[8]}","{data[9]}","{data[10]}"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_insert.csv')) # 一旦全データをDBから削除 # COM_医師勤務先 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) @@ -90,252 +76,69 @@ class TestComDrWrkplaceMapper: # COM_医師勤務先履歴 delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - - # sut(system under test)作成 - for i, line in enumerate(test_dat_file, start=1): - sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{i}行目:マッパークラスが期通りか' - - # Act - sut.make_query() - sut.execute_queries() - - # Assert - # 期待値作成 - # 期待値となるモジュール名 - module_name = get_module_name(com_dr_wrkplace_mapper) - expect_data = csv_floating_data_lst[i - 1] - - expect_row = [ - f'{expect_data[2]}{expect_data[3]}', - f'{expect_data[0]}{expect_data[1]}', - expect_data[7], - expect_data[5], - expect_data[6], - datetime.date(expect_datetime), - expect_data[9], - expect_data[8], - expect_data[10] - ] - ultmarc_common_column_values = create_ultmarc_common_column_values( - regist_ymd=datetime.date(expect_datetime), - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - # 削除日カラムが存在しないので消す - ultmarc_common_column_values.pop(2) - expect_row += ultmarc_common_column_values - - expect_rows = [{c: r for c, r in zip(self.dr_wrkplace_table_columns, expect_row)}] - dcf_pcf_dr_cd = f'{expect_data[0]}{expect_data[1]}' - dcf_dcf_inst_cd = f'{expect_data[2]}{expect_data[3]}' - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") - - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] <= expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - - # 履歴テーブルの存在チェック - history_table = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace_his WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") - assert len(history_table) == 0, '履歴テーブルが作成されていないこと' - - def test_update_record(self, expect_datetime: datetime, expect_date_str: str): - """ - Cases: - COM_DCF医師勤務先テーブルのレコードを更新する - Arranges: - - CSVデータを用意する - - 追加対象となるレコードを削除する - Expects: - - COM_医師勤務先の登録内容が期待値と一致すること - - COM_医師勤務先履歴の登録内容が期待値と一致すること - """ - - # Arrange - # 処理日設定 - self.batch_config.syor_date = '2020/02/23' - # テストデータ作成 - csv_floating_data_lst = [ - ['01', '997906', '00', '5409446', '2', '', '', '', '', '', '@', 'B'], - ['01', '995783', '00', '5507600', '2', '@', '802', '@', '', '', '', 'B'], - ['01', '997682', '00', '5402984', '2', '165', '@', '', '', '', '', 'B'], - ['01', '999613', '00', '5504428', '2', '501', '', '9999', '内分泌・骨代謝外来', 'ナイブンピ.ホネタイシヤガイライ', '', 'B'], - ] - test_data_list = [ - f'"502","{data[0]}","{data[1]}",,"{data[11]}","{data[2]}","{data[3]}",,"{data[4]}","20141113","20141114","{data[5]}","{data[6]}","{data[7]}","{data[8]}","{data[9]}","{data[10]}"' - for data in csv_floating_data_lst - ] - test_dat_file = create_ultmarc_test_csv(test_data_list) - # 一旦全データをDBから削除 - # COM_医師勤務先 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) - self.db.execute(delete_sql, delete_parameter) - # COM_医師勤務先履歴 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) + # COM_所属部科 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) - db_floating_data_list = [ - ['005414992', '01995783', '', '501', '', '2020-02-22', '', '', ''], - ['005507600', '01995783', '9112', '133', '144', '2020-02-22', 'ハツセイ.セイシヨクブモン', '発生・生殖部門', '1'], - ['005402984', '01997682', '1512', '165', '144', '2020-02-22', 'シヨウカキゲカ', '消化器外科', ''], - ['005408060', '01997682', '6802', '', '144', '2020-02-22', 'シヨウカキゲカガク1', '消化器外科学Ⅰ', ''], - ['005412977', '01997682', '6720', '', '144', '2020-02-22', 'シヨウカキゲカガク', '消化器外科学', ''], - ['005409446', '01997906', '1118', '501', '', '2020-02-22', 'ケツエキナイカ', '血液内科', '1'], - ['005503358', '01997906', '1118', '172', '144', '2020-02-22', 'ケツエキナイカ', '血液内科', ''], - ['005504428', '01997906', '7212', '', '144', '2020-02-22', 'ユケツ.サイボウチリヨウガク', '輸血・細胞治療学', ''], - ['005507600', '01997906', '9114', '', '144', '2020-02-22', 'サイボウイシヨクブモン', '細胞移植部門', ''], - ['005504428', '01999613', '5140', '', '144', '2020-02-22', 'ヤクリガク', '薬理学', ''] - ] - # モジュール名 - module_name = get_module_name(com_dr_wrkplace_mapper) - # テスト対象のデータをDBに登録 - for row in db_floating_data_list: - (dcf_dsf_inst_cd, dcf_pcf_dr_cd, blng_sec_cd, post_cd, identity_cd, - aply_start_ymd, blng_sec_name_kana, blng_sec_name, not_db_flg) = row - # DBに登録するテストデータ - test_sql_data = [ - dcf_dsf_inst_cd, dcf_pcf_dr_cd, blng_sec_cd, post_cd, identity_cd, - aply_start_ymd, blng_sec_name_kana, blng_sec_name, not_db_flg - ] - common_ultmarc_values = create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - # 削除日カラムが存在しないので消す - common_ultmarc_values.pop(2) - test_sql_data += common_ultmarc_values + # COM_所属部科を登録 + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_insert.csv')) + for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( - 'src05.com_dr_wrkplace', - self.dr_wrkplace_table_columns, - test_sql_data + 'src05.com_blng_sec', + test_data.keys(), + test_data.values() ) self.db.execute(insert_sql, insert_parameter) - # 期待値データを先に作る - # 医師勤務先 - expect_dr_wrkplace_rows = [ - ['005414992', '01995783', '', '501', '', date(2020, 2, 22), '', '', ''], - ['005507600', '01995783', '9999', '', '802', date(2020, 2, 23), '', '', '1'], - ['005402984', '01997682', '1512', '165', '', date(2020, 2, 23), 'シヨウカキゲカ', '消化器外科', ''], - ['005408060', '01997682', '6802', '', '144', date(2020, 2, 22), 'シヨウカキゲカガク1', '消化器外科学Ⅰ', ''], - ['005412977', '01997682', '6720', '', '144', date(2020, 2, 22), 'シヨウカキゲカガク', '消化器外科学', ''], - ['005409446', '01997906', '1118', '501', '', date(2020, 2, 22), 'ケツエキナイカ', '血液内科', ''], - ['005503358', '01997906', '1118', '172', '144', date(2020, 2, 22), 'ケツエキナイカ', '血液内科', ''], - ['005504428', '01997906', '7212', '', '144', date(2020, 2, 22), 'ユケツ.サイボウチリヨウガク', '輸血・細胞治療学', ''], - ['005507600', '01997906', '9114', '', '144', date(2020, 2, 22), 'サイボウイシヨクブモン', '細胞移植部門', ''], - ['005504428', '01999613', '9999', '501', '144', date(2020, 2, 23), 'ナイブンピ.ホネタイシヤガイライ', '内分泌・骨代謝外来', ''] - ] - # 医師勤務先履歴 - # 更新されない行はNoneで埋める - expect_dr_wrkplace_his_rows = [ - None, - [1, '005507600', '01995783', '9112', '133', '144', '20200222', 'ハツセイ.セイシヨクブモン', '発生・生殖部門', '1', '20200222'], - [1, '005402984', '01997682', '1512', '165', '144', '20200222', 'シヨウカキゲカ', '消化器外科', '', '20200222'], - None, - None, - None, - None, - None, - None, - [1, '005504428', '01999613', '5140', '999', '144', '20200222', 'ヤクリガク', '薬理学', '', '20200222'] - ] - # 更新された行を示す(1=True, 0=False) - is_update_rows = [bool(flag) for flag in [0, 1, 1, 0, 0, 1, 0, 0, 0, 1]] - # 履歴が登録される行を示す(1=True, 0=False) - is_historical_rows = [bool(flag) for flag in [0, 1, 1, 0, 0, 0, 0, 0, 0, 1]] - # sut(system under test)作成 + # Act for line_number, line in enumerate(test_dat_file, start=1): sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか' - # Act + sut.make_query() sut.execute_queries() # Assert - # 期待値作成 - # 期待値となるモジュール名 - module_name = get_module_name(com_dr_wrkplace_mapper) - for i, expect_dr_wrkplace_row in enumerate(expect_dr_wrkplace_rows, start=1): - ultmarc_common_column_values = create_ultmarc_common_column_values( - regist_ymd=datetime.date(expect_datetime), - update_ymd=datetime.date(expect_datetime) if is_update_rows[i - 1] else None, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - # 削除日カラムが存在しないので消す - ultmarc_common_column_values.pop(2) - expect_dr_wrkplace_row += ultmarc_common_column_values + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + # 複合主キーのため、1件ずつ取得して期待値を作る + actual_dr_data_list = [] + actual_dr_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + actual_his_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace_his + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): + # COM_医師勤務先の取得 + actual_dr_data = self.db.execute_select( + actual_dr_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + assert len(actual_dr_data) == 1, '1件取得できていること' + actual_dr_data_list.append(actual_dr_data[0]) - expect_rows = [{c: r for c, r in zip(self.dr_wrkplace_table_columns, expect_dr_wrkplace_row)}] - dcf_dcf_inst_cd = expect_dr_wrkplace_row[0] - dcf_pcf_dr_cd = expect_dr_wrkplace_row[1] - actual_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") + # COM_医師勤務先履歴の取得 + # 取得できないこと + actual_his_data = self.db.execute_select( + actual_his_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + assert len(actual_his_data) == 0, '履歴が作成されていないこと' - # 期待値検査 - assert_table_results(actual_rows, expect_rows, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date']) - - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_rows, expect_rows): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - actual_value = actual_row[actual_col_name] - expect_value = expect_row[expect_col_name] - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - # 更新されている場合 - if is_update_rows[i - 1] is True: - assert actual_value <= expect_value, f'{i}行目:{actual_col_name}が、期待値の日時以前であること' - else: - assert actual_value == expect_value, f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - - # 履歴テーブルの存在チェック - actual_history_rows = self.db.execute_select(f"SELECT * FROM src05.com_dr_wrkplace_his WHERE dcf_dsf_inst_cd = '{dcf_dcf_inst_cd}' AND dcf_pcf_dr_cd = '{dcf_pcf_dr_cd}'") - # 履歴作成対象かどうか - if is_historical_rows[i - 1] is False: - assert len(actual_history_rows) == 0, '履歴テーブルが作成されていないこと' - else: - # 件数確認 - assert len(actual_history_rows) == 1, '履歴テーブルが作成されていること' - - # 期待値作成 - expect_history_row = expect_dr_wrkplace_his_rows[i - 1] - # アルトマーク共通カラムを追加 - ultmarc_common_column_values = create_ultmarc_common_column_values( - regist_ymd=expect_date_str, - sys_regist_date=expect_datetime, - regist_prgm_id=module_name, - sys_update_date=expect_datetime, - update_prgm_id=module_name - ) - # 削除日カラムが存在しないので消す - ultmarc_common_column_values.pop(2) - # アルトマーク共通カラムを追加(事前に宣言されているものを流用する) - expect_history_row += ultmarc_common_column_values - # ヘッダーを追加 - expect_history_rows_with_column = [{c: r for c, r in zip(self.dr_wrkplace_his_table_columns, expect_history_row)}] - - assert_table_results(actual_history_rows, expect_history_rows_with_column, line_number=i, ignore_col_name=['sys_update_date', 'sys_regist_date', 'dr_wrkplace_his_key']) - - # 動的日付項目の個別確認 - for actual_row, expect_row in zip(actual_history_rows, expect_history_rows_with_column): - for actual_col_name, expect_col_name in zip(actual_row, expect_row): - actual_value = actual_row[actual_col_name] - expect_value = expect_row[expect_col_name] - if actual_col_name == 'dr_wrkplace_his_key': - assert actual_value >= expect_value, f'{i}行目:{actual_col_name}が、期待値の連番以上以前であること' - if actual_col_name == 'sys_regist_date': - assert actual_row[actual_col_name] == expect_row[expect_col_name], f'{i}行目:{actual_col_name}が、期待値の日時と一致すること' - if actual_col_name == 'sys_update_date': - assert actual_value <= expect_value, f'{i}行目:{actual_col_name}が、期待値の日時以前であること' + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] + assert_table_results(actual_dr_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_dr_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date', 'aply_start_ymd']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 284f36f801bcaf7e06b37b010dcf2fc4c896ef93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Apr 2023 13:36:42 +0900 Subject: [PATCH 058/962] =?UTF-8?q?feat:=20=E6=B4=97=E6=9B=BF=E7=94=A8?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90=E3=81=AE=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/inst_merge_t_create.sql | 48 ++++++++++++++ .../v_inst_merge_t_create.sql | 65 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 rds_mysql/stored_procedure/inst_merge_t_create.sql create mode 100644 rds_mysql/stored_procedure/v_inst_merge_t_create.sql diff --git a/rds_mysql/stored_procedure/inst_merge_t_create.sql b/rds_mysql/stored_procedure/inst_merge_t_create.sql new file mode 100644 index 00000000..4f7e1b44 --- /dev/null +++ b/rds_mysql/stored_procedure/inst_merge_t_create.sql @@ -0,0 +1,48 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.inst_merge_t_create() +SQL SECURITY INVOKER +BEGIN + -- 例外処理 + -- エラーが発生した場合に一時テーブルの削除を実施 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + START TRANSACTION; + + TRUNCATE TABLE internal05.inst_merge_t; + + 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 + di.dcf_inst_cd, + di.dcf_inst_cd_new, + ci.form_inst_name_kanji, + ci.form_inst_name_kana, + ci.inst_addr, + ci.prefc_cd + FROM + dcf_inst_merge di + LEFT OUTER JOIN com_inst ci + ON di.dcf_inst_cd_new = ci.dcf_dsf_inst_cd + WHERE + ci.delete_flg = '0' + AND STR_TO_DATE(di.tekiyo_month, '%Y%m') <= (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM hdke_tbl) + AND di.muko_flg = '0' + AND di.enabled_flg = 'Y'; + + COMMIT; +END diff --git a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql new file mode 100644 index 00000000..bbc05090 --- /dev/null +++ b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql @@ -0,0 +1,65 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.v_inst_merge_t_create() +SQL SECURITY INVOKER +BEGIN + -- 例外処理 + -- エラーが発生した場合に一時テーブルの削除を実施 + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + + SET @error_state = NULL, @error_msg = NULL; + START TRANSACTION; + + TRUNCATE TABLE internal05.v_inst_merge_t; + + INSERT INTO + internal05.v_inst_merge_t ( + v_inst_cd, + v_inst_cd_merge, + fcl_name, + fcl_kn_name, + fmt_addr, + prft_cd + ) + SELECT + vv.v_inst_cd, + vv.v_inst_cd_merg, + fv.fcl_name, + fv.fcl_kn_name, + fv.fmt_addr, + fv.prft_cd + FROM + src05.vop_hco_merge_v vv, + src05.fcl_mst_v fv + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) fmv1 + ON fv.v_inst_cd = fmv1.v_inst_cd + AND fv.sub_num = fmv1.sno + WHERE + vv.v_inst_cd_merg = fv.v_inst_cd + AND STR_TO_DATE(vv.apply_dt, '%Y-%m-%d') <= ( + SELECT + STR_TO_DATE(syor_date, '%Y%m%d') + FROM + src05.hdke_tbl + ) + AND ((fcl_type IN ('A1','A0')) OR fcl_type BETWEEN '20' AND '29') + AND fv.rec_sts_kbn != '9' + ORDER BY + STR_TO_DATE(vv.apply_dt, '%Y-%m-%d') ASC; + + COMMIT; +END From fce03581c461d3c4817cfecabef9bb0bc91b54b9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 17:42:41 +0900 Subject: [PATCH 059/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/testing_utility.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 335ddf35..3410d1f5 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -241,10 +241,11 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor # 取得件数が一致すること assert len(actual_rows) == len(expect_rows) - # 1カラムずつ調査 line_number = 0 + # 1行ずつ調査 for actual_row, expect_row in zip(actual_rows, expect_rows): line_number += 1 + # 1カラムずつ調査 for actual_col_name, expect_col_name in zip(actual_row, expect_row): # テストメソッド側で個別に確認するものはスキップさせる if ignore_col_name is not None and actual_col_name in ignore_col_name: From b4eaff61a25c658d8b4118e0e112eeea71955b7d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 17:44:55 +0900 Subject: [PATCH 060/962] =?UTF-8?q?feat:=20=E6=8E=A8=E5=A5=A8=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.vscode/recommended_settings.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json index fd8ebd3c..ccac091c 100644 --- a/ecs/jskult-batch-daily/.vscode/recommended_settings.json +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -12,17 +12,16 @@ "python.linting.enabled": true, "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": true, - "python.linting.flake8Args": ["--max-line-length=120"], + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], "python.formatting.provider": "autopep8", "python.formatting.autopep8Path": "autopep8", "python.formatting.autopep8Args": [ "--max-line-length", "200", "--ignore=F541" ], - "flake8.args": [ - "--max-line-length", "200", - "--ignore=F541" - ], "python.testing.pytestArgs": [ "tests" ], From 38cef62739c6d58972e26411467082c692800e35 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 19:41:15 +0900 Subject: [PATCH 061/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py | 4 ++-- .../table_mapper/com_hamtec/test_com_hamtec_mapper.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 4c3a1960..238f8a3d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -88,7 +88,7 @@ class TestComAlmaMapper: COM_出身校テーブルのレコードを更新する Arranges: - CSVデータを用意し、読み込む - - 追加対象となるレコードを登録する + - 更新対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること """ @@ -145,7 +145,7 @@ class TestComAlmaMapper: COM_出身校テーブルのレコードを1件論理削除する Arranges: - CSVデータを用意し、読み込む - - 追加対象となるレコードを登録する + - 削除対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること """ diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py index 703858ca..08c773f9 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -89,7 +89,7 @@ class TestComHamtecMapper: COM_高度先進医療テーブルのレコードを更新する Arranges: - CSVデータを用意し、読み込む - - 追加対象となるレコードを登録する + - 更新対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること """ @@ -146,7 +146,7 @@ class TestComHamtecMapper: COM_高度先進医療テーブルのレコードを1件論理削除する Arranges: - CSVデータを用意し、読み込む - - 追加対象となるレコードを登録する + - 削除対象となるレコードを登録する Expects: - 登録内容が期待値と一致すること """ From 58e3b7a25fd246624d9b952047d5ea0bd835dd26 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 20:10:54 +0900 Subject: [PATCH 062/962] =?UTF-8?q?feat:=20COM=5F=E5=8C=BB=E5=B8=AB?= =?UTF-8?q?=E5=8B=A4=E5=8B=99=E5=85=88=E3=81=AE=E6=9B=B4=E6=96=B0=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_wrkplace_mapper.py | 6 +- .../com_dr_wrkplace_update.csv | 4 + .../db_com_dr_wrkplace_before_update.csv | 11 ++ .../expect_com_dr_wrkplace_his_update.csv | 4 + .../expect_com_dr_wrkplace_update.csv | 11 ++ .../test_com_dr_wrkplace_mapper.py | 128 ++++++++++++++++-- 6 files changed, 147 insertions(+), 17 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index 493eb8a4..8b9253a2 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -206,7 +206,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): if self.record.notdm_flg != '': notdm_flg = None if self.record.notdm_flg == '@' else self.record.notdm_flg self.query_parameter['notdm_flg'] = notdm_flg - set_clause_without_historical.append(f'notdm_flg = {"NULL" if notdm_flg is None else ":notdm_flg"}') + set_clause_without_historical.append(f'notdm_flg = :notdm_flg') # 何かしら更新がある場合、履歴作成クエリを作成 if len(set_clauses_with_historical) != 0: make_history_query = self.TO_HISTORY_QUERY @@ -242,12 +242,12 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): # 所属部科(カナ) sectname_kana = None if self.record.sectname_kana == '@' else self.record.sectname_kana self.query_parameter['sectname_kana'] = sectname_kana - set_clauses.append(f'blng_sec_name_kana = {"NULL" if sectname_kana is None else ":sectname_kana"}') + set_clauses.append(f'blng_sec_name_kana = :sectname_kana') # 所属部科(漢字) # 全角文字なので、修正項目として全角@が連携されるパターンがある sectname = None if self.record.sectname == '@' else self.record.sectname self.query_parameter['sectname'] = sectname - set_clauses.append(f'blng_sec_name = {"NULL" if sectname is None else ":sectname"}') + set_clauses.append(f'blng_sec_name = :sectname') # 何かしら更新がある場合、適用開始日をセットする if len(set_clauses) != 0: diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv new file mode 100644 index 00000000..20b3f41a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv @@ -0,0 +1,4 @@ +"502","01","997906","","B","00","5409446","","","20170906","20170910","","","","","","@" +"502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","","","" +"502","01","997682","","B","00","5402984","","","20141113","20141114","165","@","","","","" +"502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ","" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv new file mode 100644 index 00000000..f0da440a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01995783","9112","133","144","2020-02-22","ハツセイ.セイシヨクブモン","発生・生殖部門","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005402984","01997682","1512","165","144","2020-02-22","シヨウカキゲカ","消化器外科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv new file mode 100644 index 00000000..cc43df9e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_update.csv @@ -0,0 +1,4 @@ +"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門","1","20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"2","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"3","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv new file mode 100644 index 00000000..80a8c3d5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01995783","9999",,"802","2020-02-23",,,"1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index 6616176f..ead14d62 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -21,19 +21,6 @@ class TestComDrWrkplaceMapper: db: Database batch_config: BatchConfig test_file_path: str = path.dirname(__file__) - # dr_wrkplace_table_columns = [ - # "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", - # "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"] - # + create_ultmarc_common_column_names() - # # 削除日カラムはないので消す - # dr_wrkplace_table_columns.remove('delete_ymd') - - # dr_wrkplace_his_table_columns = [ - # "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd", - # "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \ - # + create_ultmarc_common_column_names() - # # 削除日カラムはないので消す - # dr_wrkplace_his_table_columns.remove('delete_ymd') @ pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): @@ -140,5 +127,118 @@ class TestComDrWrkplaceMapper: for actual_row, expect_row in zip(actual_dr_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date', 'aply_start_ymd']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_DCF医師勤務先テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - COM_医師勤務先の登録内容が期待値と一致すること + - COM_医師勤務先履歴にデータが登録されないこと + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_update.csv')) + # 一旦全データをDBから削除 + # COM_医師勤務先 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_医師勤務先履歴 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_所属部科 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # COM_医師勤務先を登録 + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_wrkplace', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_update.csv')) + expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list] + # 複合主キーのため、1件ずつ取得して期待値を作る + actual_dr_data_list = [] + actual_his_data_list = [] + actual_dr_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + actual_his_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace_his + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): + # COM_医師勤務先の取得 + actual_dr_data = self.db.execute_select( + actual_dr_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + assert len(actual_dr_data) == 1, '1件取得できていること' + actual_dr_data_list.append(actual_dr_data[0]) + + # COM_医師勤務先履歴の取得 + # 取得できないこと + actual_his_data = self.db.execute_select( + actual_his_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + if len(actual_his_data) != 0: + actual_his_data_list.append(actual_his_data[0]) + + assert len(actual_his_data_list) == len(expect_his_data_list), '履歴が期待値通りの件数作成されていること' + # 期待値検査 + # COM_医師勤務先 + dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] + assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in dr_ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # COM_医師勤務先履歴 + his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'aply_end_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] + assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in his_ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 766bf45ab5c18b837d5658b6c0116b99146bf761 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 20:47:05 +0900 Subject: [PATCH 063/962] =?UTF-8?q?feat:=20COM=5F=E5=8C=BB=E5=B8=AB?= =?UTF-8?q?=E5=8B=A4=E5=8B=99=E5=85=88=20=E5=89=8A=E9=99=A4=E3=83=AC?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_dr_wrkplace_delete.csv | 5 + .../db_com_dr_wrkplace_before_delete.csv | 11 ++ .../db_com_dr_wrkplace_his_before_delete.csv | 4 + .../expect_com_dr_wrkplace_delete.csv | 6 + .../expect_com_dr_wrkplace_his_delete.csv | 9 + .../test_com_dr_wrkplace_mapper.py | 160 ++++++++++++++++-- 6 files changed, 182 insertions(+), 13 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv new file mode 100644 index 00000000..aca2be04 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv @@ -0,0 +1,5 @@ +"502","01","997682","","B","00","5408060","","1","20141204","20141206","","","","","","" +"502","01","997906","","B","00","5409446","","1","20141128","20141206","","","","","","" +"502","01","997682","","B","00","5412977","","1","20141204","20141206","","","","","","" +"502","01","995783","","B","00","5414992","","1","20141204","20141206","","","","","","" +"502","01","997906","","B","00","5503358","","1","20141202","20141206","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv new file mode 100644 index 00000000..d2432eb9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_delete.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv new file mode 100644 index 00000000..c0621a43 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_his_before_delete.csv @@ -0,0 +1,4 @@ +"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv new file mode 100644 index 00000000..4f5049a2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_delete.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv new file mode 100644 index 00000000..a4471434 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_his_delete.csv @@ -0,0 +1,9 @@ +"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"1482023","005408060","01997682","6802","999","144","20200222","シヨウカキゲカガク1","消化器外科学Ⅰ",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper" +"1482024","005409446","01997906","1118","501","999","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper" +"1482025","005412977","01997682","6720","999","144","20200222","シヨウカキゲカガク","消化器外科学",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper" +"1482026","005414992","01995783","9999","501","999","20200222",,,,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper" +"1482027","005503358","01997906","1118","172","144","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index ead14d62..df5c0bcf 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -1,5 +1,4 @@ import os.path as path -from datetime import datetime import pytest @@ -53,7 +52,8 @@ class TestComDrWrkplaceMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # 適用開始日と同値になる + self.batch_config.syor_date = '2020/02/22' # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_insert.csv')) # 一旦全データをDBから削除 @@ -87,9 +87,9 @@ class TestComDrWrkplaceMapper: # Assert # 期待値ファイルを読み込む - expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv')) - primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] - primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list] # 複合主キーのため、1件ずつ取得して期待値を作る actual_dr_data_list = [] actual_dr_select_sql = """\ @@ -119,12 +119,14 @@ class TestComDrWrkplaceMapper: {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) assert len(actual_his_data) == 0, '履歴が作成されていないこと' + assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること' + # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] - assert_table_results(actual_dr_data_list, expect_data_list, ignore_col_name=ignore_columns) + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 - for actual_row, expect_row in zip(actual_dr_data_list, expect_data_list): + for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: @@ -139,12 +141,13 @@ class TestComDrWrkplaceMapper: - 更新対象となるレコードを登録する Expects: - COM_医師勤務先の登録内容が期待値と一致すること - - COM_医師勤務先履歴にデータが登録されないこと + - COM_医師勤務先履歴にデータが登録され、期待値と一致すること """ # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # 適用開始日と同値、適用終了日の+1日になる + self.batch_config.syor_date = '2020/02/23' # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_update.csv')) # 一旦全データをDBから削除 @@ -213,10 +216,12 @@ class TestComDrWrkplaceMapper: if len(actual_his_data) != 0: actual_his_data_list.append(actual_his_data[0]) - assert len(actual_his_data_list) == len(expect_his_data_list), '履歴が期待値通りの件数作成されていること' + assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること' + assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること' + # 期待値検査 # COM_医師勤務先 - dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] + dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -230,7 +235,136 @@ class TestComDrWrkplaceMapper: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # COM_医師勤務先履歴 - his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'aply_end_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd'] + his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in his_ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_delete_record(self): + """ + Cases: + COM_DCF医師勤務先テーブルのレコードを削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - COM_医師勤務先の登録内容が期待値と一致すること + - COM_医師勤務先履歴にデータが登録されないこと + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = '2020/02/24' + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_delete.csv')) + # 一旦全データをDBから削除 + # COM_医師勤務先 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_医師勤務先履歴 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # COM_所属部科 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # COM_医師勤務先を登録 + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_wrkplace', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # COM_医師勤務先履歴を登録 + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_his_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_wrkplace_his', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_delete.csv')) + expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_delete.csv')) + # 複合主キーのため、1件ずつ取得して期待値を作る + actual_dr_data_list = [] + actual_his_data_list = [] + actual_dr_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + actual_his_select_sql = """\ + SELECT * FROM src05.com_dr_wrkplace_his + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # COM_医師勤務先の取得 + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list] + for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): + actual_dr_data = self.db.execute_select( + actual_dr_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + assert len(actual_dr_data) == 1, '1件取得できていること' + actual_dr_data_list.append(actual_dr_data[0]) + + # COM_医師勤務先履歴の取得 + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list] + for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): + # COM_医師勤務先履歴の取得 + actual_his_data = self.db.execute_select( + actual_his_select_sql, + {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) + assert len(actual_his_data) == 1, '1件取得できていること' + actual_his_data_list.append(actual_his_data[0]) + + assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること' + assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること' + + # 期待値検査 + # COM_医師勤務先 + dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in dr_ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # COM_医師勤務先履歴 + his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns) # 動的日付項目の個別確認 line_number = 0 From 8612b7af118c67a86a32dc0fe8ec9f61decac9e2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 21:14:08 +0900 Subject: [PATCH 064/962] =?UTF-8?q?feat:=20COM=5F=E5=8C=BB=E5=B8=AB?= =?UTF-8?q?=E5=8B=A4=E5=8B=99=E5=85=88=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83=E3=82=B8=E3=82=92100%?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_dr_wrkplace_delete.csv | 10 +++---- .../com_dr_wrkplace_update.csv | 3 ++- .../db_com_blng_sec_before_delete.csv | 6 +++++ .../expect_com_dr_wrkplace_update.csv | 4 +-- .../test_com_dr_wrkplace_mapper.py | 26 ++++++++++++++----- 5 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv index aca2be04..d23ec8cc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_delete.csv @@ -1,5 +1,5 @@ -"502","01","997682","","B","00","5408060","","1","20141204","20141206","","","","","","" -"502","01","997906","","B","00","5409446","","1","20141128","20141206","","","","","","" -"502","01","997682","","B","00","5412977","","1","20141204","20141206","","","","","","" -"502","01","995783","","B","00","5414992","","1","20141204","20141206","","","","","","" -"502","01","997906","","B","00","5503358","","1","20141202","20141206","","","","","","" +"502","01","997682","","B","00","5408060","","1","20141204","20141206","","","1512","","","" +"502","01","997906","","B","00","5409446","","1","20141128","20141206","","","6802","","","" +"502","01","997682","","B","00","5412977","","1","20141204","20141206","","","6720","","","" +"502","01","995783","","B","00","5414992","","1","20141204","20141206","","","1118","","","" +"502","01","997906","","B","00","5503358","","1","20141202","20141206","","","7212","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv index 20b3f41a..73c4c336 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv @@ -1,4 +1,5 @@ "502","01","997906","","B","00","5409446","","","20170906","20170910","","","","","","@" -"502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","","","" +"502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","@","@","" +"502","01","997682","","A","00","5408060","","","20141113","20141114","","","","","","" "502","01","997682","","B","00","5402984","","","20141113","20141114","165","@","","","","" "502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ","" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv new file mode 100644 index 00000000..d37f092e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_blng_sec_before_delete.csv @@ -0,0 +1,6 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1512",,NULL,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-16 22:18:28","clsComBlngSec" +"6802","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-30 22:18:48","clsComBlngSec" +"6720",,"NULL","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2019-12-23 22:13:44","clsComBlngSec" +"1118","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2016-05-17 00:13:18","clsComBlngSec" +"7212",,"NULL","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2021-01-11 22:15:40","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv index 80a8c3d5..1cee6ac3 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -1,8 +1,8 @@ "dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" -"005507600","01995783","9999",,"802","2020-02-23",,,"1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" "005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" "005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" "005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index df5c0bcf..f838dabf 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -183,8 +183,6 @@ class TestComDrWrkplaceMapper: # 期待値ファイルを読み込む expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_update.csv')) expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_update.csv')) - primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list] - primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list] # 複合主キーのため、1件ずつ取得して期待値を作る actual_dr_data_list = [] actual_his_data_list = [] @@ -200,21 +198,25 @@ class TestComDrWrkplaceMapper: dcf_dsf_inst_cd = :dcf_dsf_inst_cd AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd """ + # COM_医師勤務先の取得 + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list] for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): - # COM_医師勤務先の取得 actual_dr_data = self.db.execute_select( actual_dr_select_sql, {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) assert len(actual_dr_data) == 1, '1件取得できていること' actual_dr_data_list.append(actual_dr_data[0]) - # COM_医師勤務先履歴の取得 - # 取得できないこと + # COM_医師勤務先履歴の取得 + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list] + for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd): actual_his_data = self.db.execute_select( actual_his_select_sql, {**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd}) - if len(actual_his_data) != 0: - actual_his_data_list.append(actual_his_data[0]) + assert len(actual_dr_data) == 1, '1件取得できていること' + actual_his_data_list.append(actual_his_data[0]) assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること' assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること' @@ -296,6 +298,16 @@ class TestComDrWrkplaceMapper: ) self.db.execute(insert_sql, insert_parameter) + # COM_所属部科を登録 + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_blng_sec', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # Act for line_number, line in enumerate(test_dat_file, start=1): sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db) From 9aa585c7d98cf1f8630e4dbb2a6b785ba5250858 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 21:18:08 +0900 Subject: [PATCH 065/962] =?UTF-8?q?feat:=20=E3=83=86=E3=83=BC=E3=83=96?= =?UTF-8?q?=E3=83=AB=E3=83=9E=E3=83=83=E3=83=94=E3=83=B3=E3=82=B0=E3=81=AB?= =?UTF-8?q?=E5=90=88=E3=82=8F=E3=81=AA=E3=81=84=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82=E5=AE=9F=E9=9A=9B=E3=81=AB?= =?UTF-8?q?=E3=81=AF=E4=BD=BF=E3=81=A3=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E7=84=A1=E5=AE=B3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_alma/com_alma_delete.csv | 14 +++++++------- .../table_mapper/com_alma/com_alma_insert.csv | 12 ++++++------ .../table_mapper/com_alma/com_alma_update.csv | 14 +++++++------- .../table_mapper/com_hamtec/com_hamtec_delete.csv | 14 +++++++------- .../table_mapper/com_hamtec/com_hamtec_insert.csv | 12 ++++++------ .../table_mapper/com_hamtec/com_hamtec_update.csv | 12 ++++++------ 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv index dac5bd09..a437f7df 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_delete.csv @@ -1,7 +1,7 @@ -"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","004","A","20141113","20141114","","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","006","C","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" -"004","007","A","20141113","20141114","群馬大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53" \ No newline at end of file +"004","001","A","20141113","20141114","北大" +"004","002","A","20141113","20141114","札幌医" +"004","003","A","20141113","20141114","弘大" +"004","004","A","20141113","20141114", +"004","005","A","20141113","20141114","東北大" +"004","006","C","20141113","20141114","福島医" +"004","007","A","20141113","20141114","群馬大" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv index c01c5605..4f37bb30 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_insert.csv @@ -1,6 +1,6 @@ -"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","004","A","20141113","20141114","岩手医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","006","A","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","001","A","20141113","20141114","北大" +"004","002","A","20141113","20141114","札幌医" +"004","003","A","20141113","20141114","弘大" +"004","004","A","20141113","20141114","岩手医" +"004","005","A","20141113","20141114","東北大" +"004","006","A","20141113","20141114","福島医" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv index 5a00d768..0599c239 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/com_alma_update.csv @@ -1,7 +1,7 @@ -"004","001","B","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","002","B","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","003","B","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","004","B","20141113","20141114",,"1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","005","B","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","006","B","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" -"004","007","A","20141113","20141114","神大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53" +"004","001","B","20141113","20141114","北大" +"004","002","B","20141113","20141114","札幌医" +"004","003","B","20141113","20141114","弘大" +"004","004","B","20141113","20141114", +"004","005","B","20141113","20141114","福島医" +"004","006","B","20141113","20141114","東北大" +"004","007","A","20141113","20141114","神大" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv index 97b59772..7cbc586b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv @@ -1,7 +1,7 @@ -"021","001","","A","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","007","2","A","20141113","20141114","重症肥満の外科治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","001",,"A","20141113","20141114", +"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)" +"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療" +"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術" +"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)" +"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断" +"021","007","2","A","20141113","20141114","重症肥満の外科治療法" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv index d1b3a3f9..31e575d3 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_insert.csv @@ -1,6 +1,6 @@ -"021","001","2","A","20141113","20141114","直流電流による骨電気治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","001","2","A","20141113","20141114","直流電流による骨電気治療法" +"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)" +"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療" +"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術" +"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断" +"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv index d9c1bc94..43b1e27c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv @@ -1,6 +1,6 @@ -"021","001","","B","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" -"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44" +"021","001",,"B","20141113","20141114", +"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)" +"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療" +"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術" +"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)" +"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断" \ No newline at end of file From 370aea3fa2a281867f76b239a62c739f5fa8c8bd Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 22:01:12 +0900 Subject: [PATCH 066/962] =?UTF-8?q?refactor:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E9=96=A2=E9=80=A3=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E9=96=A2=E6=95=B0=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E5=87=BA=E5=8A=9B=E3=81=AF=E5=88=A5?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=81=AB=E3=81=99=E3=82=8B=E4=BA=88=E5=AE=9A?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/ultmarc_process.py | 7 ++++--- ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 569b6a09..6bec75fc 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -14,9 +14,10 @@ logger = get_logger('アルトマークデータ保管') ultmarc_bucket = UltmarcBucket() -def batch_process(): +def import_process(): + """アルトマーク取り込み処理""" try: - logger.info('datInsert START') + logger.info('ultmarc import process START') # DBセットアップ db = Database.get_instance() db.connect() @@ -77,7 +78,7 @@ def batch_process(): # すべての行を登録終えたらコミットする db.commit() logger.info('Transaction COMMIT') - logger.info(f'datInsert RESULT') + logger.info(f'ultmarc import process RESULT') logger.info(f'SUCCESS_COUNT={dat_file.success_count}') logger.info(f'ERROR_COUNT={dat_file.error_count}') logger.info(f'ALL_COUNT={dat_file.total_count}') diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 6ac64fdf..9bd83bc2 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -73,7 +73,7 @@ def batch_process(): logger.info('日次処理(アルトマーク)実行対象日でない為未実行') try: logger.info('アルトマーク取込:起動') - ultmarc_process.batch_process() + ultmarc_process.import_process() logger.info('アルトマーク取込:終了') except BatchOperationException as e: logger.error(f'アルトマーク取込処理エラー(異常終了){e}') From 9c88fd6b0d3cfb4c3618abe975c2c9554e3fc306 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 22:01:54 +0900 Subject: [PATCH 067/962] =?UTF-8?q?feat:=20README=E3=81=AB=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E9=96=A2=E9=80=A3=E3=81=AE=E8=A8=98=E8=BF=B0?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82=20README=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E3=81=AB=E4=BC=B4=E3=81=84=E3=80=81=E4=BD=BF=E7=94=A8=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=9F=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=80=81=E3=83=95=E3=82=A3=E3=82=AF=E3=82=B9=E3=83=81=E3=83=A3?= =?UTF-8?q?=E3=82=92=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 220 ++++++++++++++---- ecs/jskult-batch-daily/tests/conftest.py | 14 -- .../tests/testing_utility.py | 88 +------ 3 files changed, 175 insertions(+), 147 deletions(-) diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index 57ae474b..46d1c3b6 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -12,79 +12,207 @@ ## 環境構築 -- Pythonの構築 - - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 - - 「Pipenvの導入」までを行っておくこと - - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する - - `pipenv install --dev --python ` - - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく +- Python の構築 -- MySQLの環境構築 - - Windowsの場合、以下のリンクからダウンロードする + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする - - - Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利 + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると - `docker-compose up -d` - - Dockerの構築手順は、[Dockerのセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと - データを投入する - 立ち上げたデータベースに「src05」スキーマを作成する - - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysqlコマンドを使用して復元する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` - 環境変数の設定 - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する - - 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください -- VSCodeの設定 + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する - - 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する ## 実行 -- VSCode上で「F5」キーを押下すると、バッチ処理が起動する。 +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 - 「entrypoint.py」が、バッチ処理のエントリーポイント。 - 実際の処理は、「src/jobctrl_daily.py」で行っている。 +## 単体テスト + +アルトマーク取込処理は、単体テストコードを使用してテスト自動化を行う + +### テスト準備 + +- VSCodeで以下の拡張機能をインストールする + - Python + - Python Test Explorer for Visual Studio Code + - Test Explorer UI +- VSCode 上でショートカット「ctrl」+「shift」+「P」でコマンドパレットを開く +- コマンドパレットの検索窓に「Python」と入力し、「Python: テストを構成する」を押下する +- 現在のワークスペースを選び、「pytest」を選択する +- 「tests」フォルダを選択する +- バックグランドで、pytest モジュールのインストールが始まれば成功 + +### テスト用のサブコマンド一覧 + +- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる + - `Pipfile`内の「scripts」セクションに宣言する + +| コマンド | 概要 | +| ---------------- | -------------------------------------------------------------------------------------------- | +| test:ultmarc | tests/batch/ultmarc フォルダ配下のユニットテストを実行する | +| test:ultmarc:csv | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) | + +### テスト共通関数の仕様 + +- tests/testing_utility.py内の共通関数の仕様について記載する + +#### create_ultmarc_test_data_from_csv + +- 引数 + - file_path: str +- 戻り値 + - src.batch.ultmarc.datfile.DatFileのインスタンス +- 処理概要 + - CSVファイルから、アルトマークのインプットデータを作成する + - データフォーマットは以下 + - 文字コード: UTF-8 + - 改行コード:LF + - ヘッダ: なし + - 値囲い: ダブルクォート + - アルトマークデータと文字コードを合わせるため、指定されたファイルを一時ディレクトリに、文字コード「cp932」で書き出してからテストデータとして読み込む + - テストデータそのものはUTF-8の文字コードで作成すること + +### create_db_data_from_csv + +- 引数 + - file_path: str +- 戻り値 + - テーブルのレコードに相当する辞書のリスト +- 処理概要 + - CSVファイルから、アルトマークテーブルに相当するテストデータを作成する + - テストの初期データ、期待値データを作成するのに利用する + - データフォーマットは以下 + - 文字コード: UTF-8 + - 改行コード:LF + - ヘッダ: なし + - 値囲い: ダブルクォート + - ファイル内の、以下の形式のデータを自動的に変換する + - `NULL` + - `None`に変換される + - `yyyy-mm-dd`もしくは、`yyyy/mm/dd`の文字 + - Date型に変換される + - `yyyy-mm-dd hh:mm:ss`もしくは、`yyyy/mm/dd hh:mm:ss`の文字 + - DateTime型に変換される + +### create_insert_sql_with_parameter + +- 引数 + - table_name: str テーブル名 + - column_names: list[str] カラム名のリスト + - test_data: list[str]: 値のリスト +- 戻り値 + - INSERT文とバインドパラメータ辞書 +- 処理概要 + - 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でINSERT文、バインドパラメータを作成する + +### create_delete_sql_with_parameter + +- 引数 + - table_name: str テーブル名 + - column_names: list[str] カラム名のリスト + - test_data: list[str]: 値のリスト +- 戻り値 + - DELETE文とバインドパラメータ辞書 +- 処理概要 + - 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でDELETE文、バインドパラメータを作成する + +### create_ultmarc_table_mapper_sut + +- 引数 + - line: src.batch.ultmarc.datfile.DatFileLine アルトマークデータファイルの1行 + - db: src.db.Database データベース操作クラス +- 戻り値 + - マッパークラス +- 処理概要 + - src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory.UltmarcTableMapperFactoryを通じて、テスト対象のマッパークラスを生成して返す + +### assert_table_results + +- 引数 + - actual_rows: list[dict] テスト結果の辞書リスト + - expect_rows: list[dict] 期待値の辞書リスト + - ignore_col_name: list 比較を無視するDBのカラム名. Default None. +- 戻り値 + - なし +- 処理概要 + - テスト結果データと期待値データを突き合わせ、期待値どおりとなっているかを確認する + - ignore_col_nameに指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする + ## フォルダ構成 ```text . -├── Pipfile -- Pythonモジュールの依存関係を管理するファイル -├── Dockerfile -- Dockerイメージを作成するためのファイル -├── Pipfile -- Pythonモジュールの依存関係を管理するファイル -├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル -├── README.md -- 当ファイル -├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル -├── src -- ソースコードの保管場所 -│ ├── aws -- AWS関連処理 -│ │ └── s3.py -- S3クライアントとバケット処理 -│ ├── batch -- バッチ処理関連ソース置き場 -│ │ ├── batch_functions.py -- バッチ処理共通関数置き場 -│ │ ├── datachange -- 実績洗替関連ソース置き場 -│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 -│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント -│ │ └── ultmarc -- アルトマーク関連処理 -│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント -│ │ ├── datfile.py -- データファイル読込 -│ │ └── utmp_tables -- アルトマークテーブルへの登録関連 -│ │ ├── table_mapper -- テーブルへのデータマッピング処理 -│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分) +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Dockerfile -- Dockerイメージを作成するためのファイル +├── Pipfile -- Pythonモジュールの依存関係を管理するファイル +├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル +├── README.md -- 当ファイル +├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル +├── src -- ソースコードの保管場所 +│ ├── aws -- AWS関連処理 +│ │ └── s3.py -- S3クライアントとバケット処理 +│ ├── batch -- バッチ処理関連ソース置き場 +│ │ ├── batch_functions.py -- バッチ処理共通関数置き場 +│ │ ├── datachange -- 実績洗替関連ソース置き場 +│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替 +│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント +│ │ └── ultmarc -- アルトマーク関連処理 +│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント +│ │ ├── datfile.py -- データファイル読込 +│ │ └── utmp_tables -- アルトマークテーブルへの登録関連 +│ │ ├── table_mapper -- テーブルへのデータマッピング処理 +│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分) │ │ │ │ ├── com_alma_mapper.py │ │ │ │ ├── ... -│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス -│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス -│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分) +│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス +│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス +│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分) │ │ │ ├── com_alma.py │ │ │ ├── ... -│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス -│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス +│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス +│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス │ ├── db -│ │ └── database.py -- データベース操作共通処理 +│ │ └── database.py -- データベース操作共通処理 │ ├── error -│ │ └── exceptions.py -- カスタム例外 -│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 +│ │ └── exceptions.py -- カスタム例外 +│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。 │ ├── logging -│ │ └── get_logger.py -- ログ出力の共通処理 +│ │ └── get_logger.py -- ログ出力の共通処理 │ ├── system_var -│ │ └── environment.py -- 環境変数 +│ │ └── environment.py -- 環境変数 │ └── time -│ └── elapsed_time.py -- 実行時間計測用 +│ └── elapsed_time.py -- 実行時間計測用 +└── tests -- ユニットテストのルートディレクト + ├── batch + │ └── ultmarc -- アルトマーク関連のユニットテストを格納する + │ └── utmp_tables + │ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る + │ └── com_alma + │ ├── test_com_alma_mapper.py -- テストコード本体 + │ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。 + │ ... + │ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。 + │ ... + │ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。 + │ ... + ├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ) + └── testing_utility.py -- テストの共通関数 ``` diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py index 0a6ce31c..a03a8638 100644 --- a/ecs/jskult-batch-daily/tests/conftest.py +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -1,7 +1,5 @@ """共通テストフィクスチャ""" -from datetime import datetime - import pytest from src.db.database import Database @@ -11,15 +9,3 @@ from src.db.database import Database def database() -> Database: """データベース接続モジュールを作成""" return Database.get_instance() - - -@pytest.fixture -def expect_datetime() -> datetime: - """テスト実行年月日時分秒を生成""" - return datetime.now().replace(microsecond=0) - - -@pytest.fixture -def expect_date_str(expect_datetime: datetime) -> str: - """テスト実行年月日の文字8桁を生成""" - return expect_datetime.strftime('%Y%m%d') diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index 3410d1f5..d11aa163 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,9 +1,7 @@ """テスト用共通処理関数""" import csv -import io import tempfile from datetime import datetime -from types import ModuleType from src.batch.ultmarc.datfile import DatFile, DatFileLine from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ @@ -69,44 +67,6 @@ def create_db_data_from_csv(file_path: str) -> list[dict]: return rows -def create_ultmarc_test_csv(csv_rows: list[str]) -> DatFile: - """アルトマーク取込テストのCSVを作成 - Args: - csv_rows (tuple[str]): CSV文字列のリスト - Returns: - list[list[str]]: CSVデータ - """ - string_io = io.StringIO() - for csv_row in csv_rows: - string_io.write(csv_row) - string_io.write('\n') - string_io.seek(0) - dat_file = DatFile(string_io) - - return dat_file - - -def create_ultmarc_common_column_names() -> list[str]: - """アルトマークテーブル共通のカラム名を作成 - Returns: - list[str]: 共通カラム名 - """ - - return [ - 'regist_ymd', - 'update_ymd', - 'delete_ymd', - 'regist_date', - 'create_user', - 'update_date', - 'update_user', - 'sys_regist_date', - 'regist_prgm_id', - 'sys_update_date', - 'update_prgm_id' - ] - - def create_insert_sql_with_parameter(table_name: str, column_names: list[str], test_data: list[str]) -> tuple[str, dict]: """INSERT文と登録値のパラメータを返す @@ -144,41 +104,6 @@ def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str return delete_sql, delete_parameter -def create_ultmarc_common_column_values(**kwargs) -> list: - """アルトマークテーブル共通のカラムを作成 - - Args: - kwargs 有効なキー一覧 - regist_ymd (str): 登録年月日 - update_ymd (str): 更新年月日 - delete_ymd (str): 削除年月日 - regist_date (datetime): 登録日時 - create_user (str): 登録者 - update_date (datetime): 更新日時 - update_user (str): 更新者 - sys_regist_date (datetime): システム登録日時 - regist_prgm_id (str): 登録プログラムid - sys_update_date (datetime): システム更新日時 - update_prgm_id (str): 更新プログラムid - Returns: - list: 共通カラム値 - """ - - return [ - kwargs.get('regist_ymd'), # 登録年月日(regist_ymd) - kwargs.get('update_ymd'), # 更新年月日(update_ymd) - kwargs.get('delete_ymd'), # 削除年月日(delete_ymd) - kwargs.get('regist_date'), # 登録日時(regist_date) - kwargs.get('create_user'), # 登録者(create_user) - kwargs.get('update_date'), # 更新日時(update_date) - kwargs.get('update_user'), # 更新者(update_user) - kwargs.get('sys_regist_date'), # システム登録日時(sys_regist_date) - kwargs.get('regist_prgm_id'), # 登録プログラムid(regist_prgm_id) - kwargs.get('sys_update_date'), # システム更新日時(sys_update_date) - kwargs.get('update_prgm_id') # 更新プログラムid(update_prgm_id) - ] - - def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcTableMapper: """アルトマークテーブルマッパーのインスタンスを返す @@ -202,18 +127,6 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT return sut -def get_module_name(module: ModuleType) -> str: - """登録プログラムID、更新プログラムIDに登録するモジュール名を作成 - - Args: - module (ModuleType): pythonモジュール - - Returns: - str: モジュール名 - """ - return module.__name__.split('.')[-1] - - def is_valid_date_format(date_str: str, date_format): """日付文字列が、与えられたフォーマットにマッチするかを検査する @@ -237,6 +150,7 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor Args: actual_rows (list[dict]): テスト結果の辞書リスト expect_rows (list[dict]): 期待値の辞書リスト + ignore_col_name (list): 比較を無視するDBのカラム名. Default None. """ # 取得件数が一致すること assert len(actual_rows) == len(expect_rows) From 8efd302566a19aca59f20331393110566a483e82 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Apr 2023 22:03:38 +0900 Subject: [PATCH 068/962] =?UTF-8?q?style:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88=E3=83=AA=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.vscode/recommended_settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/.vscode/recommended_settings.json b/ecs/jskult-batch-daily/.vscode/recommended_settings.json index ccac091c..b5e79d73 100644 --- a/ecs/jskult-batch-daily/.vscode/recommended_settings.json +++ b/ecs/jskult-batch-daily/.vscode/recommended_settings.json @@ -23,7 +23,7 @@ "--ignore=F541" ], "python.testing.pytestArgs": [ - "tests" + "tests/batch/ultmarc" ], "python.testing.unittestEnabled": false, From 0b0dcb4aeeb5fbdfb2164ef39c0799194e846488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Apr 2023 09:27:38 +0900 Subject: [PATCH 069/962] test --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index a086a250..42724da9 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -19,7 +19,7 @@ COM_TABLE_LIST = { # COM_施設 "101": {"00": com_inst_mapper.ComInstMapper}, # COM_薬局 - "102": {"03": null_mapper.NullMapper}, + #"102": {"03": null_mapper.NullMapper}, # COM_医師勤務先 "502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper}, # COM_専門分野 From 4eb85763bf8b17edc81580dfcc79a8f1271c96c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Apr 2023 09:30:26 +0900 Subject: [PATCH 070/962] test2 --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 42724da9..a086a250 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -19,7 +19,7 @@ COM_TABLE_LIST = { # COM_施設 "101": {"00": com_inst_mapper.ComInstMapper}, # COM_薬局 - #"102": {"03": null_mapper.NullMapper}, + "102": {"03": null_mapper.NullMapper}, # COM_医師勤務先 "502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper}, # COM_専門分野 From 989c894f603bbca6df7cfe308428b15f7cf03f49 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 12 Apr 2023 09:30:40 +0900 Subject: [PATCH 071/962] =?UTF-8?q?style:=20=E3=83=89=E3=82=AD=E3=83=A5?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/datfile.py | 10 ++++++++ .../src/batch/ultmarc/ultmarc_process.py | 16 +++++-------- .../table_mapper/ultmarc_table_mapper.py | 2 ++ .../utmp_tables/tables/ultmarc_table.py | 5 ++-- .../ultmarc_table_mapper_factory.py | 23 ++++++++++++++++--- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py index a934a468..0c8ac150 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -14,6 +14,8 @@ class DatFileLine: class DatFile: + """アルトマークデータファイル""" + lines: list[DatFileLine] success_count: int = 0 error_count: int = 0 @@ -45,6 +47,14 @@ class DatFile: @classmethod def from_path(cls, local_file_path: str): + """アルトマークデータファイルを読み込み、新しいインスタンスを作成する + + Args: + local_file_path (str): ローカルのファイルパス + + Returns: + DatFile: このクラスのインスタンス + """ # cp932(Shift-JIS Windows拡張)でファイルを読み込む file = open(local_file_path, encoding='cp932') instance = cls(file) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 6bec75fc..88a40a8e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -7,7 +7,6 @@ from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database -from src.error.exceptions import DBException from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') @@ -28,18 +27,18 @@ def import_process(): dat_file_list = ultmarc_bucket.list_edi_file() # ファイルがない場合は処理せず、正常終了とする if len(dat_file_list) == 0: - logger.info('ファイルがないため、処理をスキップします') + logger.info('ファイルがないため、アルトマーク取込処理をスキップします') return # ファイルが複数ある場合はエラーとする if len(dat_file_list) > 1: - logger.error('複数の取込ファイルがあるため、異常終了') + logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') return # ファイルの件数は必ず1件になる dat_file_info = dat_file_list[0] # 0Byteの場合、 if dat_file_info['size'] == 0: - logger.info('0Byteファイルのため、処理をスキップします') + logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}') return dat_file_name = dat_file_info['filename'] logger.info(f"Get File Name :{dat_file_name}") @@ -53,7 +52,7 @@ def import_process(): mapper_factory = UltmarcTableMapperFactory() dat_file = DatFile.from_path(local_file_path) # datファイルを1行ずつ処理し、各テーブルへ登録 - for log_count, line in enumerate(dat_file): + for line in dat_file: try: # 書き込み先のテーブルを特定 mapper_class = mapper_factory.create( @@ -65,11 +64,7 @@ def import_process(): mapper_class.make_query() mapper_class.execute_queries() dat_file.count_up_success() - # 5000件ごとにログ記録 - # これいる?? - if log_count % 5000 == 0: - logger.info(f'Count: {log_count}') - except DBException as e: + except Exception as e: logger.warning(e) record = line.records log_message = ','.join([f'"{r}"' for r in record]) @@ -77,6 +72,7 @@ def import_process(): dat_file.count_up_error() # すべての行を登録終えたらコミットする db.commit() + # 処理結果をログに出力する logger.info('Transaction COMMIT') logger.info(f'ultmarc import process RESULT') logger.info(f'SUCCESS_COUNT={dat_file.success_count}') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py index 0a19be2a..5a62d171 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -10,6 +10,8 @@ batch_config = BatchConfig.get_instance() class UltmarcTableMapper(metaclass=ABCMeta): + """アルトマークテーブルへの登録処理の抽象クラス""" + record: UltmarcTable db: Database queries: list[str] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py index a251d690..ebbbc39d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/ultmarc_table.py @@ -1,8 +1,9 @@ class UltmarcTable: - + """アルトマーク関連テーブルの抽象クラス""" record: list + def __init__(self, record: list): self.record = record - + def to_sql_parameter(self): return vars(self) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index a086a250..4424e11b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -86,12 +86,26 @@ COM_TABLE_LIST = { class UltmarcTableMapperFactory: def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper: - # レイアウト種別とレコードIDから、マッピング先のテーブルを特定 + """レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する + + Args: + layout_class (str): レイアウト区分 + record_id (str): レコードID + records (list[str]): アルトマークデータの1行 + db (Database): データベース操作クラス + + Raises: + Exception: レイアウトを特定できない場合 + + Returns: + UltmarcTableMapper: マッパークラス + """ + # レイアウト区分から、マッピング先のテーブルを特定 table_by_layout_class = COM_TABLE_LIST.get(layout_class) - # レイアウト種別が特定できない場合はエラーとする + # レイアウト区分が特定できない場合はエラーとする if table_by_layout_class is None: - raise Exception('特定できませんでした') + raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}, レコードID={record_id}') mapper_class: UltmarcTableMapper = None if type(table_by_layout_class) is dict: @@ -99,4 +113,7 @@ class UltmarcTableMapperFactory: elif issubclass(table_by_layout_class, UltmarcTableMapper): mapper_class = table_by_layout_class + if mapper_class is None: + raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}, レコードID={record_id}') + return mapper_class(records, db) From 54c411b3c3fee0c042b2c2d98ceaec956d499b2d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 12 Apr 2023 14:29:26 +0900 Subject: [PATCH 072/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=8F=8D=E6=98=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/README.md | 4 +- .../src/batch/ultmarc/datfile.py | 2 - .../src/batch/ultmarc/ultmarc_process.py | 3 +- .../ultmarc_table_mapper_factory.py | 46 +++++++------------ ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- .../tests/testing_utility.py | 2 - 6 files changed, 21 insertions(+), 38 deletions(-) diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index 46d1c3b6..d0f37149 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -63,12 +63,12 @@ ### テスト用のサブコマンド一覧 - `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる - - `Pipfile`内の「scripts」セクションに宣言する + - `Pipfile`内の「scripts」セクションに宣言されている | コマンド | 概要 | | ---------------- | -------------------------------------------------------------------------------------------- | | test:ultmarc | tests/batch/ultmarc フォルダ配下のユニットテストを実行する | -| test:ultmarc:csv | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) | +| test:ultmarc:cov | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) | ### テスト共通関数の仕様 diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py index 0c8ac150..2631eaff 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/datfile.py @@ -4,12 +4,10 @@ from io import TextIOWrapper class DatFileLine: layout_class: str - record_id: str records: list[str] def __init__(self, dat_line: list[str]) -> None: self.layout_class = dat_line[0] - self.record_id = dat_line[1] self.records = dat_line diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 88a40a8e..f4d8fafe 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -13,7 +13,7 @@ logger = get_logger('アルトマークデータ保管') ultmarc_bucket = UltmarcBucket() -def import_process(): +def exec_import(): """アルトマーク取り込み処理""" try: logger.info('ultmarc import process START') @@ -57,7 +57,6 @@ def import_process(): # 書き込み先のテーブルを特定 mapper_class = mapper_factory.create( line.layout_class, - line.record_id, line.records, db ) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 4424e11b..ebea9e55 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -9,33 +9,32 @@ from src.db.database import Database COM_TABLE_LIST = { # レコードID固定 # COM_医師学会 - "521": {"01": null_mapper.NullMapper}, + # TODO: 入れ子にしない + "521": null_mapper.NullMapper, # COM_施設属性 - "111": {"00": null_mapper.NullMapper}, + "111": null_mapper.NullMapper, # COM_臨床研修病院 - "112": {"00": null_mapper.NullMapper}, + "112": null_mapper.NullMapper, # COM_医師 - "501": {"01": null_mapper.NullMapper}, + "501": null_mapper.NullMapper, # COM_施設 - "101": {"00": com_inst_mapper.ComInstMapper}, + "101": com_inst_mapper.ComInstMapper, # COM_薬局 - "102": {"03": null_mapper.NullMapper}, + "102": null_mapper.NullMapper, # COM_医師勤務先 - "502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper}, + "502": com_dr_wrkplace_mapper.ComDrWrkplaceMapper, # COM_専門分野 - "511": {"01": null_mapper.NullMapper}, + "511": null_mapper.NullMapper, # COM_都道府県医療機能情報(基本) - "132": {"00": null_mapper.NullMapper}, + "132": null_mapper.NullMapper, # COM_都道府県医療機能情報(施設設備) - "133": {"00": null_mapper.NullMapper}, + "133": null_mapper.NullMapper, # COM_都道府県医療機能情報(疾患治療) - "134": {"00": null_mapper.NullMapper}, + "134": null_mapper.NullMapper, # COM_都道府県医療機能情報(短期滞在手術) - "135": {"00": null_mapper.NullMapper}, + "135": null_mapper.NullMapper, # COM_都道府県医療機能情報(専門外来) - "136": {"00": null_mapper.NullMapper}, - - # レコードID浮動 + "136": null_mapper.NullMapper, # COM_診療科目 "001": null_mapper.NullMapper, # COM_病院種別 @@ -85,12 +84,11 @@ COM_TABLE_LIST = { class UltmarcTableMapperFactory: - def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper: + def create(self, layout_class: str, records: list[str], db: Database) -> UltmarcTableMapper: """レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する Args: layout_class (str): レイアウト区分 - record_id (str): レコードID records (list[str]): アルトマークデータの1行 db (Database): データベース操作クラス @@ -101,19 +99,9 @@ class UltmarcTableMapperFactory: UltmarcTableMapper: マッパークラス """ # レイアウト区分から、マッピング先のテーブルを特定 - table_by_layout_class = COM_TABLE_LIST.get(layout_class) - + mapper_class = COM_TABLE_LIST.get(layout_class) # レイアウト区分が特定できない場合はエラーとする - if table_by_layout_class is None: - raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}, レコードID={record_id}') - - mapper_class: UltmarcTableMapper = None - if type(table_by_layout_class) is dict: - mapper_class = table_by_layout_class.get(record_id) - elif issubclass(table_by_layout_class, UltmarcTableMapper): - mapper_class = table_by_layout_class - if mapper_class is None: - raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}, レコードID={record_id}') + raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}') return mapper_class(records, db) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 9bd83bc2..f91437b5 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -73,7 +73,7 @@ def batch_process(): logger.info('日次処理(アルトマーク)実行対象日でない為未実行') try: logger.info('アルトマーク取込:起動') - ultmarc_process.import_process() + ultmarc_process.exec_import() logger.info('アルトマーク取込:終了') except BatchOperationException as e: logger.error(f'アルトマーク取込処理エラー(異常終了){e}') diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index d11aa163..e95da8e7 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -115,11 +115,9 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT UltmarcTableMapper: マッパークラス """ layout_class = line.layout_class - record_id = line.record_id factory = UltmarcTableMapperFactory() sut = factory.create( layout_class=layout_class, - record_id=record_id, records=line.records, db=db ) From 26c4170643e723f9b8ed68a833ab43d185e4a9d8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 12 Apr 2023 15:14:05 +0900 Subject: [PATCH 073/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=80=82=E5=8F=96?= =?UTF-8?q?=E3=82=8A=E8=BE=BC=E3=81=BF=E5=BE=8C=E3=81=AE=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E5=89=8A=E9=99=A4=E3=82=82=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 6 +- ecs/jskult-batch-daily/.vscode/launch.json | 2 +- ecs/jskult-batch-daily/src/aws/s3.py | 54 +++++----- .../src/batch/ultmarc/ultmarc_process.py | 102 ++++++++++-------- .../src/system_var/environment.py | 10 +- 5 files changed, 102 insertions(+), 72 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index d1f4ddf4..91ae5f74 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -3,4 +3,8 @@ DB_PORT=************ DB_USERNAME=************ DB_PASSWORD=************ DB_SCHEMA=src05 -LOG_LEVEL=INFO \ No newline at end of file +LOG_LEVEL=INFO +ULTMARC_DATA_BUCKET=**************** +ULTMARC_DATA_FOLDER=recv +ULTMARC_BACKUP_BUCKET=**************** +ULTMARC_BACKUP_FOLDER=ultmarc diff --git a/ecs/jskult-batch-daily/.vscode/launch.json b/ecs/jskult-batch-daily/.vscode/launch.json index 2df4d8bf..9dbaa9c6 100644 --- a/ecs/jskult-batch-daily/.vscode/launch.json +++ b/ecs/jskult-batch-daily/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "name": "Batch Sample", + "name": "(DEBUG)jskult batch daily", "type": "python", "request": "launch", "program": "entrypoint.py", diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index ef3e2b36..43460f8d 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -3,6 +3,8 @@ import tempfile import boto3 +from src.system_var import environment + class S3Client: __s3_client = boto3.client('s3') @@ -16,13 +18,12 @@ class S3Client: # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')] return objects - + def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None: copy_source = {'Bucket': src_bucket, 'Key': src_key} self.__s3_client.copy(copy_source, dest_bucket, dest_key) return - def download_file(self, bucket_name: str, file_key: str, file): self.__s3_client.download_fileobj( Bucket=bucket_name, @@ -31,50 +32,53 @@ class S3Client: ) return - def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): self.__s3_client.upload_file( - local_file_path, - Bucket=bucket_name, - Key=file_key - ) + local_file_path, + Bucket=bucket_name, + Key=file_key + ) + + def delete_file(self, bucket_name: str, file_key: str): + self.__s3_client.delete_object( + Bucket=bucket_name, + Key=file_key + ) class S3Bucket(): _s3_client = S3Client() _bucket_name: str = None - def __str__(self) -> str: - return self._bucket_name class UltmarcBucket(S3Bucket): - # TODO: 環境変数にする - _bucket_name = 'mbj-newdwh2021-staging-jskult-ultmarc' - _folder = 'recv' + _bucket_name = environment.ULTMARC_DATA_BUCKET + _folder = environment.ULTMARC_DATA_FOLDER - def list_edi_file(self): + def list_dat_file(self): return self._s3_client.list_objects(self._bucket_name, self._folder) - - def download_edi_file(self, edi_filename: str): + + def download_dat_file(self, dat_filename: str): # 一時ファイルとして保存する temporary_dir = tempfile.mkdtemp() - temporary_file_path = path.join(temporary_dir, f'{edi_filename.replace("recv/", "")}') + temporary_file_path = path.join(temporary_dir, f'{dat_filename.replace(f"{self._folder}/", "")}') with open(temporary_file_path, mode='wb') as f: - self._s3_client.download_file(self._bucket_name, edi_filename, f) + self._s3_client.download_file(self._bucket_name, dat_filename, f) f.seek(0) return temporary_file_path - - def backup_edi_file(self, edi_file_key: str, datetime_key: str): + + def backup_dat_file(self, dat_file_key: str, datetime_key: str): ultmarc_backup_bucket = UltmarcBackupBucket() - backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{edi_file_key.replace(f"{self._folder}/", "")}' - self._s3_client.copy(str(self), edi_file_key, str(ultmarc_backup_bucket), backup_key) + backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key) + + def delete_dat_file(self, dat_file_key: str): + self._s3_client.delete_file(self._bucket_name, dat_file_key) class JskUltBackupBucket(S3Bucket): - # TODO: 環境変数にする - _bucket_name = 'mbj-newdwh2021-staging-jskult-backup' + _bucket_name = environment.ULTMARC_BACKUP_BUCKET class UltmarcBackupBucket(JskUltBackupBucket): - # TODO: 環境変数にする - _folder = 'ultmarc' + _folder = environment.ULTMARC_BACKUP_FOLDER diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index f4d8fafe..42bc6af6 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -1,8 +1,7 @@ """アルトマークデータ保管""" -from datetime import datetime - from src.aws.s3 import UltmarcBucket +from src.batch.common.batch_config import BatchConfig from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory @@ -11,20 +10,16 @@ from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') ultmarc_bucket = UltmarcBucket() +batch_config = BatchConfig.get_instance() def exec_import(): """アルトマーク取り込み処理""" try: - logger.info('ultmarc import process START') - # DBセットアップ - db = Database.get_instance() - db.connect() - # ファイル単位でトランザクションを行う - db.begin() - logger.info('Transaction BEGIN') + logger.info('アルトマーク取込処理: 開始') # datファイルをS3から取得する - dat_file_list = ultmarc_bucket.list_edi_file() + dat_file_list = ultmarc_bucket.list_dat_file() + # ファイルがない場合は処理せず、正常終了とする if len(dat_file_list) == 0: logger.info('ファイルがないため、アルトマーク取込処理をスキップします') @@ -34,52 +29,71 @@ def exec_import(): if len(dat_file_list) > 1: logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') return + # ファイルの件数は必ず1件になる dat_file_info = dat_file_list[0] # 0Byteの場合、 if dat_file_info['size'] == 0: logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}') return + dat_file_name = dat_file_info['filename'] - logger.info(f"Get File Name :{dat_file_name}") - now = datetime.now().strftime('%Y/%m/%d') + logger.info(f"{dat_file_name}を取り込みます") # ファイルをバックアップ # 現行は、jobctrl_dailyの先頭でやっている - ultmarc_bucket.backup_edi_file(dat_file_name, now) + ultmarc_bucket.backup_dat_file(dat_file_name, batch_config.syor_date) # datファイルをダウンロード - local_file_path = ultmarc_bucket.download_edi_file(dat_file_name) - - mapper_factory = UltmarcTableMapperFactory() + local_file_path = ultmarc_bucket.download_dat_file(dat_file_name) dat_file = DatFile.from_path(local_file_path) - # datファイルを1行ずつ処理し、各テーブルへ登録 - for line in dat_file: - try: - # 書き込み先のテーブルを特定 - mapper_class = mapper_factory.create( - line.layout_class, - line.records, - db - ) - mapper_class.make_query() - mapper_class.execute_queries() - dat_file.count_up_success() - except Exception as e: - logger.warning(e) - record = line.records - log_message = ','.join([f'"{r}"' for r in record]) - logger.warning(log_message) - dat_file.count_up_error() - # すべての行を登録終えたらコミットする - db.commit() - # 処理結果をログに出力する - logger.info('Transaction COMMIT') - logger.info(f'ultmarc import process RESULT') - logger.info(f'SUCCESS_COUNT={dat_file.success_count}') - logger.info(f'ERROR_COUNT={dat_file.error_count}') - logger.info(f'ALL_COUNT={dat_file.total_count}') + # アルトマーク取り込み実行 + _import_to_ultmarc_table(dat_file) + # 処理後、ファイルをS3から削除する + logger.info(f'取り込み処理が完了したため、datファイルを削除。ファイル名={dat_file_name}') + ultmarc_bucket.delete_dat_file(dat_file_name) except Exception as e: logger.exception(e) raise e finally: - db.disconnect() - logger.info('終了') + logger.info('アルトマーク取込処理: 終了') + + +def _import_to_ultmarc_table(dat_file: DatFile): + db = Database.get_instance() + # DB接続 + db.connect() + # ファイル単位でトランザクションを行う + db.begin() + logger.info('Transaction BEGIN') + mapper_factory = UltmarcTableMapperFactory() + # datファイルを1行ずつ処理し、各テーブルへ登録 + for line in dat_file: + try: + # 書き込み先のテーブルを特定 + mapper_class = mapper_factory.create( + line.layout_class, + line.records, + db + ) + mapper_class.make_query() + mapper_class.execute_queries() + dat_file.count_up_success() + except Exception as e: + logger.warning(e) + record = line.records + log_message = ','.join([f'"{r}"' for r in record]) + logger.warning(f'ERROR_LINE: {log_message}') + dat_file.count_up_error() + # すべての行を登録終えたらコミットする + db.commit() + db.disconnect() + # 処理結果をログに出力する + logger.info('Transaction COMMIT') + logger.info(f'ultmarc import process RESULT') + logger.info(f'SUCCESS_COUNT={dat_file.success_count}') + logger.info(f'ERROR_COUNT={dat_file.error_count}') + logger.info(f'ALL_COUNT={dat_file.total_count}') + + # 1件でもエラーがあれば、通知用にログに出力する + if dat_file.error_count > 0: + logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。') + return diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 143d2d26..e7248191 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -1,12 +1,20 @@ import os +# Database DB_HOST = os.environ['DB_HOST'] DB_PORT = int(os.environ['DB_PORT']) DB_USERNAME = os.environ['DB_USERNAME'] DB_PASSWORD = os.environ['DB_PASSWORD'] DB_SCHEMA = os.environ['DB_SCHEMA'] -LOG_LEVEL = os.environ['LOG_LEVEL'] +# AWS +ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] +ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] +ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET'] +ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) From 4e97b0b38e89bd7b42b4b4e22a2abca363e71f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 12 Apr 2023 15:15:15 +0900 Subject: [PATCH 074/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/inst_merge_t_create.sql | 21 +++++----- .../v_inst_merge_t_create.sql | 38 ++++++++----------- 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/rds_mysql/stored_procedure/inst_merge_t_create.sql b/rds_mysql/stored_procedure/inst_merge_t_create.sql index 4f7e1b44..b6a2bcca 100644 --- a/rds_mysql/stored_procedure/inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/inst_merge_t_create.sql @@ -3,7 +3,6 @@ CREATE PROCEDURE src05.inst_merge_t_create() SQL SECURITY INVOKER BEGIN -- 例外処理 - -- エラーが発生した場合に一時テーブルの削除を実施 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @@ -14,7 +13,6 @@ BEGIN END; SET @error_state = NULL, @error_msg = NULL; - START TRANSACTION; TRUNCATE TABLE internal05.inst_merge_t; @@ -28,21 +26,20 @@ BEGIN prefc_cd ) SELECT - di.dcf_inst_cd, - di.dcf_inst_cd_new, + 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 - dcf_inst_merge di - LEFT OUTER JOIN com_inst ci - ON di.dcf_inst_cd_new = ci.dcf_dsf_inst_cd + src05.dcf_inst_merge dim + LEFT OUTER JOIN src05.com_inst ci + ON dim.dcf_inst_cd_new = ci.dcf_dsf_inst_cd WHERE - ci.delete_flg = '0' - AND STR_TO_DATE(di.tekiyo_month, '%Y%m') <= (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM hdke_tbl) - AND di.muko_flg = '0' - AND di.enabled_flg = 'Y'; + ci.delete_flg = '0' + AND src05.to_date_yyyymm01(dim.tekiyo_month) <= src05.get_syor_date() + AND dim.muko_flg = '0' + AND dim.enabled_flg = 'Y'; - COMMIT; END diff --git a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql index bbc05090..7f8006cc 100644 --- a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql @@ -3,7 +3,6 @@ CREATE PROCEDURE src05.v_inst_merge_t_create() SQL SECURITY INVOKER BEGIN -- 例外処理 - -- エラーが発生した場合に一時テーブルの削除を実施 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @@ -14,7 +13,6 @@ BEGIN END; SET @error_state = NULL, @error_msg = NULL; - START TRANSACTION; TRUNCATE TABLE internal05.v_inst_merge_t; @@ -28,15 +26,15 @@ BEGIN prft_cd ) SELECT - vv.v_inst_cd, - vv.v_inst_cd_merg, - fv.fcl_name, - fv.fcl_kn_name, - fv.fmt_addr, - fv.prft_cd + vhmv.v_inst_cd, + vhmv.v_inst_cd_merg, + fmv.fcl_name, + fmv.fcl_kn_name, + fmv.fmt_addr, + fmv.prft_cd FROM - src05.vop_hco_merge_v vv, - src05.fcl_mst_v fv + src05.vop_hco_merge_v vhmv, + src05.fcl_mst_v fmv INNER JOIN ( SELECT v_inst_cd, @@ -45,21 +43,15 @@ BEGIN src05.fcl_mst_v GROUP BY v_inst_cd - ) fmv1 - ON fv.v_inst_cd = fmv1.v_inst_cd - AND fv.sub_num = fmv1.sno + ) max_sno_fmv + ON fmv.v_inst_cd = max_sno_fmv.v_inst_cd + AND fmv.sub_num = max_sno_fmv.sno WHERE - vv.v_inst_cd_merg = fv.v_inst_cd - AND STR_TO_DATE(vv.apply_dt, '%Y-%m-%d') <= ( - SELECT - STR_TO_DATE(syor_date, '%Y%m%d') - FROM - src05.hdke_tbl - ) + vhmv.v_inst_cd_merg = fmv.v_inst_cd + AND STR_TO_DATE(vhmv.apply_dt, '%Y-%m-%d') <= src05.get_syor_date() AND ((fcl_type IN ('A1','A0')) OR fcl_type BETWEEN '20' AND '29') - AND fv.rec_sts_kbn != '9' + AND fmv.rec_sts_kbn != '9' ORDER BY - STR_TO_DATE(vv.apply_dt, '%Y-%m-%d') ASC; + STR_TO_DATE(vhmv.apply_dt, '%Y-%m-%d') ASC; - COMMIT; END From 91e92d880b8bc6b92e37d116f10659cf26966437 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 12 Apr 2023 15:19:18 +0900 Subject: [PATCH 075/962] =?UTF-8?q?style:=20=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=88=E9=81=A9=E7=94=A8=E3=81=A8=E3=82=B3?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/batch_functions.py | 2 +- .../src/batch/common/batch_config.py | 2 +- ecs/jskult-batch-daily/src/logging/get_logger.py | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py index b6b06458..0e8a78fa 100644 --- a/ecs/jskult-batch-daily/src/batch/batch_functions.py +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -53,4 +53,4 @@ def logging_sql(logger, sql): logger (logging.Logger): ロガー sql (str): SQL文 """ - logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}') \ No newline at end of file + logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}') diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_config.py b/ecs/jskult-batch-daily/src/batch/common/batch_config.py index cfaef528..e1db0417 100644 --- a/ecs/jskult-batch-daily/src/batch/common/batch_config.py +++ b/ecs/jskult-batch-daily/src/batch/common/batch_config.py @@ -5,6 +5,6 @@ class BatchConfig: @classmethod def get_instance(cls): - if cls.__instance == None: + if cls.__instance is None: cls.__instance = cls() return cls.__instance diff --git a/ecs/jskult-batch-daily/src/logging/get_logger.py b/ecs/jskult-batch-daily/src/logging/get_logger.py index 868ab5ea..f36f1199 100644 --- a/ecs/jskult-batch-daily/src/logging/get_logger.py +++ b/ecs/jskult-batch-daily/src/logging/get_logger.py @@ -6,8 +6,16 @@ from src.system_var.environment import LOG_LEVEL for name in ["boto3", "botocore", "s3transfer", "urllib3"]: logging.getLogger(name).setLevel(logging.WARNING) -# 共通ロガー -def get_logger(log_name): + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ logger = logging.getLogger(log_name) level = logging.getLevelName(LOG_LEVEL) if not isinstance(level, int): From 4cc3c10a7aca4da5e303bd14def7ee428438d161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 12 Apr 2023 15:48:35 +0900 Subject: [PATCH 076/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/inst_merge_t_create.sql | 1 - rds_mysql/stored_procedure/v_inst_merge_t_create.sql | 1 - 2 files changed, 2 deletions(-) diff --git a/rds_mysql/stored_procedure/inst_merge_t_create.sql b/rds_mysql/stored_procedure/inst_merge_t_create.sql index b6a2bcca..62463b53 100644 --- a/rds_mysql/stored_procedure/inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/inst_merge_t_create.sql @@ -7,7 +7,6 @@ BEGIN BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; - ROLLBACK; SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; END; diff --git a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql index 7f8006cc..f9b5eb30 100644 --- a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/v_inst_merge_t_create.sql @@ -7,7 +7,6 @@ BEGIN BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; - ROLLBACK; SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; END; From f65ebfb576f5a7d162956377ad166fe4323ec848 Mon Sep 17 00:00:00 2001 From: "asuka.asakura" Date: Thu, 13 Apr 2023 15:57:59 +0900 Subject: [PATCH 077/962] =?UTF-8?q?HCO=5Fcoce=E2=86=92HCO=5Fcode=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/encise/settings/CLUFM_CLUMST.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/data/encise/settings/CLUFM_CLUMST.txt b/s3/data/encise/settings/CLUFM_CLUMST.txt index c2693b08..09d6f561 100644 --- a/s3/data/encise/settings/CLUFM_CLUMST.txt +++ b/s3/data/encise/settings/CLUFM_CLUMST.txt @@ -6,7 +6,7 @@ CRLF 1 12 対象期間,クラスターコード,クラスター名,都道府県コード,都道府県名,施設コード,施設名,更新日,更新事由,適用年月,セグメントコード,セグメント名 -data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_coce,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name +data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_code,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name src01.en_clufm_clumst org01.en_clufm_clumst CLUFM_CLUMST_ex.sql From 2b57687697154ff8e368cf98b69d24f3f50e227f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 11:53:57 +0900 Subject: [PATCH 078/962] =?UTF-8?q?feat:=20=E6=97=A5=E6=AC=A1=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=81=AE=E5=88=B6=E5=BE=A1=E3=80=81=E6=97=A5?= =?UTF-8?q?=E4=BB=98=E6=9B=B4=E6=96=B0=E9=96=A2=E9=80=A3=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E8=BF=BD=E5=8A=A0=E3=80=82=E3=82=84=E3=82=89=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=87=A6=E7=90=86=E3=82=92=E9=96=93=E5=BC=95=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/batch_functions.py | 84 +++++++--- .../src/batch/ultmarc/ultmarc_process.py | 3 +- .../src/error/exceptions.py | 7 - ecs/jskult-batch-daily/src/jobctrl_daily.py | 145 ++++++++++-------- .../src/system_var/constants.py | 8 + 5 files changed, 151 insertions(+), 96 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/system_var/constants.py diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py index 0e8a78fa..be2bd565 100644 --- a/ecs/jskult-batch-daily/src/batch/batch_functions.py +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -5,48 +5,90 @@ from datetime import datetime from src.db.database import Database from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants -def get_syor_date() -> str: - """DBから処理日を取得します +def get_batch_statuses() -> tuple[str, str, str]: + """日付テーブルから、以下を取得して返す。 + - 日次バッチ処理中フラグ + - dump取得状況区分 + - 処理日(YYYY/MM/DD) Raises: BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき Returns: - str: hdke_tbl.syor_date + tuple[str, str]: [0]日次バッチ処理中フラグ、dump取得状況区分 """ db = Database.get_instance() - db.connect() - sql = 'SELECT syor_date FROM src05.hdke_tbl' + sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' try: - syor_date_result = db.execute_select(sql) + db.connect() + hdke_tbl_result = db.execute_select(sql) except DBException as e: raise BatchOperationException(e) db.disconnect() - if len(syor_date_result) == 0: + + if len(hdke_tbl_result) == 0: raise BatchOperationException('日付テーブルが取得できませんでした') - # 必ず一件取れる - syor_date_record = syor_date_result[0] - syor_date_str = syor_date_record['syor_date'] - return syor_date_str + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + syor_date = hdke_tbl_record['dump_sts_kbn'] + # 処理日を文字列に変換する + syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') + + return batch_processing_flag, dump_status_kbn, syor_date_str -def get_syor_date_as_date_format() -> str: - """DBから処理日を取得し、yyyy/mm/ddのフォーマットにして返します +def update_batch_processing_flag_in_processing() -> None: + """バッチ処理中フラグを処理中に更新する Raises: - BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき - - Returns: - str: hdke_tbl.syor_dateをyyyy/mm/ddにフォーマットした文字列 + BatchOperationException: DB操作の何らかのエラー """ - syor_date_str = get_syor_date() - syor_date = datetime.strptime(syor_date_str, '%Y%m%d') - return syor_date.strftime('%Y/%m/%d') + db = Database.get_instance() + sql = 'UPDATE src05.hdke_tbl SET bch_actf = :in_processing' + try: + db.connect() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + db.disconnect() + + return -def logging_sql(logger, sql): +def update_batch_process_complete() -> None: + """バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + bch_actf = :batch_complete, + dump_sts_kbn = :dump_unprocessed, + syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d) -- +1日 + """ + try: + db.connect() + db.execute(sql, { + 'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED, + 'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED + }) + except DBException as e: + raise BatchOperationException(e) + db.disconnect() + + return + + +def logging_sql(logger, sql) -> None: """SQL文をデバッグログで出力する Args: diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 42bc6af6..21c0c302 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -6,6 +6,7 @@ from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database +from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger logger = get_logger('アルトマークデータ保管') @@ -52,7 +53,7 @@ def exec_import(): ultmarc_bucket.delete_dat_file(dat_file_name) except Exception as e: logger.exception(e) - raise e + raise BatchOperationException(e) finally: logger.info('アルトマーク取込処理: 終了') diff --git a/ecs/jskult-batch-daily/src/error/exceptions.py b/ecs/jskult-batch-daily/src/error/exceptions.py index c9effa01..055c24f6 100644 --- a/ecs/jskult-batch-daily/src/error/exceptions.py +++ b/ecs/jskult-batch-daily/src/error/exceptions.py @@ -1,6 +1,3 @@ -from tenacity import RetryError - - class MeDaCaException(Exception): pass @@ -11,7 +8,3 @@ class DBException(MeDaCaException): class BatchOperationException(MeDaCaException): pass - - -class MaxRetryExceededException(MeDaCaException, RetryError): - pass diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index f91437b5..3cd862c8 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,11 +1,14 @@ from src.batch import jissekiaraigae -from src.batch.batch_functions import get_syor_date_as_date_format +from src.batch.batch_functions import ( + get_batch_statuses, update_batch_process_complete, + update_batch_processing_flag_in_processing) from src.batch.common.batch_config import BatchConfig from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger +from src.system_var import constants -logger = get_logger('日次処理コントロール') # ここを処理IDとかにするといいかもしれない +logger = get_logger('日次処理コントロール') # バッチ共通設定を取得 batch_config = BatchConfig.get_instance() @@ -14,62 +17,71 @@ batch_config = BatchConfig.get_instance() def batch_process(): try: logger.info('日次ジョブ:開始') - # logger.info('S3マウント状況確認') - # logger.error('S3マウントエラー:DWH(異常終了)') - # logger.error('S3マウントエラー:BIO(異常終了)') - # logger.info('データベース接続') # 実際には、ここでつなげているわけではないので、いらないと思う - # logger.error('データベース接続エラー(異常終了)') # 検査例外を捕まえて、共通的に出せばいいと思う try: - logger.info('処理日取得') - syor_date = get_syor_date_as_date_format() + # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() except BatchOperationException as e: - logger.error(f'処理日取得エラー(異常終了){e}') + logger.exception(f'日付テーブル取得(異常終了){e}') + raise e + + # 日次バッチ処理中の場合、後続の処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('日次バッチ処理中のため、日次バッチ処理を終了します。') + return 0 + + # dump取得が正常終了していない場合、後続の処理は行わない + if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: + logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') + return 0 # エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 + logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 batch_config.syor_date = syor_date - # 休日判定ファイルを読み込み + + # バッチ処理中に更新 + try: + update_batch_processing_flag_in_processing() + except BatchOperationException as e: + logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') + + # 休日判定ファイルを読み込み(ここは、各処理内に押し込むつもり) logger.info('休日判定処理') if True: # 休日判定 logger.info('非営業日かつ月、火、水以外です。') # 分岐 - try: - # 処理中フラグ判定。ここでdumpのフラグも見る - logger.info('処理フラグ更新中') - logger.info('処理フラグ更新終了') - except BatchOperationException as e: - logger.error(f'処理フラグ更新処理エラー(異常終了){e}') + # try: + # # 処理中フラグ判定。ここでdumpのフラグも見る + # logger.info('処理フラグ更新中') + # logger.info('処理フラグ更新終了') + # except BatchOperationException as e: + # logger.error(f'処理フラグ更新処理エラー(異常終了){e}') logger.info('日次ジョブ:終了(正常終了)') - try: - logger.info('日次ジョブ処理中判定') - if True: # 処理中判定 - logger.error('処理フラグ処理中(異常終了)') - logger.info('処理中フラグの更新:起動') - logger.info('処理中フラグの更新:終了') - except BatchOperationException as e: - logger.error(f'日次ジョブ処理中エラー(異常終了){e}') - # ↓ここから、やらない↓ - # logger.info('処理前バックアップ実行') - # logger.info('処理前バックアップ:起動') - # logger.info('処理前バックアップ:終了') - # logger.error('処理前バックアップ処理エラー(異常終了)', $ex->getMessage()) - # ↑ここまで↑ - logger.info('卸在庫データ取込判定') - if True: # 卸在庫日判定 - logger.info('卸在庫データ取込日です') - logger.debug('卸在庫データファイル名: {_PATH_OROSHI_ZAIKO}') - if True: # 卸在庫ファイル存在確認なければ異常終了 - logger.error('卸在庫データ存在確認エラー(異常終了)') - logger.info('卸在庫データ存在確認:取込処理開始') - logger.debug('卸在庫データファイル名作成: {read_filename}') - logger.debug('ファイル移動OK:{_MOVE_OROSHI_ZAIKO}') # S3からダウンロード - logger.debug('ファイル解凍OK:{sprintf(_ZIP_OROSHI_ZAIKO, $read_filename)}') # gunzip -fなので、gzipを使う - logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') # S3にアップロード - try: - logger.info('卸在庫データ取込:起動') - logger.info('卸在庫データ取込:終了') - except BatchOperationException as e: - logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') + # try: + # logger.info('日次ジョブ処理中判定') + # if True: # 処理中判定 + # logger.error('処理フラグ処理中(異常終了)') + # logger.info('処理中フラグの更新:起動') + # logger.info('処理中フラグの更新:終了') + # except BatchOperationException as e: + # logger.error(f'日次ジョブ処理中エラー(異常終了){e}') + # TODO: 以下、卸在庫取り込み処理は、実消化取り込み内で行う + # logger.info('卸在庫データ取込判定') + # if True: # 卸在庫日判定 + # logger.info('卸在庫データ取込日です') + # logger.debug('卸在庫データファイル名: {_PATH_OROSHI_ZAIKO}') + # if True: # 卸在庫ファイル存在確認なければ異常終了 + # logger.error('卸在庫データ存在確認エラー(異常終了)') + # logger.info('卸在庫データ存在確認:取込処理開始') + # logger.debug('卸在庫データファイル名作成: {read_filename}') + # logger.debug('ファイル移動OK:{_MOVE_OROSHI_ZAIKO}') # S3からダウンロード + # logger.debug('ファイル解凍OK:{sprintf(_ZIP_OROSHI_ZAIKO, $read_filename)}') # gunzip -fなので、gzipを使う + # logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') # S3にアップロード + # try: + # logger.info('卸在庫データ取込:起動') + # logger.info('卸在庫データ取込:終了') + # except BatchOperationException as e: + # logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') logger.info('日次処理(アルトマーク)') - if True: # アルトマークなければ + if True: # アルトマーク取り込み処理内で実装 logger.info('日次処理(アルトマーク)実行対象日でない為未実行') try: logger.info('アルトマーク取込:起動') @@ -77,7 +89,7 @@ def batch_process(): logger.info('アルトマーク取込:終了') except BatchOperationException as e: logger.error(f'アルトマーク取込処理エラー(異常終了){e}') - if True: # 休日判定 + if True: # 休日判定、メルク施設マスタ作成内で行いたい try: logger.info('メルク施設マスタ作成') logger.info('メルク施設マスタ作成終了') @@ -88,10 +100,11 @@ def batch_process(): logger.info('DCF施設統合マスタ作成終了') except BatchOperationException as e: logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') - # if False: # ($holiday === FALSE) とにかく毎日動かす - logger.info('V実消化連携データ存在確認') - if True: - logger.error('V実消化連携データ存在確認(異常終了)') + # if False: # ($holiday === FALSE) # DCF施設統合マスタを作成する日は必ず休日なので、V実消化の取り込みは行わない。 + # TODO: データ存在確認は実消化取り込み内で行う + # logger.info('V実消化連携データ存在確認') + # if True: + # logger.error('V実消化連携データ存在確認(異常終了)') logger.info('日次処理(V実消化)') try: @@ -99,28 +112,26 @@ def batch_process(): logger.info('V実消化取込:終了') except BatchOperationException as e: logger.exception(f'V実消化取込処理エラー(異常終了){e}') + logger.info('日次処理(実績更新)') + # ここも、休日判定を内側で行う try: + # ここで、生物由来ロット分解と並行処理 logger.info('実績更新:起動') jissekiaraigae.batch_process() + logger.info('生物由来ロット分解:起動') logger.info('実績更新:終了') + logger.info('生物由来ロット分解:終了') except BatchOperationException as e: logger.exception(f'実績更新処理エラー(異常終了){e}') - # ↓以下、ファイルのバックアップ以外はやらない↓ - # logger.info('処理後バックアップ実行') - # logger.info('処理後バックアップ:起動') - # logger.info('処理後バックアップ:終了') - # logger.error('処理後バックアップ処理エラー(異常終了)', $ex->getMessage()) - # ↑ここまでやらない↑ - logger.info('処理中フラグの更新:非処理中') - try: - logger.info('処理中フラグの更新:起動') - logger.info('処理中フラグの更新:終了') - except BatchOperationException as e: - logger.exception(f'処理中フラグ更新エラー(異常終了){e}') - logger.info('ワークディレクトリクリーニング') - logger.info('日次ジョブ:終了(正常終了)') + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 + try: + update_batch_process_complete() + except BatchOperationException as e: + logger.exception(f'日次バッチ完了処理 エラー(異常終了){e}') + + logger.info('日次ジョブ:終了(正常終了)') return 0 except Exception as e: raise e diff --git a/ecs/jskult-batch-daily/src/system_var/constants.py b/ecs/jskult-batch-daily/src/system_var/constants.py new file mode 100644 index 00000000..5eafaedd --- /dev/null +++ b/ecs/jskult-batch-daily/src/system_var/constants.py @@ -0,0 +1,8 @@ +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:dump取得正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' From d00bf2699eb02d33ecbbc721c3f3ca221cf34aaa Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 13:08:49 +0900 Subject: [PATCH 079/962] =?UTF-8?q?fix:=20=E3=83=90=E3=82=B0=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/batch_functions.py | 4 ++-- ecs/jskult-batch-daily/src/jobctrl_daily.py | 16 ++++++++++++---- .../src/system_var/constants.py | 3 +++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py index be2bd565..255d7729 100644 --- a/ecs/jskult-batch-daily/src/batch/batch_functions.py +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -36,7 +36,7 @@ def get_batch_statuses() -> tuple[str, str, str]: hdke_tbl_record = hdke_tbl_result[0] batch_processing_flag = hdke_tbl_record['bch_actf'] dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] - syor_date = hdke_tbl_record['dump_sts_kbn'] + syor_date = hdke_tbl_record['syor_date'] # 処理日を文字列に変換する syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') @@ -73,7 +73,7 @@ def update_batch_process_complete() -> None: SET bch_actf = :batch_complete, dump_sts_kbn = :dump_unprocessed, - syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d) -- +1日 + syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d') -- +1日 """ try: db.connect() diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 3cd862c8..385586f4 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -22,17 +22,17 @@ def batch_process(): batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() except BatchOperationException as e: logger.exception(f'日付テーブル取得(異常終了){e}') - raise e + return constants.BATCH_EXIT_CODE_SUCCESS # 日次バッチ処理中の場合、後続の処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: logger.error('日次バッチ処理中のため、日次バッチ処理を終了します。') - return 0 + return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') - return 0 # エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 + return constants.BATCH_EXIT_CODE_SUCCESS # TODO: エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 @@ -43,6 +43,7 @@ def batch_process(): update_batch_processing_flag_in_processing() except BatchOperationException as e: logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS # 休日判定ファイルを読み込み(ここは、各処理内に押し込むつもり) logger.info('休日判定処理') @@ -89,17 +90,20 @@ def batch_process(): logger.info('アルトマーク取込:終了') except BatchOperationException as e: logger.error(f'アルトマーク取込処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS if True: # 休日判定、メルク施設マスタ作成内で行いたい try: logger.info('メルク施設マスタ作成') logger.info('メルク施設マスタ作成終了') except BatchOperationException as e: logger.error(f'メルク施設マスタ作成エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS try: logger.info('DCF施設統合マスタ作成') logger.info('DCF施設統合マスタ作成終了') except BatchOperationException as e: logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS # if False: # ($holiday === FALSE) # DCF施設統合マスタを作成する日は必ず休日なので、V実消化の取り込みは行わない。 # TODO: データ存在確認は実消化取り込み内で行う # logger.info('V実消化連携データ存在確認') @@ -112,6 +116,7 @@ def batch_process(): logger.info('V実消化取込:終了') except BatchOperationException as e: logger.exception(f'V実消化取込処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS logger.info('日次処理(実績更新)') # ここも、休日判定を内側で行う @@ -124,14 +129,17 @@ def batch_process(): logger.info('生物由来ロット分解:終了') except BatchOperationException as e: logger.exception(f'実績更新処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 try: update_batch_process_complete() except BatchOperationException as e: logger.exception(f'日次バッチ完了処理 エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS logger.info('日次ジョブ:終了(正常終了)') - return 0 + return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: + logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') raise e diff --git a/ecs/jskult-batch-daily/src/system_var/constants.py b/ecs/jskult-batch-daily/src/system_var/constants.py index 5eafaedd..d5538a80 100644 --- a/ecs/jskult-batch-daily/src/system_var/constants.py +++ b/ecs/jskult-batch-daily/src/system_var/constants.py @@ -1,3 +1,6 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + # バッチ処理中フラグ:未処理 BATCH_ACTF_BATCH_UNPROCESSED = '0' # バッチ処理中フラグ:処理中 From 7ce58fac4fc5978fec69b4f3650d6ae85369e739 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 13:15:55 +0900 Subject: [PATCH 080/962] =?UTF-8?q?feat:=20=E3=83=95=E3=82=A9=E3=83=AB?= =?UTF-8?q?=E3=83=80=E6=A7=8B=E6=88=90=E3=80=81=E9=96=A2=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/entrypoint.py | 4 ++-- .../src/batch/{datachange => laundering}/__init__.py | 0 .../emp_chg_inst_laundering.py} | 2 +- .../{jissekiaraigae.py => laundering/sales_laundering.py} | 6 +++--- ecs/jskult-batch-daily/src/jobctrl_daily.py | 8 +++++--- 5 files changed, 11 insertions(+), 9 deletions(-) rename ecs/jskult-batch-daily/src/batch/{datachange => laundering}/__init__.py (100%) rename ecs/jskult-batch-daily/src/batch/{datachange/emp_chg_inst_lau.py => laundering/emp_chg_inst_laundering.py} (99%) rename ecs/jskult-batch-daily/src/batch/{jissekiaraigae.py => laundering/sales_laundering.py} (64%) diff --git a/ecs/jskult-batch-daily/entrypoint.py b/ecs/jskult-batch-daily/entrypoint.py index 43a997dc..472efd9f 100644 --- a/ecs/jskult-batch-daily/entrypoint.py +++ b/ecs/jskult-batch-daily/entrypoint.py @@ -1,9 +1,9 @@ """実消化&アルトマーク 日次バッチのエントリーポイント""" -from src.jobctrl_daily import batch_process +from src import jobctrl_daily if __name__ == '__main__': try: - exit(batch_process()) + exit(jobctrl_daily.exec()) except Exception: # エラーが起きても、正常系のコードで返す。 # エラーが起きた事実はbatch_process内でログを出す。 diff --git a/ecs/jskult-batch-daily/src/batch/datachange/__init__.py b/ecs/jskult-batch-daily/src/batch/laundering/__init__.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/datachange/__init__.py rename to ecs/jskult-batch-daily/src/batch/laundering/__init__.py diff --git a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py similarity index 99% rename from ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py rename to ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 64a6a363..c8a28baf 100644 --- a/ecs/jskult-batch-daily/src/batch/datachange/emp_chg_inst_lau.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -9,7 +9,7 @@ logger = get_logger('48-施設担当者マスタ洗替') batch_config = BatchConfig.get_instance() -def batch_process(): +def exec(): db = Database.get_instance() db.connect() logger.info('##########################') diff --git a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py similarity index 64% rename from ecs/jskult-batch-daily/src/batch/jissekiaraigae.py rename to ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py index 7f5d9fcf..c1884b7d 100644 --- a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -1,11 +1,11 @@ -from src.batch.datachange import emp_chg_inst_lau +from src.batch.laundering import emp_chg_inst_laundering from src.logging.get_logger import get_logger logger = get_logger('実績洗替') -def batch_process(): +def exec(): """実績洗替処理""" logger.info('Start Jisseki Araigae Batch PGM.') # 施設担当者洗替 - emp_chg_inst_lau.batch_process() + emp_chg_inst_laundering.exec() diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 385586f4..c56fe8ba 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,8 +1,10 @@ -from src.batch import jissekiaraigae +"""実消化&アルトマーク 日次バッチ処理""" + from src.batch.batch_functions import ( get_batch_statuses, update_batch_process_complete, update_batch_processing_flag_in_processing) from src.batch.common.batch_config import BatchConfig +from src.batch.laundering import sales_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -14,7 +16,7 @@ logger = get_logger('日次処理コントロール') batch_config = BatchConfig.get_instance() -def batch_process(): +def exec(): try: logger.info('日次ジョブ:開始') try: @@ -123,7 +125,7 @@ def batch_process(): try: # ここで、生物由来ロット分解と並行処理 logger.info('実績更新:起動') - jissekiaraigae.batch_process() + sales_laundering.exec() logger.info('生物由来ロット分解:起動') logger.info('実績更新:終了') logger.info('生物由来ロット分解:終了') From e36285c6f2d1370c57c143238a37973ee46ba03d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 13:18:43 +0900 Subject: [PATCH 081/962] =?UTF-8?q?style:=20=E5=9E=8B=E3=82=A2=E3=83=8E?= =?UTF-8?q?=E3=83=86=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/batch_functions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py index 255d7729..6c113664 100644 --- a/ecs/jskult-batch-daily/src/batch/batch_functions.py +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -1,5 +1,5 @@ """バッチ処理の共通関数""" - +import logging import textwrap from datetime import datetime @@ -88,11 +88,11 @@ def update_batch_process_complete() -> None: return -def logging_sql(logger, sql) -> None: +def logging_sql(logger: logging.Logger, sql: str) -> None: """SQL文をデバッグログで出力する Args: logger (logging.Logger): ロガー sql (str): SQL文 """ - logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}') + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') From d3d385c214d8f2920f8433423f4a9579591fff3d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 17:42:02 +0900 Subject: [PATCH 082/962] =?UTF-8?q?feat:=20=E4=BC=91=E6=97=A5=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E8=AB=B8=E3=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 3 + ecs/jskult-batch-daily/src/aws/s3.py | 14 +++ .../src/batch/common/batch_config.py | 10 -- .../src/batch/common/batch_context.py | 39 ++++++++ .../src/batch/common/calendar_file.py | 32 +++++++ .../laundering/emp_chg_inst_laundering.py | 6 +- .../src/batch/laundering/mst_inst_create.py | 3 + .../src/batch/ultmarc/ultmarc_process.py | 31 +++++-- .../table_mapper/ultmarc_table_mapper.py | 6 +- ecs/jskult-batch-daily/src/jobctrl_daily.py | 93 ++++++++++++++----- .../src/system_var/constants.py | 8 ++ .../src/system_var/environment.py | 3 + .../com_alma/test_com_alma_mapper.py | 12 +-- .../test_com_dr_wrkplace_mapper.py | 12 +-- .../com_hamtec/test_com_hamtec_mapper.py | 12 +-- 15 files changed, 218 insertions(+), 66 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/common/batch_config.py create mode 100644 ecs/jskult-batch-daily/src/batch/common/batch_context.py create mode 100644 ecs/jskult-batch-daily/src/batch/common/calendar_file.py create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 91ae5f74..a7c88968 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -8,3 +8,6 @@ ULTMARC_DATA_BUCKET=**************** ULTMARC_DATA_FOLDER=recv ULTMARC_BACKUP_BUCKET=**************** ULTMARC_BACKUP_FOLDER=ultmarc +JSKULT_CONFIG_BUCKET=********************** +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 43460f8d..aa235224 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -76,6 +76,20 @@ class UltmarcBucket(S3Bucket): self._s3_client.delete_file(self._bucket_name, dat_file_key) +class ConfigBucket(S3Bucket): + _bucket_name = environment.JSKULT_CONFIG_BUCKET + + def download_holiday_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME) + holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, holiday_list_key, f) + f.seek(0) + return temporary_file_path + + class JskUltBackupBucket(S3Bucket): _bucket_name = environment.ULTMARC_BACKUP_BUCKET diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_config.py b/ecs/jskult-batch-daily/src/batch/common/batch_config.py deleted file mode 100644 index e1db0417..00000000 --- a/ecs/jskult-batch-daily/src/batch/common/batch_config.py +++ /dev/null @@ -1,10 +0,0 @@ -class BatchConfig: - # 処理日(yyyy/mm/dd形式) - syor_date: str - __instance = None - - @classmethod - def get_instance(cls): - if cls.__instance is None: - cls.__instance = cls() - return cls.__instance diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_context.py b/ecs/jskult-batch-daily/src/batch/common/batch_context.py new file mode 100644 index 00000000..3b3ac157 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/batch_context.py @@ -0,0 +1,39 @@ +class BatchContext: + __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) + __is_not_business_day: bool # 日次バッチ起動日フラグ + __is_ultmarc_imported: bool # アルトマーク取込実施済フラグ + + def __init__(self) -> None: + self.__is_not_business_day = False + self.__is_ultmarc_imported = False + + @classmethod + def get_instance(cls): + if cls.__instance is None: + cls.__instance = cls() + return cls.__instance + + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + + @property + def is_not_business_day(self): + return self.__is_not_business_day + + @is_not_business_day.setter + def is_not_business_day(self, flag: bool): + self.__is_not_business_day = flag + + @property + def is_ultmarc_imported(self): + return self.__is_ultmarc_imported + + @is_ultmarc_imported.setter + def is_ultmarc_imported(self, flag: bool): + self.__is_ultmarc_imported = flag diff --git a/ecs/jskult-batch-daily/src/batch/common/calendar_file.py b/ecs/jskult-batch-daily/src/batch/common/calendar_file.py new file mode 100644 index 00000000..b456f03c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/calendar_file.py @@ -0,0 +1,32 @@ +from src.system_var import constants + + +class CalendarFile: + """カレンダーファイル""" + + __calendar_file_lines: list[str] + + def __init__(self, calendar_file_path): + with open(calendar_file_path) as f: + self.__calendar_file_lines: list[str] = f.readlines() + + def compare_date(self, date_str: str) -> bool: + """与えられた日付がカレンダーファイル内に含まれているかどうか + カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提 + コメント(#)が含まれている行は無視される + + Args: + date_str (str): yyyy/mm/dd文字列 + + Returns: + bool: 含まれていればTrue + """ + for calendar_date in self.__calendar_file_lines: + # コメント行が含まれている場合はスキップ + if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: + continue + + if date_str in calendar_date: + return True + + return False diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index c8a28baf..6e611bc9 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -1,12 +1,12 @@ from src.batch.batch_functions import logging_sql -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.db.database import Database from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime logger = get_logger('48-施設担当者マスタ洗替') -batch_config = BatchConfig.get_instance() +batch_context = BatchContext.get_instance() def exec(): @@ -15,7 +15,7 @@ def exec(): logger.info('##########################') logger.info('START Changing Employee in charge of institution PGM.') # 業務日付を取得 - syor_date = batch_config.syor_date + syor_date = batch_context.syor_date # `emp_chg_inst_lau`をTruncate truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py new file mode 100644 index 00000000..a2e52df4 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py @@ -0,0 +1,3 @@ +def exec(): + """メルク施設マスタ作成""" + pass diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 21c0c302..4c331b56 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -1,17 +1,20 @@ -"""アルトマークデータ保管""" +"""アルトマークデータ処理""" + +from datetime import datetime from src.aws.s3 import UltmarcBucket -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.datfile import DatFile from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger +from src.system_var import constants -logger = get_logger('アルトマークデータ保管') +logger = get_logger('アルトマークデータ処理') ultmarc_bucket = UltmarcBucket() -batch_config = BatchConfig.get_instance() +batch_context = BatchContext.get_instance() def exec_import(): @@ -23,13 +26,16 @@ def exec_import(): # ファイルがない場合は処理せず、正常終了とする if len(dat_file_list) == 0: - logger.info('ファイルがないため、アルトマーク取込処理をスキップします') + logger.info('取込ファイルがないため、アルトマーク取込処理をスキップします') + # アルトマークデータ受信予定曜日である月曜日は、保守ユーザーに通知する + if datetime.strptime(batch_context.syor_date, '%Y/%m/%d').weekday() == constants.WEEKDAY_MONDAY: + logger.info('[NOTICE]アルトマークデータの受信がありませんでした') return # ファイルが複数ある場合はエラーとする if len(dat_file_list) > 1: logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') - return + raise BatchOperationException() # ファイルの件数は必ず1件になる dat_file_info = dat_file_list[0] @@ -42,7 +48,7 @@ def exec_import(): logger.info(f"{dat_file_name}を取り込みます") # ファイルをバックアップ # 現行は、jobctrl_dailyの先頭でやっている - ultmarc_bucket.backup_dat_file(dat_file_name, batch_config.syor_date) + ultmarc_bucket.backup_dat_file(dat_file_name, batch_context.syor_date) # datファイルをダウンロード local_file_path = ultmarc_bucket.download_dat_file(dat_file_name) dat_file = DatFile.from_path(local_file_path) @@ -51,11 +57,18 @@ def exec_import(): # 処理後、ファイルをS3から削除する logger.info(f'取り込み処理が完了したため、datファイルを削除。ファイル名={dat_file_name}') ultmarc_bucket.delete_dat_file(dat_file_name) + # アルトマーク取込済をマーク + batch_context.is_ultmarc_imported = True + logger.info('アルトマーク取込処理: 終了') except Exception as e: logger.exception(e) raise BatchOperationException(e) - finally: - logger.info('アルトマーク取込処理: 終了') + + +def exec_export(): + # 取り込み日に限らず、毎日実行する + """V実消化用施設・薬局薬店データ作成処理""" + pass def _import_to_ultmarc_table(dat_file: DatFile): diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py index 5a62d171..7aa1f311 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/ultmarc_table_mapper.py @@ -1,12 +1,12 @@ from abc import ABCMeta, abstractmethod from datetime import datetime -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable from src.db.database import Database # 処理日を使用するために、configを使用 -batch_config = BatchConfig.get_instance() +batch_context = BatchContext.get_instance() class UltmarcTableMapper(metaclass=ABCMeta): @@ -32,7 +32,7 @@ class UltmarcTableMapper(metaclass=ABCMeta): 'execute_date_str_ymd': execute_date_str_ymd, 'execute_datetime': execute_datetime, # バッチ共通設定から処理日を取得 - 'syor_date': batch_config.syor_date + 'syor_date': batch_context.syor_date } @abstractmethod diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index c56fe8ba..72395a0c 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,9 +1,11 @@ """実消化&アルトマーク 日次バッチ処理""" +from src.aws.s3 import ConfigBucket from src.batch.batch_functions import ( get_batch_statuses, update_batch_process_complete, update_batch_processing_flag_in_processing) -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext +from src.batch.common.calendar_file import CalendarFile from src.batch.laundering import sales_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException @@ -13,7 +15,7 @@ from src.system_var import constants logger = get_logger('日次処理コントロール') # バッチ共通設定を取得 -batch_config = BatchConfig.get_instance() +batch_context = BatchContext.get_instance() def exec(): @@ -32,13 +34,34 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない - if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: + if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE and dump_status_kbn != constants.DUMP_STATUS_KBN_DUMP_SKIP: logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS # TODO: エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 - batch_config.syor_date = syor_date + batch_context.syor_date = syor_date + + # 稼働日かかどうかを設定 + # 非営業日ファイルをダウンロードして判定 + holiday_list_file_path = ConfigBucket().download_holiday_list() + holiday_calendar = CalendarFile(holiday_list_file_path) + # 非稼働日かどうかを設定 + batch_context.is_not_business_day = not holiday_calendar.compare_date(syor_date) + # for row in io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'): + # if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: + # continue + # non_date = row.rstrip('\n') + # # 日付妥当性判定 + # try: + # datetime.datetime.strptime(non_date, "%Y/%m/%d") + # except Exception as e: + # raise e + # none_business_day_list.append(non_date) + + # if execute_date in none_business_day_list: + # logger.info('I-02-05 本日は非営業日のため、チェック処理をスキップします') + # return # バッチ処理中に更新 try: @@ -84,29 +107,42 @@ def exec(): # except BatchOperationException as e: # logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') logger.info('日次処理(アルトマーク)') - if True: # アルトマーク取り込み処理内で実装 - logger.info('日次処理(アルトマーク)実行対象日でない為未実行') + # if True: # アルトマーク取り込み処理内で実装 + # logger.info('日次処理(アルトマーク)実行対象日でない為未実行') + try: logger.info('アルトマーク取込:起動') ultmarc_process.exec_import() logger.info('アルトマーク取込:終了') except BatchOperationException as e: - logger.error(f'アルトマーク取込処理エラー(異常終了){e}') + logger.exception(f'アルトマーク取込処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - if True: # 休日判定、メルク施設マスタ作成内で行いたい - try: - logger.info('メルク施設マスタ作成') - logger.info('メルク施設マスタ作成終了') - except BatchOperationException as e: - logger.error(f'メルク施設マスタ作成エラー(異常終了){e}') - return constants.BATCH_EXIT_CODE_SUCCESS - try: - logger.info('DCF施設統合マスタ作成') - logger.info('DCF施設統合マスタ作成終了') - except BatchOperationException as e: - logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') - return constants.BATCH_EXIT_CODE_SUCCESS - # if False: # ($holiday === FALSE) # DCF施設統合マスタを作成する日は必ず休日なので、V実消化の取り込みは行わない。 + + try: + logger.info('V実消化用施設・薬局薬店データ作成処理:起動') + ultmarc_process.exec_export() + logger.info('V実消化用施設・薬局薬店データ作成処理:終了') + except BatchOperationException as e: + logger.exception(f'V実消化用施設・薬局薬店データ作成処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # TODO: 現行では休日も、メルク施設マスタと施設統合マスタの作成を行っている。 + # 実績洗い替えの中でもメルク施設マスタと施設統合マスタの作成は行っているが、他の処理は動かしたくない。 + # つまり、休日だったら、メルク施設マスタと施設統合マスタ以外の作成は行わない、とすれば、シンプルになる? + # if True: # 休日判定、メルク施設マスタ作成内で行いたい + # try: + # logger.info('メルク施設マスタ作成') + # logger.info('メルク施設マスタ作成終了') + # except BatchOperationException as e: + # logger.error(f'メルク施設マスタ作成エラー(異常終了){e}') + # return constants.BATCH_EXIT_CODE_SUCCESS + # try: + # logger.info('DCF施設統合マスタ作成') + # logger.info('DCF施設統合マスタ作成終了') + # except BatchOperationException as e: + # logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') + # return constants.BATCH_EXIT_CODE_SUCCESS + # if False: # ($holiday === FALSE) # V実消化非稼働日は、V実消化の取り込みは行わない。 # TODO: データ存在確認は実消化取り込み内で行う # logger.info('V実消化連携データ存在確認') # if True: @@ -120,8 +156,18 @@ def exec(): logger.exception(f'V実消化取込処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + # 非稼働日や、月火水に限らず、必ず実施 + logger.info('メルク施設マスタ作成') + try: + logger.info('メルク施設マスタ作成:起動') + logger.info('メルク施設マスタ作成:終了') + except BatchOperationException as e: + logger.exception(f'メルク施設マスタ作成 エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('日次処理(実績更新)') - # ここも、休日判定を内側で行う + # ここも、休日判定を実績更新内で行う + # 休日であっても、施設統合マスタの作成だけは行う。 try: # ここで、生物由来ロット分解と並行処理 logger.info('実績更新:起動') @@ -140,7 +186,8 @@ def exec(): logger.exception(f'日次バッチ完了処理 エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - logger.info('日次ジョブ:終了(正常終了)') + # 正常終了を保守ユーザーに通知 + logger.info('[NOTICE]日次ジョブ:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') diff --git a/ecs/jskult-batch-daily/src/system_var/constants.py b/ecs/jskult-batch-daily/src/system_var/constants.py index d5538a80..26e1c1a8 100644 --- a/ecs/jskult-batch-daily/src/system_var/constants.py +++ b/ecs/jskult-batch-daily/src/system_var/constants.py @@ -9,3 +9,11 @@ BATCH_ACTF_BATCH_IN_PROCESSING = '1' DUMP_STATUS_KBN_UNPROCESSED = '0' # dump取得状態区分:dump取得正常終了 DUMP_STATUS_KBN_COMPLETE = '2' +# dump取得状態区分:dump取得スキップ +DUMP_STATUS_KBN_DUMP_SKIP = '3' + +# カレンダーファイルのコメントシンボル +CALENDAR_COMMENT_SYMBOL = '#' + +# 月曜日(datetime.weekday()で月曜日を表す数字) +WEEKDAY_MONDAY = 0 diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index e7248191..650826ee 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -12,6 +12,9 @@ ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET'] ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] +JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] +JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] +JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 238f8a3d..8390096f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -3,7 +3,7 @@ from datetime import datetime import pytest -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, @@ -18,13 +18,13 @@ class TestComAlmaMapper: """レイアウト区分004: COM_出身校""" db: Database - batch_config: BatchConfig + batch_context: BatchContext test_file_path: str = path.dirname(__file__) @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" - self.batch_config = BatchConfig.get_instance() + self.batch_context = BatchContext.get_instance() # setup self.db = database self.db.connect() @@ -50,7 +50,7 @@ class TestComAlmaMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_insert.csv')) # 一旦全データをDBから削除 @@ -95,7 +95,7 @@ class TestComAlmaMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_update.csv')) # 一旦全データをDBから削除 @@ -152,7 +152,7 @@ class TestComAlmaMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_delete.csv')) # 一旦全データをDBから削除 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index f838dabf..89e65b54 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -2,7 +2,7 @@ import os.path as path import pytest -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ com_dr_wrkplace_mapper from src.db.database import Database @@ -18,13 +18,13 @@ class TestComDrWrkplaceMapper: """COM_DCF医師勤務先""" db: Database - batch_config: BatchConfig + batch_context: BatchContext test_file_path: str = path.dirname(__file__) @ pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" - self.batch_config = BatchConfig.get_instance() + self.batch_context = BatchContext.get_instance() # setup self.db = database @@ -53,7 +53,7 @@ class TestComDrWrkplaceMapper: # Arrange # 処理日設定 # 適用開始日と同値になる - self.batch_config.syor_date = '2020/02/22' + self.batch_context.syor_date = '2020/02/22' # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_insert.csv')) # 一旦全データをDBから削除 @@ -147,7 +147,7 @@ class TestComDrWrkplaceMapper: # Arrange # 処理日設定 # 適用開始日と同値、適用終了日の+1日になる - self.batch_config.syor_date = '2020/02/23' + self.batch_context.syor_date = '2020/02/23' # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_update.csv')) # 一旦全データをDBから削除 @@ -264,7 +264,7 @@ class TestComDrWrkplaceMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = '2020/02/24' + self.batch_context.syor_date = '2020/02/24' # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_delete.csv')) # 一旦全データをDBから削除 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py index 08c773f9..c7434739 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/test_com_hamtec_mapper.py @@ -3,7 +3,7 @@ from datetime import datetime import pytest -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ com_hamtec_mapper from src.db.database import Database @@ -19,13 +19,13 @@ class TestComHamtecMapper: """レイアウト区分021: COM_高度先進医療""" db: Database - batch_config: BatchConfig + batch_context: BatchContext test_file_path: str = path.dirname(__file__) @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" - self.batch_config = BatchConfig.get_instance() + self.batch_context = BatchContext.get_instance() # setup self.db = database self.db.connect() @@ -51,7 +51,7 @@ class TestComHamtecMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_insert.csv')) # 一旦全データをDBから削除 @@ -96,7 +96,7 @@ class TestComHamtecMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_update.csv')) # 一旦全データをDBから削除 @@ -153,7 +153,7 @@ class TestComHamtecMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hamtec_delete.csv')) # 一旦全データをDBから削除 From 60b95a2474b61a403f23503b7ec4fa97aa1767d0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 17:42:15 +0900 Subject: [PATCH 083/962] =?UTF-8?q?feat:=20=E5=AE=9F=E6=B6=88=E5=8C=96?= =?UTF-8?q?=E9=9D=9E=E7=A8=BC=E5=83=8D=E6=97=A5=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jskult/calendar/jskult_holiday_list.txt | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 s3/config/jskult/calendar/jskult_holiday_list.txt diff --git a/s3/config/jskult/calendar/jskult_holiday_list.txt b/s3/config/jskult/calendar/jskult_holiday_list.txt new file mode 100644 index 00000000..f154ef79 --- /dev/null +++ b/s3/config/jskult/calendar/jskult_holiday_list.txt @@ -0,0 +1,131 @@ +2022/12/03 +2022/12/04 +2022/12/10 +2022/12/11 +2022/12/17 +2022/12/18 +2022/12/24 +2022/12/25 +2022/12/29 +2022/12/30 +2022/12/31 +2023/01/01 +2023/01/02 +2023/01/03 +2023/01/07 +2023/01/08 +2023/01/09 +2023/01/14 +2023/01/15 +2023/01/21 +2023/01/22 +2023/01/28 +2023/01/29 +2023/02/04 +2023/02/05 +2023/02/11 +2023/02/12 +2023/02/18 +2023/02/19 +2023/02/23 +2023/02/25 +2023/02/26 +2023/03/04 +2023/03/05 +2023/03/11 +2023/03/12 +2023/03/18 +2023/03/19 +2023/03/21 +2023/03/25 +2023/03/26 +2023/04/01 +2023/04/02 +2023/04/08 +2023/04/09 +2023/04/15 +2023/04/16 +2023/04/22 +2023/04/23 +2023/04/29 +2023/04/30 +2023/05/03 +2023/05/04 +2023/05/05 +2023/05/06 +2023/05/07 +2023/05/13 +2023/05/14 +2023/05/20 +2023/05/21 +2023/05/27 +2023/05/28 +2023/06/03 +2023/06/04 +2023/06/10 +2023/06/11 +2023/06/17 +2023/06/18 +2023/06/24 +2023/06/25 +2023/07/01 +2023/07/02 +2023/07/08 +2023/07/09 +2023/07/15 +2023/07/16 +2023/07/17 +2023/07/22 +2023/07/23 +2023/07/29 +2023/07/30 +2023/08/05 +2023/08/06 +2023/08/11 +2023/08/12 +2023/08/13 +2023/08/19 +2023/08/20 +2023/08/26 +2023/08/27 +2023/09/02 +2023/09/03 +2023/09/09 +2023/09/10 +2023/09/16 +2023/09/17 +2023/09/18 +2023/09/23 +2023/09/24 +2023/09/30 +2023/10/01 +2023/10/07 +2023/10/08 +2023/10/09 +2023/10/14 +2023/10/15 +2023/10/21 +2023/10/22 +2023/10/28 +2023/10/29 +2023/11/03 +2023/11/04 +2023/11/05 +2023/11/11 +2023/11/12 +2023/11/18 +2023/11/19 +2023/11/23 +2023/11/25 +2023/11/26 +2023/12/02 +2023/12/03 +2023/12/09 +2023/12/10 +2023/12/16 +2023/12/17 +2023/12/23 +2023/12/24 +2023/12/29 +2023/12/30 +2023/12/31 \ No newline at end of file From 8c73f153d6dd9112d6e07968912b00587d8931b8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 17:46:13 +0900 Subject: [PATCH 084/962] =?UTF-8?q?feat:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=81=AA=E3=81=A9=E3=82=92?= =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 83 +-------------------- 1 file changed, 2 insertions(+), 81 deletions(-) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 72395a0c..94e8a835 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -34,7 +34,7 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない - if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE and dump_status_kbn != constants.DUMP_STATUS_KBN_DUMP_SKIP: + if dump_status_kbn not in [constants.DUMP_STATUS_KBN_COMPLETE, constants.DUMP_STATUS_KBN_DUMP_SKIP]: logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS # TODO: エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 @@ -42,26 +42,10 @@ def exec(): # バッチ共通設定に処理日を追加 batch_context.syor_date = syor_date - # 稼働日かかどうかを設定 - # 非営業日ファイルをダウンロードして判定 + # 稼働日かかどうかを、非営業日ファイルをダウンロードして判定 holiday_list_file_path = ConfigBucket().download_holiday_list() holiday_calendar = CalendarFile(holiday_list_file_path) - # 非稼働日かどうかを設定 batch_context.is_not_business_day = not holiday_calendar.compare_date(syor_date) - # for row in io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'): - # if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: - # continue - # non_date = row.rstrip('\n') - # # 日付妥当性判定 - # try: - # datetime.datetime.strptime(non_date, "%Y/%m/%d") - # except Exception as e: - # raise e - # none_business_day_list.append(non_date) - - # if execute_date in none_business_day_list: - # logger.info('I-02-05 本日は非営業日のため、チェック処理をスキップします') - # return # バッチ処理中に更新 try: @@ -70,46 +54,7 @@ def exec(): logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 休日判定ファイルを読み込み(ここは、各処理内に押し込むつもり) - logger.info('休日判定処理') - if True: # 休日判定 - logger.info('非営業日かつ月、火、水以外です。') # 分岐 - # try: - # # 処理中フラグ判定。ここでdumpのフラグも見る - # logger.info('処理フラグ更新中') - # logger.info('処理フラグ更新終了') - # except BatchOperationException as e: - # logger.error(f'処理フラグ更新処理エラー(異常終了){e}') - logger.info('日次ジョブ:終了(正常終了)') - # try: - # logger.info('日次ジョブ処理中判定') - # if True: # 処理中判定 - # logger.error('処理フラグ処理中(異常終了)') - # logger.info('処理中フラグの更新:起動') - # logger.info('処理中フラグの更新:終了') - # except BatchOperationException as e: - # logger.error(f'日次ジョブ処理中エラー(異常終了){e}') - # TODO: 以下、卸在庫取り込み処理は、実消化取り込み内で行う - # logger.info('卸在庫データ取込判定') - # if True: # 卸在庫日判定 - # logger.info('卸在庫データ取込日です') - # logger.debug('卸在庫データファイル名: {_PATH_OROSHI_ZAIKO}') - # if True: # 卸在庫ファイル存在確認なければ異常終了 - # logger.error('卸在庫データ存在確認エラー(異常終了)') - # logger.info('卸在庫データ存在確認:取込処理開始') - # logger.debug('卸在庫データファイル名作成: {read_filename}') - # logger.debug('ファイル移動OK:{_MOVE_OROSHI_ZAIKO}') # S3からダウンロード - # logger.debug('ファイル解凍OK:{sprintf(_ZIP_OROSHI_ZAIKO, $read_filename)}') # gunzip -fなので、gzipを使う - # logger.debug('ファイル名変更OK: {sprintf(_RENAME_OROSHI_ZAIKO, $read_filename)}') # S3にアップロード - # try: - # logger.info('卸在庫データ取込:起動') - # logger.info('卸在庫データ取込:終了') - # except BatchOperationException as e: - # logger.error(f'卸在庫データ取込処理エラー(異常終了){e}') logger.info('日次処理(アルトマーク)') - # if True: # アルトマーク取り込み処理内で実装 - # logger.info('日次処理(アルトマーク)実行対象日でない為未実行') - try: logger.info('アルトマーク取込:起動') ultmarc_process.exec_import() @@ -126,28 +71,6 @@ def exec(): logger.exception(f'V実消化用施設・薬局薬店データ作成処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # TODO: 現行では休日も、メルク施設マスタと施設統合マスタの作成を行っている。 - # 実績洗い替えの中でもメルク施設マスタと施設統合マスタの作成は行っているが、他の処理は動かしたくない。 - # つまり、休日だったら、メルク施設マスタと施設統合マスタ以外の作成は行わない、とすれば、シンプルになる? - # if True: # 休日判定、メルク施設マスタ作成内で行いたい - # try: - # logger.info('メルク施設マスタ作成') - # logger.info('メルク施設マスタ作成終了') - # except BatchOperationException as e: - # logger.error(f'メルク施設マスタ作成エラー(異常終了){e}') - # return constants.BATCH_EXIT_CODE_SUCCESS - # try: - # logger.info('DCF施設統合マスタ作成') - # logger.info('DCF施設統合マスタ作成終了') - # except BatchOperationException as e: - # logger.error(f'DCF施設統合マスタ作成エラー(異常終了){e}') - # return constants.BATCH_EXIT_CODE_SUCCESS - # if False: # ($holiday === FALSE) # V実消化非稼働日は、V実消化の取り込みは行わない。 - # TODO: データ存在確認は実消化取り込み内で行う - # logger.info('V実消化連携データ存在確認') - # if True: - # logger.error('V実消化連携データ存在確認(異常終了)') - logger.info('日次処理(V実消化)') try: logger.info('V実消化取込:起動') @@ -166,8 +89,6 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS logger.info('日次処理(実績更新)') - # ここも、休日判定を実績更新内で行う - # 休日であっても、施設統合マスタの作成だけは行う。 try: # ここで、生物由来ロット分解と並行処理 logger.info('実績更新:起動') From 834bc503dd9e8b019eb78f6ad765b666d23e418e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 14 Apr 2023 18:21:52 +0900 Subject: [PATCH 085/962] =?UTF-8?q?feat:=20=E5=88=B6=E5=BE=A1=E5=AF=BE?= =?UTF-8?q?=E8=B1=A1=E3=81=AE=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/laundering/create_dcf_inst_merge.py | 15 ++++++++++ .../src/batch/laundering/create_mst_inst.py | 21 ++++++++++++++ .../src/batch/laundering/mst_inst_create.py | 3 -- .../src/batch/laundering/sales_laundering.py | 10 ++++++- .../src/batch/ultmarc/ultmarc_process.py | 5 ++-- ecs/jskult-batch-daily/src/jobctrl_daily.py | 29 ++++++++++++------- 6 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py delete mode 100644 ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py new file mode 100644 index 00000000..974aa329 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py @@ -0,0 +1,15 @@ +from src.batch.common.batch_context import BatchContext +from src.logging.get_logger import get_logger + +batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ作成') + + +def exec(): + """DCF施設統合マスタ作成""" + + # アルトマーク取込が行われていない場合は処理をスキップする + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') + + pass diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py new file mode 100644 index 00000000..832e430d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py @@ -0,0 +1,21 @@ +from src.batch.common.batch_context import BatchContext +from src.logging.get_logger import get_logger + +batch_context = BatchContext.get_instance() +logger = get_logger('メルク施設統合マスタ') + + +def exec(): + """メルク施設統合マスタ""" + + # 営業日ではない場合、処理をスキップする + if batch_context.is_not_business_day: + logger.info('営業日ではないため、メルク施設統合マスタ作成処理をスキップします。') + return + + # アルトマーク取込が行われていない場合は処理をスキップする + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、メルク施設統合マスタ作成処理をスキップします。') + return + + pass diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py deleted file mode 100644 index a2e52df4..00000000 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_create.py +++ /dev/null @@ -1,3 +0,0 @@ -def exec(): - """メルク施設マスタ作成""" - pass 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 c1884b7d..962b3e12 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -1,11 +1,19 @@ +from src.batch.common.batch_context import BatchContext from src.batch.laundering import emp_chg_inst_laundering from src.logging.get_logger import get_logger +batch_context = BatchContext.get_instance() + logger = get_logger('実績洗替') def exec(): """実績洗替処理""" - logger.info('Start Jisseki Araigae Batch PGM.') + + # 非営業日の場合実績洗替処理は実行しない + if batch_context.is_not_business_day: + logger.info('非営業日のため、実績洗替処理をスキップします。') + return + # 施設担当者洗替 emp_chg_inst_laundering.exec() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 4c331b56..8ddae44a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -66,9 +66,10 @@ def exec_import(): def exec_export(): - # 取り込み日に限らず、毎日実行する """V実消化用施設・薬局薬店データ作成処理""" - pass + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、V実消化用施設・薬局薬店データ作成処理をスキップします。') + return def _import_to_ultmarc_table(dat_file: DatFile): diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 94e8a835..0b865b9b 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -6,7 +6,8 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.laundering import sales_laundering +from src.batch.laundering import (create_dcf_inst_merge, create_mst_inst, + sales_laundering) from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -20,7 +21,7 @@ batch_context = BatchContext.get_instance() def exec(): try: - logger.info('日次ジョブ:開始') + logger.info('日次バッチ:開始') try: # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得 batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() @@ -36,7 +37,7 @@ def exec(): # dump取得が正常終了していない場合、後続の処理は行わない if dump_status_kbn not in [constants.DUMP_STATUS_KBN_COMPLETE, constants.DUMP_STATUS_KBN_DUMP_SKIP]: logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') - return constants.BATCH_EXIT_CODE_SUCCESS # TODO: エラーで返せば、StepFunctionsでリトライしてくれるので、どう返すかは要検討 + return constants.BATCH_EXIT_CODE_SUCCESS logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 @@ -45,7 +46,7 @@ def exec(): # 稼働日かかどうかを、非営業日ファイルをダウンロードして判定 holiday_list_file_path = ConfigBucket().download_holiday_list() holiday_calendar = CalendarFile(holiday_list_file_path) - batch_context.is_not_business_day = not holiday_calendar.compare_date(syor_date) + batch_context.is_not_business_day = holiday_calendar.compare_date(syor_date) # バッチ処理中に更新 try: @@ -54,7 +55,6 @@ def exec(): logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - logger.info('日次処理(アルトマーク)') try: logger.info('アルトマーク取込:起動') ultmarc_process.exec_import() @@ -79,18 +79,16 @@ def exec(): logger.exception(f'V実消化取込処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 非稼働日や、月火水に限らず、必ず実施 - logger.info('メルク施設マスタ作成') try: logger.info('メルク施設マスタ作成:起動') + create_mst_inst.exec() logger.info('メルク施設マスタ作成:終了') except BatchOperationException as e: logger.exception(f'メルク施設マスタ作成 エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - logger.info('日次処理(実績更新)') try: - # ここで、生物由来ロット分解と並行処理 + # TODO: ここで、生物由来ロット分解と並行処理 logger.info('実績更新:起動') sales_laundering.exec() logger.info('生物由来ロット分解:起動') @@ -100,6 +98,16 @@ def exec(): logger.exception(f'実績更新処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + # TODO: ここで並行処理合流 + + try: + logger.info('DCF施設統合マスタ作成:起動') + create_dcf_inst_merge.exec() + logger.info('DCF施設統合マスタ作成:終了') + except BatchOperationException as e: + logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 try: update_batch_process_complete() @@ -108,8 +116,9 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS # 正常終了を保守ユーザーに通知 - logger.info('[NOTICE]日次ジョブ:終了(正常終了)') + logger.info('[NOTICE]日次バッチ:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS + except Exception as e: logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') raise e From 1e6856c51e30d68278fcb1cc353184076320a27a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 17 Apr 2023 11:03:42 +0900 Subject: [PATCH 086/962] =?UTF-8?q?feat:=20=E4=B8=A6=E8=A1=8C=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E8=A9=A6=E4=BD=9C=E5=93=81=E3=80=82=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E5=87=A6=E7=90=86=E3=81=A8=E3=81=8B=E3=81=AE=E6=A4=9C?= =?UTF-8?q?=E8=A8=BC=E3=81=8C=E3=81=BE=E3=81=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/__init__.py | 0 .../batch/bio_sales/create_bio_sale_lot.py | 21 +++++++++++ .../src/batch/common/__init__.py | 0 .../src/batch/laundering/create_mst_inst.py | 4 +-- .../src/batch/laundering/sales_laundering.py | 4 ++- .../src/batch/parallel_processes.py | 35 +++++++++++++++++++ ecs/jskult-batch-daily/src/jobctrl_daily.py | 18 ++++------ 7 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/bio_sales/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py create mode 100644 ecs/jskult-batch-daily/src/batch/common/__init__.py create mode 100644 ecs/jskult-batch-daily/src/batch/parallel_processes.py diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/__init__.py b/ecs/jskult-batch-daily/src/batch/bio_sales/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py new file mode 100644 index 00000000..187afd2d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py @@ -0,0 +1,21 @@ +from src.batch.common.batch_context import BatchContext +from src.logging.get_logger import get_logger + +batch_context = BatchContext.get_instance() +logger = get_logger('生物由来卸販売ロット分解') + + +def exec(): + """生物由来卸販売ロット分解""" + + logger.info('生物由来卸販売ロット分解:起動') + # 営業日ではない場合、処理をスキップする + if batch_context.is_not_business_day: + logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') + return + pass + + logger.info('作成処理') + + logger.info('生物由来卸販売ロット分解:終了') + return diff --git a/ecs/jskult-batch-daily/src/batch/common/__init__.py b/ecs/jskult-batch-daily/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py index 832e430d..45b8ce71 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py @@ -2,11 +2,11 @@ from src.batch.common.batch_context import BatchContext from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() -logger = get_logger('メルク施設統合マスタ') +logger = get_logger('メルク施設統合マスタ作成') def exec(): - """メルク施設統合マスタ""" + """メルク施設統合マスタ作成""" # 営業日ではない場合、処理をスキップする if batch_context.is_not_business_day: 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 962b3e12..cc414616 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -9,7 +9,7 @@ logger = get_logger('実績洗替') def exec(): """実績洗替処理""" - + logger.info('実績更新:起動') # 非営業日の場合実績洗替処理は実行しない if batch_context.is_not_business_day: logger.info('非営業日のため、実績洗替処理をスキップします。') @@ -17,3 +17,5 @@ def exec(): # 施設担当者洗替 emp_chg_inst_laundering.exec() + + logger.info('実績更新:終了') \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py new file mode 100644 index 00000000..2f42ebbb --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -0,0 +1,35 @@ +"""並行処理""" + +import concurrent.futures + +from src.batch.bio_sales import create_bio_sale_lot +from src.batch.laundering import sales_laundering +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('日次処理コントロール(並行処理)') + + +def exec(): + # 並行処理を開始 + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + + # 実績更新 + future_sales_laundering = executor.submit(sales_laundering.exec) + # 生物由来ロット分解 + future_create_bio_sales_lot = executor.submit(create_bio_sale_lot.exec) + + # 両方の処理が完了するまで待つ + concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) + + # エラーがあれば呼び出し元でキャッチする + sales_laundering_exc = future_sales_laundering.exception() + create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() + + # いずれかにエラーが発生していれば、、1つのエラーとして返す。 + if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: + sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' + create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' + raise BatchOperationException(f'並行処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') + + return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 0b865b9b..e0be0809 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,13 +1,13 @@ """実消化&アルトマーク 日次バッチ処理""" from src.aws.s3 import ConfigBucket +from src.batch import parallel_processes from src.batch.batch_functions import ( get_batch_statuses, update_batch_process_complete, update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.laundering import (create_dcf_inst_merge, create_mst_inst, - sales_laundering) +from src.batch.laundering import create_dcf_inst_merge, create_mst_inst from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -88,18 +88,14 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS try: - # TODO: ここで、生物由来ロット分解と並行処理 - logger.info('実績更新:起動') - sales_laundering.exec() - logger.info('生物由来ロット分解:起動') - logger.info('実績更新:終了') - logger.info('生物由来ロット分解:終了') + # 実績生物由来ロット分解と並行処理 + logger.info('並行処理(実績更新-生物由来ロット分解):起動') + parallel_processes.exec() + logger.info('並行処理(実績更新-生物由来ロット分解):終了') except BatchOperationException as e: - logger.exception(f'実績更新処理エラー(異常終了){e}') + logger.exception(f'並行処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # TODO: ここで並行処理合流 - try: logger.info('DCF施設統合マスタ作成:起動') create_dcf_inst_merge.exec() From f3badd63efb2b7c0dba3c22214c6fbee6301f559 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 17 Apr 2023 13:34:48 +0900 Subject: [PATCH 087/962] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/parallel_processes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py index 2f42ebbb..39239909 100644 --- a/ecs/jskult-batch-daily/src/batch/parallel_processes.py +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -26,7 +26,7 @@ def exec(): sales_laundering_exc = future_sales_laundering.exception() create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() - # いずれかにエラーが発生していれば、、1つのエラーとして返す。 + # いずれかにエラーが発生していれば、1つのエラーとして返す。 if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' From 32b5dad3b490114daea2b9b29ebf3c74c2f6591b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 17 Apr 2023 13:39:49 +0900 Subject: [PATCH 088/962] =?UTF-8?q?feat:=20=E4=B8=A6=E5=88=97=E5=87=A6?= =?UTF-8?q?=E7=90=86=E5=86=85=E3=81=A7=E3=81=AF=E3=83=AD=E3=82=B0=E4=B8=8D?= =?UTF-8?q?=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/parallel_processes.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py index 39239909..1b7db6c7 100644 --- a/ecs/jskult-batch-daily/src/batch/parallel_processes.py +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -5,9 +5,6 @@ import concurrent.futures from src.batch.bio_sales import create_bio_sale_lot from src.batch.laundering import sales_laundering from src.error.exceptions import BatchOperationException -from src.logging.get_logger import get_logger - -logger = get_logger('日次処理コントロール(並行処理)') def exec(): From 2083a0250d4e4f8bf2c40de51f1ebc8350fa2f3b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 17 Apr 2023 14:22:21 +0900 Subject: [PATCH 089/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/create_bio_sale_lot.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py index 187afd2d..7d166157 100644 --- a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py @@ -13,9 +13,8 @@ def exec(): if batch_context.is_not_business_day: logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') return - pass - logger.info('作成処理') + # TODO: ここに処理を追記していく logger.info('生物由来卸販売ロット分解:終了') return From 1301aa40099dcfac64e6ef4bfceeb233dcac9b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 17 Apr 2023 16:08:03 +0900 Subject: [PATCH 090/962] =?UTF-8?q?COM=EF=BC=BF=E8=96=AC=E5=B1=80=E3=80=80?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index a086a250..b429f47e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, null_mapper) + com_inst_mapper, com_pharm_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -19,7 +19,7 @@ COM_TABLE_LIST = { # COM_施設 "101": {"00": com_inst_mapper.ComInstMapper}, # COM_薬局 - "102": {"03": null_mapper.NullMapper}, + "102": com_pharm_mapper.ComPharmMapper, # COM_医師勤務先 "502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper}, # COM_専門分野 From e39601ee401f2b38a41b2076b69cc9c2ad1ca3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 17 Apr 2023 16:09:10 +0900 Subject: [PATCH 091/962] =?UTF-8?q?COM=EF=BC=BF=E8=96=AC=E5=B1=80=E3=80=80?= =?UTF-8?q?=E6=96=B0=E8=A6=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 13 +- .../ultmarc/utmp_tables/tables/com_pharm.py | 129 ++++++++++++++++++ 2 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py diff --git a/.vscode/launch.json b/.vscode/launch.json index 753ba49f..7f99ffd0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,21 +5,18 @@ "version": "0.2.0", "configurations": [ { - "name": "Python: データ取り込みローカル実行", + "name": "Batch Sample", "type": "python", "request": "launch", - // windowsだと\区切りかも - "program": "ecs\\dataimport\\dataimport\\controller.py", + "program": "entrypoint.py", "console": "integratedTerminal", "justMyCode": true, "envFile": "${workspaceFolder}/.env" }, - { - "name": "Python: Attach using Process Id", + { "name": "Python: Current File", "type": "python", - "request": "attach", - "processId": "${command:pickProcess}", - "justMyCode": true + "request": "test", + "console": "integratedTerminal" } ] } \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py new file mode 100644 index 00000000..3824ec3e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py @@ -0,0 +1,129 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPharm(UltmarcTable): + """レイアウト区分102: COM_薬局""" + dcfhp_id: str # DCF コード(ID) + dcfhp_code: str # DCF コード(コード) + dcfhp_yobi: str # DCF コード(予備) + maint_flag: str # 修正区分 + maintdate: str # メンテナンス年月日 + # 予備/転送年月日(未使用) + unconf_flg: str # 未確認フラグ + del_cd: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_cd: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + prefc_cd: str # 住所コード(県コード) + city_cd: str # 住所コード(市区町村コード) + addrcode1: str # 住所コード(大字・通称コード) + addrcode2: str # 住所コード(字・丁目コード) + zip_code: str # 郵便番号 + addr: str # 住所(漢字) + addr_kana: str # 住所(カナ) + addr_number: str # 住所表示番号 + addrkanjcnt1: str # 住所文字カウント:漢字(県) + addrkanjcnt2: str # 住所文字カウント:漢字(市区町村) + addrkanjcnt3: str # 住所文字カウント:漢字(大字・通称) + addrkanjcnt4: str # 住所文字カウント:漢字(字・丁目) + addrkanacnt1: str # 住所文字カウント:カナ(県) + addrkanacnt2: str # 住所文字カウント:カナ(市区町村) + addrkanacnt3: str # 住所文字カウント:カナ(大字・通称) + addrkanacnt4: str # 住所文字カウント:カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + tel_number: str # 電話番号 + mgtclass_code: str # 経営体 + hpclass_code: str # 施設区分 + president: str # 代表者(漢字) + president_Kana: str # 代表者(カナ) + open_flag: str # 開業予定(フラグ) + open_yearmonth: str # 開業予定(年月) + close_flg: str # 休院(休院フラグ) + close_yearmonth: str # 休院(開始年月) + pharmacist: str # 管理薬剤師名(漢字) + pharmacist_kana: str # 管理薬剤師名(カナ) + franchise_hq_id: str # チェーン店本部コード(レコードID) + franchise_hq_cd: str # チェーン店本部コード(施設コード) + franchise_hq_yobi: str # チェーン店本部コード(予備) + + dcfdsf_inst_cd: str # 施設コード + village_code: str # 町字コード + addr_count_kana: str # 住所カウントカナ + addr_count: str # 住所カウント + dup_opp_cd: str # 重複時相手先コード + franchise_hq_cd: str # チェーン店本部コード + + def __init__(self, record: list[str]): + super().__init__(record) + + self.dcfhp_id = record[2] # DCF コード(ID) + self.dcfhp_cd = record[3] # DCF コード(コード) + self.dcfhp_yobi = record[4] # DCF コード(予備) + self.maint_flag = record[5] # 修正区分 + self.maintdate = record[6] # メンテナンス年月日 + # 予備/転送年月日(未使用) + self.unconf_flg = record[8].strip() # 未確認フラグ + self.del_cd = record[9].strip() # 削除予定理由 + self.duphp_id = record[10].strip() # 重複時相手先コード(レコードID) + self.duphp_cd = record[11].strip() # 重複時相手先コード(施設コード) + self.duphp_yobi = record[12].strip() # 重複時相手先コード(予備) + self.hp_name = record[13].strip() # 正式施設名(漢字) + self.hp_name_kana = record[14].strip() # 正式施設名(カナ) + self.hp_ryaku_name = record[15].strip() # 略式施設名(漢字) + self.hp_ryaku_name_kana = record[16].strip() # 略式施設名(カナ) + self.hp_addr_lost_code = record[17].strip() # 住所不明 + self.prefc_cd = record[18].strip() # 住所コード(県コード) + self.city_cd = record[19].strip() # 住所コード(市区町村コード) + self.addrcode1 = record[20].strip() # 住所コード(大字・通称コード) + self.addrcode2 = record[21].strip() # 住所コード(字・丁目コード) + self.zip_code = record[22].strip() # 郵便番号 + self.addr = record[23] # 住所(漢字) + self.addr_kana = record[24] # 住所(カナ) + self.addr_number = record[25] # 住所表示番号 + self.addrkanjcnt1 = record[26].strip() # 住所文字カウント:漢字(県) + self.addrkanjcnt2 = record[27].strip() # 住所文字カウント:漢字(市区町村) + self.addrkanjcnt3 = record[28].strip() # 住所文字カウント:漢字(大字・通称) + self.addrkanjcnt4 = record[29].strip() # 住所文字カウント:漢字(字・丁目) + self.addrkanacnt1 = record[30].strip() # 住所文字カウント:カナ(県) + self.addrkanacnt2 = record[31].strip() # 住所文字カウント:カナ(市区町村) + self.addrkanacnt3 = record[32].strip() # 住所文字カウント:カナ(大字・通称) + self.addrkanacnt4 = record[33].strip() # 住所文字カウント:カナ(字・丁目) + self.tel_nothing_flag = record[34].strip() # 電話番号なしフラグ + self.tel_number = record[35].strip() # 電話番号 + self.mgtclass_code = record[36].strip() # 経営体 + self.hpclass_code = record[37].strip() # 施設区分 + self.president = record[38] .strip() # 代表者(漢字) + self.president_Kana = record[39].strip() # 代表者(カナ) + self.open_flag = record[40].strip() # 開業予定(フラグ) + self.open_yearmonth = record[41].strip() # 開業予定(年月) + self.close_flg = record[42].strip() # 休院(休院フラグ) + self.close_yearmonth = record[43].strip() # 休院(開始年月) + self.pharmacist = record[44] # 管理薬剤師名(漢字) + self.pharmacist_kana = record[45] # 管理薬剤師名(カナ) + self.franchise_hq_id = record[46] # チェーン店本部コード(レコードID) + self.franchise_hq_cd = record[47] # チェーン店本部コード(施設コード) + self.franchise_hq_yobi = record[48] # チェーン店本部コード(予備) + + # 施設コード(2+3+4) + self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi]) + + # 町字コード(18+19+20+21) + self.village_code = ''.join([self.prefc_cd, self.city_cd, self.addrcode1, self.addrcode2]) + + # 住所カウントカナ(30+31+32+33) + self.addr_count_kana = ''.join([self.addrkanacnt1, self.addrkanacnt2, self.addrkanacnt3, self.addrkanacnt4]) + + # 住所カウント(26+27+28+29) + self.addr_count = ''.join([self.addrkanjcnt1, self.addrkanjcnt2, self.addrkanjcnt3, self.addrkanjcnt4]) + + # 重複時相手先コード(10+11+12) + self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi]) + + # チェーン店本部コード(46+47+48) + self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_cd, self.franchise_hq_yobi]) + From 7c2e10fe3b0edf3ee61dfb95460a35e8ca39f82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 17 Apr 2023 16:09:48 +0900 Subject: [PATCH 092/962] =?UTF-8?q?COM=5F=E8=96=AC=E5=B1=80=E3=80=80?= =?UTF-8?q?=E6=96=B0=E8=A6=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 312 ++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py new file mode 100644 index 00000000..13ea6033 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -0,0 +1,312 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_pharm import ComPharm + +class ComPharmMapper(UltmarcTableMapper): + """レイアウト区分102: COM_薬局 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_pharm + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_pharm + ( + dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + dup_opp_cd, + supervising_pharmacist, + supervising_pharmacist_kana, + franchise_hq_cd, + inst_pharm_div, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_cd, + :hpclass_code, + :hp_addr_lost_code, + :hp_name_kana, + :hp_ryaku_name_kana, + :hp_name, + :hp_ryaku_name, + :close_flg, + :open_flag, + :close_yearmonth, + :open_yearmonth, + :president_Kana, + :president, + :tel_nothing_flag, + :unconf_flg, + :tel_number, + :addr_kana, + :addr, + :zip_code, + :village_code, + :prefc_cd, + :city_cd, + :addr_number, + :addr_count_kana, + :addr_count, + :mgtclass_code, + :del_cd, + :dup_opp_cd, + :pharmacist, + :pharmacist_kana, + :franchise_hq_cd, + 2, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_pharm + SET + {update_columns} + sys_regist_date = :execute_datetime, + regist_prgm_id = :program_name, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 廃業年月日 ← メンテナンス年月日 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_pharm + SET + abolish_ymd = :maintdate, + delete_sche_reason_cd = :del_cd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + """ + record: ComPharm + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPharm) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 追加、更新の場合 + update_columns = ','.join(self.__make_upsert_query(self)) + if len(update_columns) > 0: + # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる + update_columns += ',' + + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + + self.queries.append(update_query) + return + + def __make_upsert_query(self): + set_clauses = [] # 設定項目 + + #### 設定項目の判定 #### + # DCFDSF施設コード(主キーなので更新対象外) + + # 施設区分コード + if self.record.hpclass_code != '': + set_clauses.append('inst_div_cd = :hpclass_code') + + # 住所不明理由コード + if self.record.hp_addr_lost_code != '': + set_clauses.append('addr_unknown_rea:hp_addr_lost_code') + self.query_parameter['hp_addr_lost_code'] = None if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code + + # 正式施設名カナ + if self.record.hp_name_kana != '': + set_clauses.append('form_inst_name_kana = :hp_name_kana') + + # 施設名カナ + if self.record.hp_ryaku_name_kana != '': + set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') + + # 正式施設名(漢字) + if self.record.hp_name != '': + set_clauses.append('form_inst_name_kanji = :hp_name') + + # 施設名(漢字) + if self.record.hp_ryaku_name != '': + set_clauses.append('inst_name_kanji = :hp_ryaku_name') + + # 休院フラグ、休院予定年月 + if len(self.record.close_flg + self.record.close_yearmonth) > 0: + set_clauses.append('close_flg = :close_flg') + set_clauses.append('close_start_ym = :close_yearmonth') + if self.record.close_flg == '@': + self.query_parameter['close_flg'] = None + self.query_parameter['close_yearmonth'] = None + else: + self.record.close_flg + self.record.close_yearmonth + + # 開業予定フラグ、開業予定年月 + if len(self.record.open_flag + self.record.open_yearmonth) > 0: + set_clauses.append('estab_sche_flg = :open_flag') + set_clauses.append('estab_sche_ym = :open_yearmonth') + if self.record.open_flag == '@': + self.query_parameter['open_flag'] = None + self.query_parameter['open_yearmonth'] = None + else: + self.record.open_flag + self.record.open_yearmonth + + # 施設代表者カナ + if self.record.president_Kana != '': + set_clauses.append('inst_repre_kana = :president_Kana') + self.query_parameter['president_Kana'] = None if self.record.president_Kana == '@' else self.record.president_Kana + + # 施設代表者 ※@が大文字 + if self.record.president != '': + set_clauses.append('inst_repre = :president') + self.query_parameter['president'] = None if self.record.president == '@' else self.record.president + + # 電話番号なしフラグ + if self.record.tel_nothitel_nothing_flagng_flag_flg != '': + set_clauses.append('phone_number_non = :tel_nothing_flag') + self.query_parameter['tel_nothing_flag'] = None if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag + + # 未確認フラグ + if self.record.unconf_flg != '': + set_clauses.append('unconf_flg = :unconf_flg') + self.query_parameter['unconf_flg'] = None if self.record.unconf_flg == '@' else self.record.unconf_flg + + # 施設電話番号 + if self.record.tel_number != '': + set_clauses.append('inst_phone_number = :tel_number') + self.query_parameter['tel_number'] = None if self.record.tel_number == '@' else self.record.tel_number + + # 施設住所カナ + if self.record.addr_kana != '': + set_clauses.append('inst_addr_kana = :addr_kana') + + # 施設住所 + if self.record.addr != '': + set_clauses.append('inst_addr = :addr') + + # 郵便番号 + if self.record.zip_code != '': + set_clauses.append('postal_number = :zip_code') + + # 町字コード(住所コード) + if len(self.record.village_code) > 0: + set_clauses.append('village_cd = :village_code') # 住所コード + set_clauses.append('prefc_cd = :prefc_cd') # 都道府県コード + set_clauses.append('city_cd = :city_cd') # 市区町村コード + self.record.village_code + self.record.prefc_cd + self.record.city_cd + + # 住所表示番号 + if self.record.addr_number != '': + set_clauses.append('addr_display_number = :addr_number') + self.query_parameter['addr_number'] = None if self.record.addr_number == '@' else self.record.addr_number + + # 住所カウント(集合項目である県コードが入っていればカウントをセットする) + if len(self.record.prefc_cd) > 0: + set_clauses.append('addr_cnt = :addr_count') # 住所カウント + set_clauses.append('addr_cnt_kana = :addr_count_kana') # 住所カウントカナ + self.record.addr_count + self.record.addr_count_kana + + # 経営体コード + if self.record.mgtclass_code != '': + set_clauses.append('manage_cd = :mgtclass_code') + self.query_parameter['mgtclass_code'] = None if self.record.mgtclass_code == '@' else self.record.mgtclass_code + + # 削除予定理由コード + if self.record.del_cd != '': + set_clauses.append('delete_sche_reason_cd = :del_cd') + self.query_parameter['del_cd'] = None if self.record.del_cd == '@' else self.record.del_cd + + # 重複時相手先コード + if self.record.dup_opp_cd != '': + set_clauses.append('dup_opp_cd = :dup_opp_cd') + self.query_parameter['dup_opp_cd'] = None if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd + + # 管理薬剤師名(漢字) + if self.record.pharmacist != '': + set_clauses.append('supervising_pharmacist = :pharmacist') + self.query_parameter['pharmacist'] = None if self.record.pharmacist == '@' else self.record.pharmacist + + # 管理薬剤師名(カナ) + if self.record.pharmacist_kana != '': + set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana') + self.query_parameter['pharmacist_kana'] = None if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana + + # チェーン店本部コード + if self.record.franchise_hq_id != '': + set_clauses.append('franchise_hq_cd = :franchise_hq_cd') + if self.record.franchise_hq_id == '@': + self.query_parameter['close_flg'] = None + self.query_parameter['close_yearmonth'] = None + self.query_parameter['franchise_hq_yobi'] = None + else: + self.record.franchise_hq_id + self.record.franchise_hq_cd + self.record.franchise_hq_yobi + + + return set_clauses \ No newline at end of file From 7f9a9e2277b025e45574194ba22157bc1bb16256 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 17 Apr 2023 16:44:08 +0900 Subject: [PATCH 093/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3=E3=80=81=E3=82=BF=E3=83=96=E6=96=87?= =?UTF-8?q?=E5=AD=97=E3=82=924=E3=82=B9=E3=83=9A=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 20 +- .../ultmarc/utmp_tables/tables/com_pharm.py | 202 +++++++++--------- 2 files changed, 110 insertions(+), 112 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 13ea6033..e7add5f6 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -2,6 +2,7 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.batch.ultmarc.utmp_tables.tables.com_pharm import ComPharm + class ComPharmMapper(UltmarcTableMapper): """レイアウト区分102: COM_薬局 登録処理 """ @@ -159,11 +160,11 @@ class ComPharmMapper(UltmarcTableMapper): self.queries.append(update_query) return - - def __make_upsert_query(self): - set_clauses = [] # 設定項目 - #### 設定項目の判定 #### + def __make_upsert_query(self): + set_clauses = [] # 設定項目 + + # 設定項目の判定 # DCFDSF施設コード(主キーなので更新対象外) # 施設区分コード @@ -197,7 +198,7 @@ class ComPharmMapper(UltmarcTableMapper): set_clauses.append('close_start_ym = :close_yearmonth') if self.record.close_flg == '@': self.query_parameter['close_flg'] = None - self.query_parameter['close_yearmonth'] = None + self.query_parameter['close_yearmonth'] = None else: self.record.close_flg self.record.close_yearmonth @@ -208,7 +209,7 @@ class ComPharmMapper(UltmarcTableMapper): set_clauses.append('estab_sche_ym = :open_yearmonth') if self.record.open_flag == '@': self.query_parameter['open_flag'] = None - self.query_parameter['open_yearmonth'] = None + self.query_parameter['open_yearmonth'] = None else: self.record.open_flag self.record.open_yearmonth @@ -263,7 +264,7 @@ class ComPharmMapper(UltmarcTableMapper): if self.record.addr_number != '': set_clauses.append('addr_display_number = :addr_number') self.query_parameter['addr_number'] = None if self.record.addr_number == '@' else self.record.addr_number - + # 住所カウント(集合項目である県コードが入っていればカウントをセットする) if len(self.record.prefc_cd) > 0: set_clauses.append('addr_cnt = :addr_count') # 住所カウント @@ -302,11 +303,10 @@ class ComPharmMapper(UltmarcTableMapper): if self.record.franchise_hq_id == '@': self.query_parameter['close_flg'] = None self.query_parameter['close_yearmonth'] = None - self.query_parameter['franchise_hq_yobi'] = None + self.query_parameter['franchise_hq_yobi'] = None else: self.record.franchise_hq_id self.record.franchise_hq_cd self.record.franchise_hq_yobi - - return set_clauses \ No newline at end of file + return set_clauses diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py index 3824ec3e..65b20c7d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py @@ -3,53 +3,53 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComPharm(UltmarcTable): """レイアウト区分102: COM_薬局""" - dcfhp_id: str # DCF コード(ID) - dcfhp_code: str # DCF コード(コード) - dcfhp_yobi: str # DCF コード(予備) - maint_flag: str # 修正区分 - maintdate: str # メンテナンス年月日 - # 予備/転送年月日(未使用) - unconf_flg: str # 未確認フラグ - del_cd: str # 削除予定理由 - duphp_id: str # 重複時相手先コード(レコードID) - duphp_cd: str # 重複時相手先コード(施設コード) - duphp_yobi: str # 重複時相手先コード(予備) - hp_name: str # 正式施設名(漢字) - hp_name_kana: str # 正式施設名(カナ) - hp_ryaku_name: str # 略式施設名(漢字) - hp_ryaku_name_kana: str # 略式施設名(カナ) - hp_addr_lost_code: str # 住所不明 - prefc_cd: str # 住所コード(県コード) - city_cd: str # 住所コード(市区町村コード) - addrcode1: str # 住所コード(大字・通称コード) - addrcode2: str # 住所コード(字・丁目コード) - zip_code: str # 郵便番号 - addr: str # 住所(漢字) - addr_kana: str # 住所(カナ) - addr_number: str # 住所表示番号 - addrkanjcnt1: str # 住所文字カウント:漢字(県) - addrkanjcnt2: str # 住所文字カウント:漢字(市区町村) - addrkanjcnt3: str # 住所文字カウント:漢字(大字・通称) - addrkanjcnt4: str # 住所文字カウント:漢字(字・丁目) - addrkanacnt1: str # 住所文字カウント:カナ(県) - addrkanacnt2: str # 住所文字カウント:カナ(市区町村) - addrkanacnt3: str # 住所文字カウント:カナ(大字・通称) - addrkanacnt4: str # 住所文字カウント:カナ(字・丁目) - tel_nothing_flag: str # 電話番号なしフラグ - tel_number: str # 電話番号 - mgtclass_code: str # 経営体 - hpclass_code: str # 施設区分 - president: str # 代表者(漢字) - president_Kana: str # 代表者(カナ) - open_flag: str # 開業予定(フラグ) - open_yearmonth: str # 開業予定(年月) - close_flg: str # 休院(休院フラグ) - close_yearmonth: str # 休院(開始年月) - pharmacist: str # 管理薬剤師名(漢字) - pharmacist_kana: str # 管理薬剤師名(カナ) - franchise_hq_id: str # チェーン店本部コード(レコードID) - franchise_hq_cd: str # チェーン店本部コード(施設コード) - franchise_hq_yobi: str # チェーン店本部コード(予備) + dcfhp_id: str # DCF コード(ID) + dcfhp_code: str # DCF コード(コード) + dcfhp_yobi: str # DCF コード(予備) + maint_flag: str # 修正区分 + maintdate: str # メンテナンス年月日 + pass # 予備/転送年月日(未使用) + unconf_flg: str # 未確認フラグ + del_cd: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_cd: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + prefc_cd: str # 住所コード(県コード) + city_cd: str # 住所コード(市区町村コード) + addrcode1: str # 住所コード(大字・通称コード) + addrcode2: str # 住所コード(字・丁目コード) + zip_code: str # 郵便番号 + addr: str # 住所(漢字) + addr_kana: str # 住所(カナ) + addr_number: str # 住所表示番号 + addrkanjcnt1: str # 住所文字カウント:漢字(県) + addrkanjcnt2: str # 住所文字カウント:漢字(市区町村) + addrkanjcnt3: str # 住所文字カウント:漢字(大字・通称) + addrkanjcnt4: str # 住所文字カウント:漢字(字・丁目) + addrkanacnt1: str # 住所文字カウント:カナ(県) + addrkanacnt2: str # 住所文字カウント:カナ(市区町村) + addrkanacnt3: str # 住所文字カウント:カナ(大字・通称) + addrkanacnt4: str # 住所文字カウント:カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + tel_number: str # 電話番号 + mgtclass_code: str # 経営体 + hpclass_code: str # 施設区分 + president: str # 代表者(漢字) + president_Kana: str # 代表者(カナ) + open_flag: str # 開業予定(フラグ) + open_yearmonth: str # 開業予定(年月) + close_flg: str # 休院(休院フラグ) + close_yearmonth: str # 休院(開始年月) + pharmacist: str # 管理薬剤師名(漢字) + pharmacist_kana: str # 管理薬剤師名(カナ) + franchise_hq_id: str # チェーン店本部コード(レコードID) + franchise_hq_cd: str # チェーン店本部コード(施設コード) + franchise_hq_yobi: str # チェーン店本部コード(予備) dcfdsf_inst_cd: str # 施設コード village_code: str # 町字コード @@ -61,69 +61,67 @@ class ComPharm(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.dcfhp_id = record[2] # DCF コード(ID) - self.dcfhp_cd = record[3] # DCF コード(コード) - self.dcfhp_yobi = record[4] # DCF コード(予備) - self.maint_flag = record[5] # 修正区分 - self.maintdate = record[6] # メンテナンス年月日 - # 予備/転送年月日(未使用) - self.unconf_flg = record[8].strip() # 未確認フラグ - self.del_cd = record[9].strip() # 削除予定理由 - self.duphp_id = record[10].strip() # 重複時相手先コード(レコードID) - self.duphp_cd = record[11].strip() # 重複時相手先コード(施設コード) - self.duphp_yobi = record[12].strip() # 重複時相手先コード(予備) - self.hp_name = record[13].strip() # 正式施設名(漢字) - self.hp_name_kana = record[14].strip() # 正式施設名(カナ) - self.hp_ryaku_name = record[15].strip() # 略式施設名(漢字) - self.hp_ryaku_name_kana = record[16].strip() # 略式施設名(カナ) - self.hp_addr_lost_code = record[17].strip() # 住所不明 - self.prefc_cd = record[18].strip() # 住所コード(県コード) - self.city_cd = record[19].strip() # 住所コード(市区町村コード) - self.addrcode1 = record[20].strip() # 住所コード(大字・通称コード) - self.addrcode2 = record[21].strip() # 住所コード(字・丁目コード) - self.zip_code = record[22].strip() # 郵便番号 - self.addr = record[23] # 住所(漢字) - self.addr_kana = record[24] # 住所(カナ) - self.addr_number = record[25] # 住所表示番号 - self.addrkanjcnt1 = record[26].strip() # 住所文字カウント:漢字(県) - self.addrkanjcnt2 = record[27].strip() # 住所文字カウント:漢字(市区町村) - self.addrkanjcnt3 = record[28].strip() # 住所文字カウント:漢字(大字・通称) - self.addrkanjcnt4 = record[29].strip() # 住所文字カウント:漢字(字・丁目) - self.addrkanacnt1 = record[30].strip() # 住所文字カウント:カナ(県) - self.addrkanacnt2 = record[31].strip() # 住所文字カウント:カナ(市区町村) - self.addrkanacnt3 = record[32].strip() # 住所文字カウント:カナ(大字・通称) - self.addrkanacnt4 = record[33].strip() # 住所文字カウント:カナ(字・丁目) - self.tel_nothing_flag = record[34].strip() # 電話番号なしフラグ - self.tel_number = record[35].strip() # 電話番号 - self.mgtclass_code = record[36].strip() # 経営体 - self.hpclass_code = record[37].strip() # 施設区分 - self.president = record[38] .strip() # 代表者(漢字) - self.president_Kana = record[39].strip() # 代表者(カナ) - self.open_flag = record[40].strip() # 開業予定(フラグ) - self.open_yearmonth = record[41].strip() # 開業予定(年月) - self.close_flg = record[42].strip() # 休院(休院フラグ) - self.close_yearmonth = record[43].strip() # 休院(開始年月) - self.pharmacist = record[44] # 管理薬剤師名(漢字) - self.pharmacist_kana = record[45] # 管理薬剤師名(カナ) - self.franchise_hq_id = record[46] # チェーン店本部コード(レコードID) - self.franchise_hq_cd = record[47] # チェーン店本部コード(施設コード) - self.franchise_hq_yobi = record[48] # チェーン店本部コード(予備) + self.dcfhp_id = record[2] + self.dcfhp_cd = record[3] + self.dcfhp_yobi = record[4] + self.maint_flag = record[5] + self.maintdate = record[6] + self.unconf_flg = record[8].strip() + self.del_cd = record[9].strip() + self.duphp_id = record[10].strip() + self.duphp_cd = record[11].strip() + self.duphp_yobi = record[12].strip() + self.hp_name = record[13].strip() + self.hp_name_kana = record[14].strip() + self.hp_ryaku_name = record[15].strip() + self.hp_ryaku_name_kana = record[16].strip() + self.hp_addr_lost_code = record[17].strip() + self.prefc_cd = record[18].strip() + self.city_cd = record[19].strip() + self.addrcode1 = record[20].strip() + self.addrcode2 = record[21].strip() + self.zip_code = record[22].strip() + self.addr = record[23] + self.addr_kana = record[24] + self.addr_number = record[25] + self.addrkanjcnt1 = record[26].strip() + self.addrkanjcnt2 = record[27].strip() + self.addrkanjcnt3 = record[28].strip() + self.addrkanjcnt4 = record[29].strip() + self.addrkanacnt1 = record[30].strip() + self.addrkanacnt2 = record[31].strip() + self.addrkanacnt3 = record[32].strip() + self.addrkanacnt4 = record[33].strip() + self.tel_nothing_flag = record[34].strip() + self.tel_number = record[35].strip() + self.mgtclass_code = record[36].strip() + self.hpclass_code = record[37].strip() + self.president = record[38].strip() + self.president_Kana = record[39].strip() + self.open_flag = record[40].strip() + self.open_yearmonth = record[41].strip() + self.close_flg = record[42].strip() + self.close_yearmonth = record[43].strip() + self.pharmacist = record[44] + self.pharmacist_kana = record[45] + self.franchise_hq_id = record[46] + self.franchise_hq_cd = record[47] + self.franchise_hq_yobi = record[48] # 施設コード(2+3+4) - self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi]) + self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi]) # 町字コード(18+19+20+21) - self.village_code = ''.join([self.prefc_cd, self.city_cd, self.addrcode1, self.addrcode2]) + self.village_code = ''.join([self.prefc_cd, self.city_cd, self.addrcode1, self.addrcode2]) # 住所カウントカナ(30+31+32+33) - self.addr_count_kana = ''.join([self.addrkanacnt1, self.addrkanacnt2, self.addrkanacnt3, self.addrkanacnt4]) + self.addr_count_kana = ''.join([self.addrkanacnt1, self.addrkanacnt2, self.addrkanacnt3, self.addrkanacnt4]) # 住所カウント(26+27+28+29) - self.addr_count = ''.join([self.addrkanjcnt1, self.addrkanjcnt2, self.addrkanjcnt3, self.addrkanjcnt4]) - + self.addr_count = ''.join([self.addrkanjcnt1, self.addrkanjcnt2, self.addrkanjcnt3, self.addrkanjcnt4]) + # 重複時相手先コード(10+11+12) - self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi]) + self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi]) # チェーン店本部コード(46+47+48) - self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_cd, self.franchise_hq_yobi]) - + self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_cd, self.franchise_hq_yobi]) From e6a293bcf50d86b7e92e0daac0210587eef7fe9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 17 Apr 2023 17:01:07 +0900 Subject: [PATCH 094/962] =?UTF-8?q?feat:=20=E5=85=B1=E9=80=9A=E9=83=A8?= =?UTF-8?q?=E5=93=81=E3=82=B9=E3=83=88=E3=82=A2=E3=83=89=E3=83=97=E3=83=AD?= =?UTF-8?q?=E3=82=B7=E3=83=BC=E3=82=B8=E3=83=A3=E2=80=95=20=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E5=87=BA=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../medaca_common/put_error_log.sql | 28 ++++++++++++++++++ .../medaca_common/put_info_log.sql | 29 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 rds_mysql/stored_procedure/medaca_common/put_error_log.sql create mode 100644 rds_mysql/stored_procedure/medaca_common/put_info_log.sql diff --git a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql new file mode 100644 index 00000000..080d4eb9 --- /dev/null +++ b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql @@ -0,0 +1,28 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE medaca_common.put_error_log(schema_name VARCHAR(50), procedure_name VARCHAR(100), + procedure_args VARCHAR(255), message TEXT, error_code VARCHAR(50), error_message VARCHAR(500)) +SQL SECURITY INVOKER +BEGIN + INSERT INTO + medaca_common.procedure_log ( + log_datetime, + log_level, + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ) + VALUES ( + Now(6), + "ERROR", + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ); + +END diff --git a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql new file mode 100644 index 00000000..f41df3d7 --- /dev/null +++ b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql @@ -0,0 +1,29 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE medaca_common.put_info_log( + schema_name VARCHAR(50), procedure_name VARCHAR(100), + procedure_args VARCHAR(255), message TEXT) +SQL SECURITY INVOKER +BEGIN + INSERT INTO + medaca_common.procedure_log ( + log_datetime, + log_level, + schema_name, + procedure_name, + procedure_args, + message, + error_code, + error_message + ) + VALUES ( + Now(6), + "INFO", + schema_name, + procedure_name, + procedure_args, + message, + NULL, + NULL + ); + +END From 05ac4b2c133564a966751d08cc221230eb3d803a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 17 Apr 2023 17:15:56 +0900 Subject: [PATCH 095/962] =?UTF-8?q?feat:=20=E3=82=A4=E3=83=B3=E3=83=87?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/medaca_common/put_error_log.sql | 3 ++- rds_mysql/stored_procedure/medaca_common/put_info_log.sql | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql index 080d4eb9..13272844 100644 --- a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql +++ b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql @@ -1,6 +1,7 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する CREATE PROCEDURE medaca_common.put_error_log(schema_name VARCHAR(50), procedure_name VARCHAR(100), - procedure_args VARCHAR(255), message TEXT, error_code VARCHAR(50), error_message VARCHAR(500)) + procedure_args VARCHAR(255), message TEXT, error_code VARCHAR(50), + error_message VARCHAR(500)) SQL SECURITY INVOKER BEGIN INSERT INTO diff --git a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql index f41df3d7..c6702892 100644 --- a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql +++ b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql @@ -1,7 +1,6 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE medaca_common.put_info_log( - schema_name VARCHAR(50), procedure_name VARCHAR(100), - procedure_args VARCHAR(255), message TEXT) +CREATE PROCEDURE medaca_common.put_info_log(schema_name VARCHAR(50), procedure_name VARCHAR(100), + procedure_args VARCHAR(255), message TEXT) SQL SECURITY INVOKER BEGIN INSERT INTO From f32953c0bfb1e9bc7b445cfb9f7fee07a6ecb969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 17 Apr 2023 17:33:49 +0900 Subject: [PATCH 096/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7f99ffd0..e9ded3b7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "name": "Batch Sample", + "name": "Python: データ取り込みローカル実行", "type": "python", "request": "launch", "program": "entrypoint.py", From b45d1bcdea2b26f535dcccfdd8f450944f57c3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 17 Apr 2023 17:34:44 +0900 Subject: [PATCH 097/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env | 10 ++++++++++ .../table_mapper/concrete/com_pharm_mapper.py | 18 +++--------------- 2 files changed, 13 insertions(+), 15 deletions(-) create mode 100644 ecs/jskult-batch-daily/.env diff --git a/ecs/jskult-batch-daily/.env b/ecs/jskult-batch-daily/.env new file mode 100644 index 00000000..214b488c --- /dev/null +++ b/ecs/jskult-batch-daily/.env @@ -0,0 +1,10 @@ +DB_HOST=localhost +DB_PORT=3306 +DB_USERNAME=root +DB_PASSWORD=admin +DB_SCHEMA=src05 +LOG_LEVEL=INFO +ULTMARC_DATA_BUCKET=**************** +ULTMARC_DATA_FOLDER=recv +ULTMARC_BACKUP_BUCKET=**************** +ULTMARC_BACKUP_FOLDER=ultmarc diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index e7add5f6..60aa4295 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -104,8 +104,6 @@ class ComPharmMapper(UltmarcTableMapper): UPDATE src05.com_pharm SET {update_columns} - sys_regist_date = :execute_datetime, - regist_prgm_id = :program_name, sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE @@ -148,8 +146,8 @@ class ComPharmMapper(UltmarcTableMapper): self.queries.append(self.INSERT_QUERY) return - # 追加、更新の場合 - update_columns = ','.join(self.__make_upsert_query(self)) + # 更新の場合 + update_columns = ','.join(self.__make_update_query(self)) if len(update_columns) > 0: # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる update_columns += ',' @@ -161,7 +159,7 @@ class ComPharmMapper(UltmarcTableMapper): self.queries.append(update_query) return - def __make_upsert_query(self): + def __make_update_query(self): set_clauses = [] # 設定項目 # 設定項目の判定 @@ -199,9 +197,6 @@ class ComPharmMapper(UltmarcTableMapper): if self.record.close_flg == '@': self.query_parameter['close_flg'] = None self.query_parameter['close_yearmonth'] = None - else: - self.record.close_flg - self.record.close_yearmonth # 開業予定フラグ、開業予定年月 if len(self.record.open_flag + self.record.open_yearmonth) > 0: @@ -210,9 +205,6 @@ class ComPharmMapper(UltmarcTableMapper): if self.record.open_flag == '@': self.query_parameter['open_flag'] = None self.query_parameter['open_yearmonth'] = None - else: - self.record.open_flag - self.record.open_yearmonth # 施設代表者カナ if self.record.president_Kana != '': @@ -304,9 +296,5 @@ class ComPharmMapper(UltmarcTableMapper): self.query_parameter['close_flg'] = None self.query_parameter['close_yearmonth'] = None self.query_parameter['franchise_hq_yobi'] = None - else: - self.record.franchise_hq_id - self.record.franchise_hq_cd - self.record.franchise_hq_yobi return set_clauses From 098c7c65fd49649d064a3590d756dc48cce22a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 17 Apr 2023 17:42:28 +0900 Subject: [PATCH 098/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/medaca_common/put_error_log.sql | 2 +- rds_mysql/stored_procedure/medaca_common/put_info_log.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql index 13272844..d87d633c 100644 --- a/rds_mysql/stored_procedure/medaca_common/put_error_log.sql +++ b/rds_mysql/stored_procedure/medaca_common/put_error_log.sql @@ -16,7 +16,7 @@ BEGIN error_message ) VALUES ( - Now(6), + NOW(6), "ERROR", schema_name, procedure_name, diff --git a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql index c6702892..a2224cf1 100644 --- a/rds_mysql/stored_procedure/medaca_common/put_info_log.sql +++ b/rds_mysql/stored_procedure/medaca_common/put_info_log.sql @@ -15,7 +15,7 @@ BEGIN error_message ) VALUES ( - Now(6), + NOW(6), "INFO", schema_name, procedure_name, From 7cb4535634e05e93d0124de57c89b444a395b47f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 17 Apr 2023 17:56:30 +0900 Subject: [PATCH 099/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E6=A9=9F=E8=83=BD=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => src05}/inst_merge_t_create.sql | 18 +++++++++++++++++ .../{ => src05}/v_inst_merge_t_create.sql | 20 +++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) rename rds_mysql/stored_procedure/{ => src05}/inst_merge_t_create.sql (52%) rename rds_mysql/stored_procedure/{ => src05}/v_inst_merge_t_create.sql (55%) diff --git a/rds_mysql/stored_procedure/inst_merge_t_create.sql b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql similarity index 52% rename from rds_mysql/stored_procedure/inst_merge_t_create.sql rename to rds_mysql/stored_procedure/src05/inst_merge_t_create.sql index 62463b53..3d12307a 100644 --- a/rds_mysql/stored_procedure/inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql @@ -7,14 +7,28 @@ BEGIN BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + call medaca_common.put_error_log('internal05', 'src05.inst_merge_t_create', JSON_OBJECT(), + 'src05.inst_merge_t_createでエラーが発生', @error_state, @error_msg); 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('internal05', 'src05.inst_merge_t_create', JSON_OBJECT(), + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成① 開始' + ); + TRUNCATE TABLE internal05.inst_merge_t; + call medaca_common.put_info_log('internal05', 'src05.inst_merge_t_create', JSON_OBJECT(), + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成① 終了' + ); + + call medaca_common.put_info_log('internal05', 'src05.inst_merge_t_create', JSON_OBJECT(), + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 開始' + ); + INSERT INTO internal05.inst_merge_t ( dcf_dsf_inst_cd, @@ -41,4 +55,8 @@ BEGIN AND dim.muko_flg = '0' AND dim.enabled_flg = 'Y'; + call medaca_common.put_info_log('internal05', 'src05.inst_merge_t_create', JSON_OBJECT(), + 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 終了' + ); + END diff --git a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql similarity index 55% rename from rds_mysql/stored_procedure/v_inst_merge_t_create.sql rename to rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql index f9b5eb30..665c4ec5 100644 --- a/rds_mysql/stored_procedure/v_inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql @@ -7,14 +7,25 @@ BEGIN BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + call medaca_common.put_error_log('internal05', 'src05.v_inst_merge_t_create', JSON_OBJECT(), + 'src05.v_inst_merge_t_createでエラーが発生', @error_state, @error_msg); 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('internal05', 'src05.v_inst_merge_t_create', JSON_OBJECT(), + '【洗替】3:HCO施設コードの洗替① 開始'); + TRUNCATE TABLE internal05.v_inst_merge_t; + call medaca_common.put_info_log('internal05', 'src05.v_inst_merge_t_create', JSON_OBJECT(), + '【洗替】3:HCO施設コードの洗替① 終了'); + + call medaca_common.put_info_log('internal05', 'src05.v_inst_merge_t_create', JSON_OBJECT(), + '【洗替】3:HCO施設コードの洗替② 開始'); + INSERT INTO internal05.v_inst_merge_t ( v_inst_cd, @@ -48,9 +59,10 @@ BEGIN 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 ((fcl_type IN ('A1','A0')) OR fcl_type BETWEEN '20' AND '29') - AND fmv.rec_sts_kbn != '9' - ORDER BY - STR_TO_DATE(vhmv.apply_dt, '%Y-%m-%d') ASC; + AND ((fmv.fcl_type IN ('A1','A0')) OR fmv.fcl_type BETWEEN '20' AND '29') + AND fmv.rec_sts_kbn != '9'; + + call medaca_common.put_info_log('internal05', 'src05.v_inst_merge_t_create', JSON_OBJECT(), + '【洗替】3:HCO施設コードの洗替② 終了' ); END From 0ba58666a7e5ae2951110403315df38dab2e28c8 Mon Sep 17 00:00:00 2001 From: "asuka.asakura" Date: Mon, 17 Apr 2023 18:26:07 +0900 Subject: [PATCH 100/962] =?UTF-8?q?NEWDWH2021-1057=20=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=95=E3=82=A1=E3=83=B3=E3=82=AF=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src05/src05_create_function.sql | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 rds_mysql/stored_procedure/src05/src05_create_function.sql diff --git a/rds_mysql/stored_procedure/src05/src05_create_function.sql b/rds_mysql/stored_procedure/src05/src05_create_function.sql new file mode 100644 index 00000000..e4e8cba3 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/src05_create_function.sql @@ -0,0 +1,19 @@ +-- 処理日取得(date型) +delimiter // +CREATE FUNCTION src05.get_syor_date() +RETURNS date DETERMINISTIC +BEGIN + RETURN (SELECT STR_TO_DATE(syor_date,'%Y%m%d') FROM src05.hdke_tbl); +END +// +delimiter; + +-- 年月を日付加工(date型) +delimiter // +CREATE FUNCTION src05.to_date_yyyymm01(yyyymm varchar(6)) +RETURNS date DETERMINISTIC +BEGIN + RETURN (STR_TO_DATE(CONCAT(yyyymm,'01'),'%Y%m%d')); +END +// +delimiter; From 86d055a1a3e25ef040ad441aa8763a36211cdc17 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 10:15:36 +0900 Subject: [PATCH 101/962] =?UTF-8?q?feat:=20=E3=83=91=E3=83=83=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/{laundering => institution}/create_dcf_inst_merge.py | 0 .../src/batch/{laundering => institution}/create_mst_inst.py | 0 ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py | 2 +- ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename ecs/jskult-batch-daily/src/batch/{laundering => institution}/create_dcf_inst_merge.py (100%) rename ecs/jskult-batch-daily/src/batch/{laundering => institution}/create_mst_inst.py (100%) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/institution/create_dcf_inst_merge.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py rename to ecs/jskult-batch-daily/src/batch/institution/create_dcf_inst_merge.py diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/institution/create_mst_inst.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py rename to ecs/jskult-batch-daily/src/batch/institution/create_mst_inst.py 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 cc414616..72f638d4 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -18,4 +18,4 @@ def exec(): # 施設担当者洗替 emp_chg_inst_laundering.exec() - logger.info('実績更新:終了') \ No newline at end of file + logger.info('実績更新:終了') diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index e0be0809..1c0b8608 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,7 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.laundering import create_dcf_inst_merge, create_mst_inst +from src.batch.institution import create_dcf_inst_merge, create_mst_inst from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger From f3e8c5a0670befc11788aedce770be866a86a6db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 18 Apr 2023 10:47:44 +0900 Subject: [PATCH 102/962] =?UTF-8?q?feat:=20=E6=B4=97=E3=81=84=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E7=94=A8=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E5=87=A6=E7=90=86=E7=94=A8=E3=81=AEpython=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/datachange/res_mak_inst_lau.py | 20 +++++++++++++++ .../src/batch/jissekiaraigae.py | 25 +++++++++++-------- ecs/jskult-batch-daily/src/db/database.py | 5 +++- 3 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/datachange/res_mak_inst_lau.py diff --git a/ecs/jskult-batch-daily/src/batch/datachange/res_mak_inst_lau.py b/ecs/jskult-batch-daily/src/batch/datachange/res_mak_inst_lau.py new file mode 100644 index 00000000..bfd359a1 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/datachange/res_mak_inst_lau.py @@ -0,0 +1,20 @@ +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('実績洗替') + + +def batch_process(): + db = Database.get_instance() + try: + db.connect() + except Exception as e: + logger.info("実績洗替 データベース接続に失敗") + raise BatchOperationException(e) + + logger.info('実績洗替 開始') + db.execute('CALL src05.v_inst_merge_t_create()') + db.execute('CALL src05.inst_merge_t_create()') + db.disconnect() + logger.info('実績洗替 終了') diff --git a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py b/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py index 7f5d9fcf..93895f77 100644 --- a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py +++ b/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py @@ -1,11 +1,14 @@ -from src.batch.datachange import emp_chg_inst_lau -from src.logging.get_logger import get_logger - -logger = get_logger('実績洗替') - - -def batch_process(): - """実績洗替処理""" - logger.info('Start Jisseki Araigae Batch PGM.') - # 施設担当者洗替 - emp_chg_inst_lau.batch_process() +from src.batch.datachange import emp_chg_inst_lau +from src.batch.datachange import res_mak_inst_lau +from src.logging.get_logger import get_logger + +logger = get_logger('実績洗替') + + +def batch_process(): + """実績洗替処理""" + logger.info('Start Jisseki Araigae Batch PGM.') + # 洗替用マスタ作成 + res_mak_inst_lau.batch_process() + # 施設担当者洗替 + emp_chg_inst_lau.batch_process() diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py index 7e8f845c..0317bc21 100644 --- a/ecs/jskult-batch-daily/src/db/database.py +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -83,7 +83,10 @@ class Database: Raises: DBException: 接続失敗 """ - self.__connection = self.__engine.connect() + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) def execute_select(self, select_query: str, parameters=None) -> list[dict]: """SELECTクエリを実行します。 From 26db202b5e9644ef38ad5be643832ac6418f2ad0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 11:10:41 +0900 Subject: [PATCH 103/962] =?UTF-8?q?feat:=20=E6=B4=97=E3=81=84=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E5=87=A6=E7=90=86=E3=81=AE=E4=B8=80=E9=83=A8=E3=81=A7?= =?UTF-8?q?=E3=81=AF=E3=81=82=E3=82=8B=E3=81=9F=E3=82=81=E3=80=81=E3=82=84?= =?UTF-8?q?=E3=81=A3=E3=81=B1=E3=82=8A=E3=82=82=E3=81=A8=E3=81=AB=E6=88=BB?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/{institution => laundering}/create_dcf_inst_merge.py | 0 .../src/batch/{institution => laundering}/create_mst_inst.py | 0 ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename ecs/jskult-batch-daily/src/batch/{institution => laundering}/create_dcf_inst_merge.py (100%) rename ecs/jskult-batch-daily/src/batch/{institution => laundering}/create_mst_inst.py (100%) diff --git a/ecs/jskult-batch-daily/src/batch/institution/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/institution/create_dcf_inst_merge.py rename to ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py diff --git a/ecs/jskult-batch-daily/src/batch/institution/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/institution/create_mst_inst.py rename to ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 1c0b8608..e0be0809 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,7 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.institution import create_dcf_inst_merge, create_mst_inst +from src.batch.laundering import create_dcf_inst_merge, create_mst_inst from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger From 31b5d6a6915aea18fdc81cd5e33088ff7127aeb2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 11:51:36 +0900 Subject: [PATCH 104/962] =?UTF-8?q?feat:=20dump=E6=9C=AA=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E3=81=A8=E3=81=84=E3=81=86=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=82=92=E7=84=A1=E3=81=8F=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- ecs/jskult-batch-daily/src/system_var/constants.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index e0be0809..b6926e5c 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -35,7 +35,7 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない - if dump_status_kbn not in [constants.DUMP_STATUS_KBN_COMPLETE, constants.DUMP_STATUS_KBN_DUMP_SKIP]: + if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-batch-daily/src/system_var/constants.py b/ecs/jskult-batch-daily/src/system_var/constants.py index 26e1c1a8..8a0ccbb3 100644 --- a/ecs/jskult-batch-daily/src/system_var/constants.py +++ b/ecs/jskult-batch-daily/src/system_var/constants.py @@ -9,8 +9,6 @@ BATCH_ACTF_BATCH_IN_PROCESSING = '1' DUMP_STATUS_KBN_UNPROCESSED = '0' # dump取得状態区分:dump取得正常終了 DUMP_STATUS_KBN_COMPLETE = '2' -# dump取得状態区分:dump取得スキップ -DUMP_STATUS_KBN_DUMP_SKIP = '3' # カレンダーファイルのコメントシンボル CALENDAR_COMMENT_SYMBOL = '#' From 24c0af39c25045f79136f2d057e96f5a28326b3a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 12:02:53 +0900 Subject: [PATCH 105/962] =?UTF-8?q?style:=20=E3=83=AD=E3=82=B0=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/sales_laundering.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 72f638d4..7b77d8ac 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -10,9 +10,9 @@ logger = get_logger('実績洗替') def exec(): """実績洗替処理""" logger.info('実績更新:起動') - # 非営業日の場合実績洗替処理は実行しない + # 営業日ではない場合、実績洗替処理は実行しない if batch_context.is_not_business_day: - logger.info('非営業日のため、実績洗替処理をスキップします。') + logger.info('営業日ではないため、実績洗替処理をスキップします。') return # 施設担当者洗替 From e0175b3228bb44f537ade7c25fc408203e90f196 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 12:04:30 +0900 Subject: [PATCH 106/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index b6926e5c..ca9b0022 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -105,11 +105,13 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 + logger.info('業務日付更新・バッチステータスリフレッシュ:起動') try: update_batch_process_complete() except BatchOperationException as e: - logger.exception(f'日次バッチ完了処理 エラー(異常終了){e}') + logger.exception(f'業務日付更新・バッチステータスリフレッシュ エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('業務日付更新・バッチステータスリフレッシュ:終了') # 正常終了を保守ユーザーに通知 logger.info('[NOTICE]日次バッチ:終了(正常終了)') From f0b91c6a748ca21449ce8fa2e198d206506dc01e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 12:22:45 +0900 Subject: [PATCH 107/962] =?UTF-8?q?fix:=20=E3=83=A1=E3=83=AB=E3=82=AF?= =?UTF-8?q?=E6=96=BD=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E5=87=A6=E7=90=86=E8=B5=B7=E5=8B=95=E5=88=A4=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/create_mst_inst.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py index 45b8ce71..6b499a71 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py @@ -2,20 +2,15 @@ from src.batch.common.batch_context import BatchContext from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() -logger = get_logger('メルク施設統合マスタ作成') +logger = get_logger('メルク施設マスタ作成') def exec(): - """メルク施設統合マスタ作成""" + """メルク施設マスタ作成""" - # 営業日ではない場合、処理をスキップする - if batch_context.is_not_business_day: - logger.info('営業日ではないため、メルク施設統合マスタ作成処理をスキップします。') - return - - # アルトマーク取込が行われていない場合は処理をスキップする - if not batch_context.is_ultmarc_imported: - logger.info('アルトマーク取込が行われていないため、メルク施設統合マスタ作成処理をスキップします。') + # 営業日ではないかつ、アルトマーク取込が行われていない場合は処理をスキップする + if batch_context.is_not_business_day is True and batch_context.is_ultmarc_imported is not True: + logger.info('営業日ではない、かつ、アルトマーク取込が行われていないため、メルク施設マスタ作成処理をスキップします。') return pass From 73a234462a7b9511a6813c4e5bcc46876d1e0418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 18 Apr 2023 14:48:21 +0900 Subject: [PATCH 108/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/src05/v_inst_merge_t_create.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 d550d121..fb609b8c 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 @@ -23,15 +23,15 @@ BEGIN SET @error_state = NULL, @error_msg = NULL; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】3:HCO施設コードの洗替① 開始'); + 'V施設統合マスタ(洗替処理一時テーブル)作成① 開始'); TRUNCATE TABLE internal05.v_inst_merge_t; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】3:HCO施設コードの洗替① 終了'); + 'V施設統合マスタ(洗替処理一時テーブル)作成① 終了'); call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】3:HCO施設コードの洗替② 開始'); + 'V施設統合マスタ(洗替処理一時テーブル)作成② 開始'); INSERT INTO internal05.v_inst_merge_t ( @@ -70,6 +70,6 @@ BEGIN AND fmv.rec_sts_kbn != '9'; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】3:HCO施設コードの洗替② 終了' ); + 'V施設統合マスタ(洗替処理一時テーブル)作成② 終了' ); END From 51512a55c579a30e7199b71c294cb0af4360c2ac Mon Sep 17 00:00:00 2001 From: "asuka.asakura" Date: Tue, 18 Apr 2023 17:40:01 +0900 Subject: [PATCH 109/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/src05/get_syor_date.sql | 8 ++++++++ .../src05/src05_create_function.sql | 19 ------------------- .../src05/to_date_yyyymm01.sql | 8 ++++++++ 3 files changed, 16 insertions(+), 19 deletions(-) create mode 100644 rds_mysql/stored_procedure/src05/get_syor_date.sql delete mode 100644 rds_mysql/stored_procedure/src05/src05_create_function.sql create mode 100644 rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql diff --git a/rds_mysql/stored_procedure/src05/get_syor_date.sql b/rds_mysql/stored_procedure/src05/get_syor_date.sql new file mode 100644 index 00000000..1cc9fb30 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/get_syor_date.sql @@ -0,0 +1,8 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- 処理日取得(date型) +CREATE FUNCTION src05.get_syor_date() +RETURNS date DETERMINISTIC +BEGIN + RETURN (SELECT STR_TO_DATE(syor_date,'%Y%m%d') FROM src05.hdke_tbl); +END +; diff --git a/rds_mysql/stored_procedure/src05/src05_create_function.sql b/rds_mysql/stored_procedure/src05/src05_create_function.sql deleted file mode 100644 index e4e8cba3..00000000 --- a/rds_mysql/stored_procedure/src05/src05_create_function.sql +++ /dev/null @@ -1,19 +0,0 @@ --- 処理日取得(date型) -delimiter // -CREATE FUNCTION src05.get_syor_date() -RETURNS date DETERMINISTIC -BEGIN - RETURN (SELECT STR_TO_DATE(syor_date,'%Y%m%d') FROM src05.hdke_tbl); -END -// -delimiter; - --- 年月を日付加工(date型) -delimiter // -CREATE FUNCTION src05.to_date_yyyymm01(yyyymm varchar(6)) -RETURNS date DETERMINISTIC -BEGIN - RETURN (STR_TO_DATE(CONCAT(yyyymm,'01'),'%Y%m%d')); -END -// -delimiter; diff --git a/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql b/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql new file mode 100644 index 00000000..e262291c --- /dev/null +++ b/rds_mysql/stored_procedure/src05/to_date_yyyymm01.sql @@ -0,0 +1,8 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- 年月を日付加工(date型) +CREATE FUNCTION src05.to_date_yyyymm01(yyyymm varchar(6)) +RETURNS date DETERMINISTIC +BEGIN + RETURN (STR_TO_DATE(CONCAT(yyyymm,'01'),'%Y%m%d')); +END +; From d5ddb1f6672a1fb8aa81d001e1ee7cf0a1beeeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Apr 2023 17:58:35 +0900 Subject: [PATCH 110/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=88=E3=83=87?= =?UTF-8?q?=E3=83=A2=E5=8D=98=E4=BD=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 60aa4295..8a91d87d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -13,7 +13,7 @@ class ComPharmMapper(UltmarcTableMapper): FROM src05.com_pharm WHERE - dcf_dsf_inst_cd = :dcf_dsf_inst_cd + dcf_dsf_inst_cd = :dcfdsf_inst_cd """ # データ登録用SQL INSERT_QUERY = """\ @@ -107,7 +107,7 @@ class ComPharmMapper(UltmarcTableMapper): sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE - dcf_dsf_inst_cd = :dcf_dsf_inst_cd + dcf_dsf_inst_cd = :dcfdsf_inst_cd """ # 修正区分が「C(削除)」の場合の更新SQL @@ -121,7 +121,7 @@ class ComPharmMapper(UltmarcTableMapper): sys_update_date = :execute_date_str_ymd, update_prgm_id = :program_name WHERE - dcf_dsf_inst_cd = :dcf_dsf_inst_cd + dcf_dsf_inst_cd = :dcfdsf_inst_cd """ record: ComPharm @@ -147,9 +147,10 @@ class ComPharmMapper(UltmarcTableMapper): return # 更新の場合 - update_columns = ','.join(self.__make_update_query(self)) + update_columns = ','.join(self.__make_update_query()) + + # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる if len(update_columns) > 0: - # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる update_columns += ',' update_query = self.UPDATE_QUERY.format( @@ -171,7 +172,7 @@ class ComPharmMapper(UltmarcTableMapper): # 住所不明理由コード if self.record.hp_addr_lost_code != '': - set_clauses.append('addr_unknown_rea:hp_addr_lost_code') + set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') self.query_parameter['hp_addr_lost_code'] = None if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code # 正式施設名カナ @@ -217,8 +218,8 @@ class ComPharmMapper(UltmarcTableMapper): self.query_parameter['president'] = None if self.record.president == '@' else self.record.president # 電話番号なしフラグ - if self.record.tel_nothitel_nothing_flagng_flag_flg != '': - set_clauses.append('phone_number_non = :tel_nothing_flag') + if self.record.tel_nothing_flag != '': + set_clauses.append('phone_number_non_flg = :tel_nothing_flag') self.query_parameter['tel_nothing_flag'] = None if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag # 未確認フラグ From ed19d5dd5dd5dea08832eaa40fa0cecd4f671388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Apr 2023 17:58:56 +0900 Subject: [PATCH 111/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=88=E3=83=87?= =?UTF-8?q?=E3=83=A2=E5=8D=98=E4=BD=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultmarc/utmp_tables/tables/com_pharm.py | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py index 65b20c7d..bca8175a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py @@ -61,52 +61,52 @@ class ComPharm(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.dcfhp_id = record[2] - self.dcfhp_cd = record[3] - self.dcfhp_yobi = record[4] - self.maint_flag = record[5] - self.maintdate = record[6] - self.unconf_flg = record[8].strip() - self.del_cd = record[9].strip() - self.duphp_id = record[10].strip() - self.duphp_cd = record[11].strip() - self.duphp_yobi = record[12].strip() - self.hp_name = record[13].strip() - self.hp_name_kana = record[14].strip() - self.hp_ryaku_name = record[15].strip() - self.hp_ryaku_name_kana = record[16].strip() - self.hp_addr_lost_code = record[17].strip() - self.prefc_cd = record[18].strip() - self.city_cd = record[19].strip() - self.addrcode1 = record[20].strip() - self.addrcode2 = record[21].strip() - self.zip_code = record[22].strip() - self.addr = record[23] - self.addr_kana = record[24] - self.addr_number = record[25] - self.addrkanjcnt1 = record[26].strip() - self.addrkanjcnt2 = record[27].strip() - self.addrkanjcnt3 = record[28].strip() - self.addrkanjcnt4 = record[29].strip() - self.addrkanacnt1 = record[30].strip() - self.addrkanacnt2 = record[31].strip() - self.addrkanacnt3 = record[32].strip() - self.addrkanacnt4 = record[33].strip() - self.tel_nothing_flag = record[34].strip() - self.tel_number = record[35].strip() - self.mgtclass_code = record[36].strip() - self.hpclass_code = record[37].strip() - self.president = record[38].strip() - self.president_Kana = record[39].strip() - self.open_flag = record[40].strip() - self.open_yearmonth = record[41].strip() - self.close_flg = record[42].strip() - self.close_yearmonth = record[43].strip() - self.pharmacist = record[44] - self.pharmacist_kana = record[45] - self.franchise_hq_id = record[46] - self.franchise_hq_cd = record[47] - self.franchise_hq_yobi = record[48] + self.dcfhp_id = record[1] + self.dcfhp_cd = record[2] + self.dcfhp_yobi = record[3] + self.maint_flag = record[4] + self.maintdate = record[5] + self.unconf_flg = record[7].strip() + self.del_cd = record[8].strip() + self.duphp_id = record[9].strip() + self.duphp_cd = record[10].strip() + self.duphp_yobi = record[11].strip() + self.hp_name = record[12].strip() + self.hp_name_kana = record[13].strip() + self.hp_ryaku_name = record[14].strip() + self.hp_ryaku_name_kana = record[15].strip() + self.hp_addr_lost_code = record[16].strip() + self.prefc_cd = record[17].strip() + self.city_cd = record[18].strip() + self.addrcode1 = record[19].strip() + self.addrcode2 = record[20].strip() + self.zip_code = record[21].strip() + self.addr = record[22] + self.addr_kana = record[23] + self.addr_number = record[24] + self.addrkanjcnt1 = record[25].strip() + self.addrkanjcnt2 = record[26].strip() + self.addrkanjcnt3 = record[27].strip() + self.addrkanjcnt4 = record[28].strip() + self.addrkanacnt1 = record[29].strip() + self.addrkanacnt2 = record[30].strip() + self.addrkanacnt3 = record[31].strip() + self.addrkanacnt4 = record[32].strip() + self.tel_nothing_flag = record[33].strip() + self.tel_number = record[34].strip() + self.mgtclass_code = record[35].strip() + self.hpclass_code = record[36].strip() + self.president = record[37].strip() + self.president_Kana = record[38].strip() + self.open_flag = record[39].strip() + self.open_yearmonth = record[40].strip() + self.close_flg = record[41].strip() + self.close_yearmonth = record[42].strip() + self.pharmacist = record[43] + self.pharmacist_kana = record[44] + self.franchise_hq_id = record[45] + self.franchise_hq_cd = record[46] + self.franchise_hq_yobi = record[47] # 施設コード(2+3+4) self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi]) From 3c814d547705640e91a1a876fad3ee7fb93efc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Apr 2023 17:59:36 +0900 Subject: [PATCH 112/962] =?UTF-8?q?win=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/testing_utility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index e95da8e7..5a6c3a42 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,5 +1,5 @@ -"""テスト用共通処理関数""" import csv +import os import tempfile from datetime import datetime @@ -22,12 +22,13 @@ def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: """ # 一度、Shift-JISファイルで書き出す - with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932') as tmp_file: + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932', delete=False) as tmp_file: tmp_file.write(csv_file.read()) tmp_file.seek(0) tmpfile_path = tmp_file.name - dat_file = DatFile.from_path(tmpfile_path) + dat_file = DatFile.from_path(tmpfile_path) + os.unlink(tmpfile_path) return dat_file From c24379280f072e9ff5cfa439666378d814454220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Apr 2023 18:00:48 +0900 Subject: [PATCH 113/962] =?UTF-8?q?COM=5F=E8=96=AC=E5=B1=80=E3=80=80?= =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9=E3=83=88=E3=80=80=E6=96=B0?= =?UTF-8?q?=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_pharm/__init__.py | 0 .../com_pharm/com_pharm_delete.csv | 1 + .../com_pharm/com_pharm_insert.csv | 1 + .../com_pharm/expect_com_pharm_insert.csv | 2 + .../com_pharm/expect_com_pharm_update.csv | 3 + .../com_pharm/test_com_pharm_mapper.py | 197 ++++++++++++++++++ 6 files changed, 204 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv new file mode 100644 index 00000000..e6a84d8c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv @@ -0,0 +1 @@ +"102","9","9","9","C","200501","200601","7","0","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv new file mode 100644 index 00000000..24dfad89 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv @@ -0,0 +1 @@ +"102","1","2","3","A","200501","200601","7","8","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv new file mode 100644 index 00000000..f692eb44 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv @@ -0,0 +1,2 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv new file mode 100644 index 00000000..9eb9020e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv @@ -0,0 +1,3 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","ケシトチ","県市通丁目","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/18 10:27:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py new file mode 100644 index 00000000..8d190859 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_pharm_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPharmMapper: + """ レイアウト区分102: COM_薬局 """ + + db: Database + batch_config: BatchConfig + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_config = BatchConfig.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_薬局テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_薬局テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_pharm_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_pharm', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_薬局テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_pharm', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_pharm_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_pharm', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_pharm_mapper.ComPharmMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_pharm_mapper.ComPharmMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_pharm_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 4431e5bbaa906aba5bf68f465570648699b691c4 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 16:51:22 +0900 Subject: [PATCH 114/962] =?UTF-8?q?fix:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: レビュー指摘対応 db.disconnectのタイミング修正 https://nds-tyo.backlog.com/git/NEWDWH2021/newsdwh2021/pullRequests/161#comment-1843452 feat: レビュー指摘反映に伴い、検査例外を出す部分は一箇所に限定 https://nds-tyo.backlog.com/git/NEWDWH2021/newsdwh2021/pullRequests/161#comment-1843452 feat: レビュー指摘対応 https://nds-tyo.backlog.com/git/NEWDWH2021/newsdwh2021/pullRequests/161#comment-1843505 https://nds-tyo.backlog.com/git/NEWDWH2021/newsdwh2021/pullRequests/161#comment-1843511 feat: レビュー指摘反映 https://nds-tyo.backlog.com/git/NEWDWH2021/newsdwh2021/pullRequests/161#comment-1843529 feat: ログ出力レベルの調整。内部関数に_をつけた --- .../src/batch/batch_functions.py | 9 +- .../batch/bio_sales/create_bio_sale_lot.py | 20 ---- .../laundering/emp_chg_inst_laundering.py | 93 ++++++++++--------- .../src/batch/ultmarc/ultmarc_process.py | 78 ++++++++-------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 18 +++- 5 files changed, 110 insertions(+), 108 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py diff --git a/ecs/jskult-batch-daily/src/batch/batch_functions.py b/ecs/jskult-batch-daily/src/batch/batch_functions.py index 6c113664..b8e223e2 100644 --- a/ecs/jskult-batch-daily/src/batch/batch_functions.py +++ b/ecs/jskult-batch-daily/src/batch/batch_functions.py @@ -27,7 +27,8 @@ def get_batch_statuses() -> tuple[str, str, str]: hdke_tbl_result = db.execute_select(sql) except DBException as e: raise BatchOperationException(e) - db.disconnect() + finally: + db.disconnect() if len(hdke_tbl_result) == 0: raise BatchOperationException('日付テーブルが取得できませんでした') @@ -56,7 +57,8 @@ def update_batch_processing_flag_in_processing() -> None: db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) except DBException as e: raise BatchOperationException(e) - db.disconnect() + finally: + db.disconnect() return @@ -83,7 +85,8 @@ def update_batch_process_complete() -> None: }) except DBException as e: raise BatchOperationException(e) - db.disconnect() + finally: + db.disconnect() return diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py deleted file mode 100644 index 7d166157..00000000 --- a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py +++ /dev/null @@ -1,20 +0,0 @@ -from src.batch.common.batch_context import BatchContext -from src.logging.get_logger import get_logger - -batch_context = BatchContext.get_instance() -logger = get_logger('生物由来卸販売ロット分解') - - -def exec(): - """生物由来卸販売ロット分解""" - - logger.info('生物由来卸販売ロット分解:起動') - # 営業日ではない場合、処理をスキップする - if batch_context.is_not_business_day: - logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') - return - - # TODO: ここに処理を追記していく - - logger.info('生物由来卸販売ロット分解:終了') - return diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 6e611bc9..16ff0c79 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -11,38 +11,42 @@ batch_context = BatchContext.get_instance() def exec(): db = Database.get_instance() - db.connect() - logger.info('##########################') - logger.info('START Changing Employee in charge of institution PGM.') - # 業務日付を取得 - syor_date = batch_context.syor_date - # `emp_chg_inst_lau`をTruncate - truncate_emp_chg_inst_lau(db) - # emp_chg_inst から、`emp_chg_inst_lau`へInsert - insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) - # vop_hco_merge_vから、emp_chg_inst_lauをUpdate - update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) - # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) - db.disconnect() - logger.info('##########################') - logger.info('End All Processing PGM.') + try: + db.connect() + logger.debug('##########################') + logger.debug('START Changing Employee in charge of institution PGM.') + # 業務日付を取得 + syor_date = batch_context.syor_date + # `emp_chg_inst_lau`をTruncate + _truncate_emp_chg_inst_lau(db) + # emp_chg_inst から、`emp_chg_inst_lau`へInsert + _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) + # vop_hco_merge_vから、emp_chg_inst_lauをUpdate + _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) + # dcf_inst_mergeから、emp_chg_inst_lauをUpdate + _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) + logger.debug('##########################') + logger.debug('End All Processing PGM.') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() -def truncate_emp_chg_inst_lau(db: Database): - logger.info("##########################") +def _truncate_emp_chg_inst_lau(db: Database): + logger.debug("##########################") try: db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") except Exception as e: - logger.info("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") - raise BatchOperationException(e) + logger.debug("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") + raise e - logger.info("Table `emp_chg_inst_lau` was truncated!") + logger.debug("Table `emp_chg_inst_lau` was truncated!") return -def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): - logger.info("##########################") +def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): + logger.debug("##########################") try: elapsed_time = ElapsedTime() sql = """ @@ -70,16 +74,16 @@ def insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): logging_sql(logger, sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') except Exception as e: - logger.info("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") - raise BatchOperationException(e) - logger.info("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") + logger.debug("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") + raise e + logger.debug("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") return -def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): +def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする - logger.info("##########################") + logger.debug("##########################") try: select_result = db.execute_select( """ @@ -93,8 +97,8 @@ def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): {'syor_date': syor_date} ) except Exception as e: - logger.info("Error! `vop_hco_merge_v` Table count error!") - raise BatchOperationException(e) + logger.debug("Error! `vop_hco_merge_v` Table count error!") + raise e count = [row for row in select_result][0]['row_count'] if count == 0: logger.info('vop_hco_merge_v Table Data is not exists!') @@ -137,16 +141,16 @@ def update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): logging_sql(logger, update_sql) logger.info(f'Query OK, {update_result.rowcount} rows affected ({elapsed_time.of})') except Exception as e: - logger.info(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") - raise BatchOperationException(e) - logger.info(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") + logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") + raise e + logger.debug(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") return -def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): +def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): # dcf_inst_mergeから、emp_chg_inst_lauをUpdate # Get count from DCF_INST_MERGE - logger.info("##########################") + logger.debug("##########################") try: select_result = db.execute_select( """ @@ -163,18 +167,19 @@ def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): {'syor_date': syor_date} ) except Exception as e: - logger.info("Error! Getting Count of dcf_inst_merge was failed!") - raise BatchOperationException(e) + logger.debug("Error! Getting Count of dcf_inst_merge was failed!") + raise e + count = [row for row in select_result][0]['row_count'] if count == 0: logger.info('dcf_inst_merge Table Data is not exists!') return - logger.info('dcf_inst_merge Table Data is exists!') + logger.debug('dcf_inst_merge Table Data is exists!') # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - logger.info("##########################") - logger.info("#### UPDATE DATA #########") - logger.info("##########################") + logger.debug("##########################") + logger.debug("#### UPDATE DATA #########") + logger.debug("##########################") try: elapsed_time = ElapsedTime() update_sql = """ @@ -205,9 +210,9 @@ def update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): logging_sql(logger, update_sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') except Exception as e: - logger.info("emp_chg_inst_lau.v_inst_cd could not set!") - raise BatchOperationException(e) + logger.debug("emp_chg_inst_lau.v_inst_cd could not set!") + raise e - logger.info("emp_chg_inst_lau.v_inst_cd was set!") + logger.debug("emp_chg_inst_lau.v_inst_cd was set!") return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 8ddae44a..0fde5cf7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -61,7 +61,6 @@ def exec_import(): batch_context.is_ultmarc_imported = True logger.info('アルトマーク取込処理: 終了') except Exception as e: - logger.exception(e) raise BatchOperationException(e) @@ -74,41 +73,46 @@ def exec_export(): def _import_to_ultmarc_table(dat_file: DatFile): db = Database.get_instance() - # DB接続 - db.connect() - # ファイル単位でトランザクションを行う - db.begin() - logger.info('Transaction BEGIN') - mapper_factory = UltmarcTableMapperFactory() - # datファイルを1行ずつ処理し、各テーブルへ登録 - for line in dat_file: - try: - # 書き込み先のテーブルを特定 - mapper_class = mapper_factory.create( - line.layout_class, - line.records, - db - ) - mapper_class.make_query() - mapper_class.execute_queries() - dat_file.count_up_success() - except Exception as e: - logger.warning(e) - record = line.records - log_message = ','.join([f'"{r}"' for r in record]) - logger.warning(f'ERROR_LINE: {log_message}') - dat_file.count_up_error() - # すべての行を登録終えたらコミットする - db.commit() - db.disconnect() - # 処理結果をログに出力する - logger.info('Transaction COMMIT') - logger.info(f'ultmarc import process RESULT') - logger.info(f'SUCCESS_COUNT={dat_file.success_count}') - logger.info(f'ERROR_COUNT={dat_file.error_count}') - logger.info(f'ALL_COUNT={dat_file.total_count}') + try: + # DB接続 + db.connect() + # ファイル単位でトランザクションを行う + db.begin() + logger.info('Transaction BEGIN') + mapper_factory = UltmarcTableMapperFactory() + # datファイルを1行ずつ処理し、各テーブルへ登録 + for line in dat_file: + try: + # 書き込み先のテーブルを特定 + mapper_class = mapper_factory.create( + line.layout_class, + line.records, + db + ) + mapper_class.make_query() + mapper_class.execute_queries() + dat_file.count_up_success() + except Exception as e: + logger.warning(e) + record = line.records + log_message = ','.join([f'"{r}"' for r in record]) + logger.warning(f'ERROR_LINE: {log_message}') + dat_file.count_up_error() + # すべての行を登録終えたらコミットする + db.commit() + db.disconnect() + # 処理結果をログに出力する + logger.info('Transaction COMMIT') + logger.info(f'ultmarc import process RESULT') + logger.info(f'SUCCESS_COUNT={dat_file.success_count}') + logger.info(f'ERROR_COUNT={dat_file.error_count}') + logger.info(f'ALL_COUNT={dat_file.total_count}') - # 1件でもエラーがあれば、通知用にログに出力する - if dat_file.error_count > 0: - logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。') + # 1件でもエラーがあれば、通知用にログに出力する + if dat_file.error_count > 0: + logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。') + except Exception as e: + raise e + finally: + db.disconnect() return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index ca9b0022..3788d368 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -43,10 +43,17 @@ def exec(): # バッチ共通設定に処理日を追加 batch_context.syor_date = syor_date - # 稼働日かかどうかを、非営業日ファイルをダウンロードして判定 - holiday_list_file_path = ConfigBucket().download_holiday_list() - holiday_calendar = CalendarFile(holiday_list_file_path) - batch_context.is_not_business_day = holiday_calendar.compare_date(syor_date) + # 稼働日かかどうかを、V実消化非稼働日ファイルをダウンロードして判定 + try: + holiday_list_file_path = ConfigBucket().download_holiday_list() + holiday_calendar = CalendarFile(holiday_list_file_path) + batch_context.is_not_business_day = holiday_calendar.compare_date(syor_date) + except Exception as e: + logger.exception(f'V実消化非稼働日ファイルの読み込みに失敗しました。{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 調査目的でV実消化稼働日かどうかをログ出力 + logger.debug(f'本日は{"V実消化非稼働日です。" if batch_context.is_not_business_day else "V実消化稼働日です。"}') # バッチ処理中に更新 try: @@ -63,6 +70,9 @@ def exec(): logger.exception(f'アルトマーク取込処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + # 調査目的でアルトマーク取込が行われたかどうかをログ出力 + logger.debug(f'{"アルトマーク取込が行われました。" if batch_context.is_ultmarc_imported else "アルトマーク取込が行われませんでした。"}') + try: logger.info('V実消化用施設・薬局薬店データ作成処理:起動') ultmarc_process.exec_export() From acdedf13afb189a7ea397ca3618b94c94766d1b1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 18:19:10 +0900 Subject: [PATCH 115/962] =?UTF-8?q?feat:=20=E8=AA=A4=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=97=E3=81=9F=E3=83=A2=E3=82=B8=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=82=92=E5=BE=A9=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/bio_sales/create_bio_sale_lot.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py new file mode 100644 index 00000000..7d166157 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py @@ -0,0 +1,20 @@ +from src.batch.common.batch_context import BatchContext +from src.logging.get_logger import get_logger + +batch_context = BatchContext.get_instance() +logger = get_logger('生物由来卸販売ロット分解') + + +def exec(): + """生物由来卸販売ロット分解""" + + logger.info('生物由来卸販売ロット分解:起動') + # 営業日ではない場合、処理をスキップする + if batch_context.is_not_business_day: + logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') + return + + # TODO: ここに処理を追記していく + + logger.info('生物由来卸販売ロット分解:終了') + return From 5f508ad1238794a89d2845b672c9b8810daab8a8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 18:26:43 +0900 Subject: [PATCH 116/962] =?UTF-8?q?fix:=20disconnect=E3=80=81commit?= =?UTF-8?q?=E3=82=92=E5=91=BC=E3=81=B6=E4=BD=8D=E7=BD=AE=E3=81=8C=E3=81=8A?= =?UTF-8?q?=E3=81=8B=E3=81=97=E3=81=84=E3=81=AE=E3=81=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/ultmarc_process.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 0fde5cf7..83433bda 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -98,11 +98,7 @@ def _import_to_ultmarc_table(dat_file: DatFile): log_message = ','.join([f'"{r}"' for r in record]) logger.warning(f'ERROR_LINE: {log_message}') dat_file.count_up_error() - # すべての行を登録終えたらコミットする - db.commit() - db.disconnect() # 処理結果をログに出力する - logger.info('Transaction COMMIT') logger.info(f'ultmarc import process RESULT') logger.info(f'SUCCESS_COUNT={dat_file.success_count}') logger.info(f'ERROR_COUNT={dat_file.error_count}') @@ -111,8 +107,8 @@ def _import_to_ultmarc_table(dat_file: DatFile): # 1件でもエラーがあれば、通知用にログに出力する if dat_file.error_count > 0: logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。') - except Exception as e: - raise e finally: + # 終了時に必ずコミットする + db.commit() db.disconnect() return From 0491aa77be9b1c0a7121ccd680c50baed2d3b882 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 19:00:26 +0900 Subject: [PATCH 117/962] =?UTF-8?q?feat:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E5=87=A6=E7=90=86=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E8=A6=8B=E7=9B=B4=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 83433bda..4ed7ae03 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -34,8 +34,7 @@ def exec_import(): # ファイルが複数ある場合はエラーとする if len(dat_file_list) > 1: - logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') - raise BatchOperationException() + raise BatchOperationException(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}') # ファイルの件数は必ず1件になる dat_file_info = dat_file_list[0] @@ -78,7 +77,6 @@ def _import_to_ultmarc_table(dat_file: DatFile): db.connect() # ファイル単位でトランザクションを行う db.begin() - logger.info('Transaction BEGIN') mapper_factory = UltmarcTableMapperFactory() # datファイルを1行ずつ処理し、各テーブルへ登録 for line in dat_file: @@ -96,7 +94,7 @@ def _import_to_ultmarc_table(dat_file: DatFile): logger.warning(e) record = line.records log_message = ','.join([f'"{r}"' for r in record]) - logger.warning(f'ERROR_LINE: {log_message}') + logger.info(f'ERROR_LINE: {log_message}') dat_file.count_up_error() # 処理結果をログに出力する logger.info(f'ultmarc import process RESULT') From e27757e3ee7ef20a218a354549bef89737660bae Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 19:02:17 +0900 Subject: [PATCH 118/962] =?UTF-8?q?feat:=20=E4=B8=A6=E8=A1=8C=E5=87=A6?= =?UTF-8?q?=E7=90=86=E8=A6=8B=E7=9B=B4=E3=81=97=E3=80=82ECS=20=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=82=AF=E3=81=AEvCPU=E6=95=B0=E6=9C=80=E9=81=A9?= =?UTF-8?q?=E5=8C=96=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81async-await?= =?UTF-8?q?=E3=81=A7=E4=B8=A6=E5=88=97=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/entrypoint.py | 15 ++++++-- ...io_sale_lot.py => create_bio_sales_lot.py} | 2 +- .../laundering/emp_chg_inst_laundering.py | 2 +- .../src/batch/laundering/sales_laundering.py | 8 ++--- .../src/batch/parallel_processes.py | 32 ----------------- .../src/batch/parallel_tasks.py | 34 +++++++++++++++++++ ecs/jskult-batch-daily/src/jobctrl_daily.py | 8 +++-- 7 files changed, 58 insertions(+), 43 deletions(-) rename ecs/jskult-batch-daily/src/batch/bio_sales/{create_bio_sale_lot.py => create_bio_sales_lot.py} (97%) delete mode 100644 ecs/jskult-batch-daily/src/batch/parallel_processes.py create mode 100644 ecs/jskult-batch-daily/src/batch/parallel_tasks.py diff --git a/ecs/jskult-batch-daily/entrypoint.py b/ecs/jskult-batch-daily/entrypoint.py index 472efd9f..5b06ca48 100644 --- a/ecs/jskult-batch-daily/entrypoint.py +++ b/ecs/jskult-batch-daily/entrypoint.py @@ -1,10 +1,21 @@ """実消化&アルトマーク 日次バッチのエントリーポイント""" +import asyncio + from src import jobctrl_daily -if __name__ == '__main__': + +# 一部並行実行のため、非同期関数化 +async def run(): try: - exit(jobctrl_daily.exec()) + task = asyncio.create_task(jobctrl_daily.exec()) + result_code = await task + exit(result_code) except Exception: # エラーが起きても、正常系のコードで返す。 # エラーが起きた事実はbatch_process内でログを出す。 exit(0) + + +if __name__ == '__main__': + # 非同期関数を実行 + asyncio.run(run()) diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py similarity index 97% rename from ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py rename to ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py index 7d166157..02080d76 100644 --- a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py @@ -5,7 +5,7 @@ batch_context = BatchContext.get_instance() logger = get_logger('生物由来卸販売ロット分解') -def exec(): +async def exec(): """生物由来卸販売ロット分解""" logger.info('生物由来卸販売ロット分解:起動') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 16ff0c79..57ef56be 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -9,7 +9,7 @@ logger = get_logger('48-施設担当者マスタ洗替') batch_context = BatchContext.get_instance() -def exec(): +async def exec(): db = Database.get_instance() try: db.connect() 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 7b77d8ac..3265440f 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -7,15 +7,15 @@ batch_context = BatchContext.get_instance() logger = get_logger('実績洗替') -def exec(): +async def exec(): """実績洗替処理""" - logger.info('実績更新:起動') + logger.debug('実績更新:起動') # 営業日ではない場合、実績洗替処理は実行しない if batch_context.is_not_business_day: logger.info('営業日ではないため、実績洗替処理をスキップします。') return # 施設担当者洗替 - emp_chg_inst_laundering.exec() + await emp_chg_inst_laundering.exec() - logger.info('実績更新:終了') + logger.debug('実績更新:終了') diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py deleted file mode 100644 index 1b7db6c7..00000000 --- a/ecs/jskult-batch-daily/src/batch/parallel_processes.py +++ /dev/null @@ -1,32 +0,0 @@ -"""並行処理""" - -import concurrent.futures - -from src.batch.bio_sales import create_bio_sale_lot -from src.batch.laundering import sales_laundering -from src.error.exceptions import BatchOperationException - - -def exec(): - # 並行処理を開始 - with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: - - # 実績更新 - future_sales_laundering = executor.submit(sales_laundering.exec) - # 生物由来ロット分解 - future_create_bio_sales_lot = executor.submit(create_bio_sale_lot.exec) - - # 両方の処理が完了するまで待つ - concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) - - # エラーがあれば呼び出し元でキャッチする - sales_laundering_exc = future_sales_laundering.exception() - create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() - - # いずれかにエラーが発生していれば、1つのエラーとして返す。 - if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: - sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' - create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' - raise BatchOperationException(f'並行処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') - - return diff --git a/ecs/jskult-batch-daily/src/batch/parallel_tasks.py b/ecs/jskult-batch-daily/src/batch/parallel_tasks.py new file mode 100644 index 00000000..afb58820 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/parallel_tasks.py @@ -0,0 +1,34 @@ +"""並行処理""" + +import asyncio + +from src.batch.bio_sales import create_bio_sales_lot +from src.batch.laundering import sales_laundering +from src.error.exceptions import BatchOperationException + + +async def exec(): + tasks = { + '実績更新': sales_laundering.exec(), + '生物由来ロット分解': create_bio_sales_lot.exec() + } + + # 並行処理を開始 + # 両方の処理が完了するまで待つ + done, _ = await asyncio.wait(tasks.values(), return_when=asyncio.ALL_COMPLETED) + task_results = {} + # 実行結果を確認する + for task_key, task in zip(tasks.keys(), done): + try: + task.result() + task_results[task_key] = True + except Exception as e: + task_results[task_key] = str(e) + + # エラーが発生しているかを確認し、エラーがあれば例外とする + if_error_tasks = {k: v for k, v in task_results.items() if v is not True} + if len(if_error_tasks.keys()) != 0: + messages = ', '.join([f'{k}={v}' for k, v in if_error_tasks.items()]) + raise BatchOperationException(f'並行処理中にエラーが発生しました。{messages}') + + return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 3788d368..5c178220 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,7 +1,7 @@ """実消化&アルトマーク 日次バッチ処理""" from src.aws.s3 import ConfigBucket -from src.batch import parallel_processes +from src.batch import parallel_tasks from src.batch.batch_functions import ( get_batch_statuses, update_batch_process_complete, update_batch_processing_flag_in_processing) @@ -19,7 +19,7 @@ logger = get_logger('日次処理コントロール') batch_context = BatchContext.get_instance() -def exec(): +async def exec(): try: logger.info('日次バッチ:開始') try: @@ -100,7 +100,7 @@ def exec(): try: # 実績生物由来ロット分解と並行処理 logger.info('並行処理(実績更新-生物由来ロット分解):起動') - parallel_processes.exec() + await parallel_tasks.exec() logger.info('並行処理(実績更新-生物由来ロット分解):終了') except BatchOperationException as e: logger.exception(f'並行処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') @@ -130,3 +130,5 @@ def exec(): except Exception as e: logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') raise e + finally: + logger.info('日次バッチ:終了') From bdcb02867efce92e30027475af4362c79adccebc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 19:14:36 +0900 Subject: [PATCH 119/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E6=96=87?= =?UTF-8?q?=E8=A8=80=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/create_bio_sales_lot.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 02080d76..be9f2164 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 @@ -7,8 +7,7 @@ logger = get_logger('生物由来卸販売ロット分解') async def exec(): """生物由来卸販売ロット分解""" - - logger.info('生物由来卸販売ロット分解:起動') + logger.debug('生物由来卸販売ロット分解:起動') # 営業日ではない場合、処理をスキップする if batch_context.is_not_business_day: logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') @@ -16,5 +15,5 @@ async def exec(): # TODO: ここに処理を追記していく - logger.info('生物由来卸販売ロット分解:終了') + logger.debug('生物由来卸販売ロット分解:終了') return From e40b89206e21e0c77044cc950fc8c74679f51bce Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 19:41:46 +0900 Subject: [PATCH 120/962] =?UTF-8?q?feat:=20=E7=92=B0=E5=A2=83=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 2 +- ecs/jskult-batch-daily/src/aws/s3.py | 4 ++-- ecs/jskult-batch-daily/src/system_var/environment.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index a7c88968..6df005c8 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -10,4 +10,4 @@ ULTMARC_BACKUP_BUCKET=**************** ULTMARC_BACKUP_FOLDER=ultmarc JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar -JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index aa235224..9927036c 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -82,8 +82,8 @@ class ConfigBucket(S3Bucket): def download_holiday_list(self): # 一時ファイルとして保存する temporary_dir = tempfile.mkdtemp() - temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME) - holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME}' + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME) + holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME}' with open(temporary_file_path, mode='wb') as f: self._s3_client.download_file(self._bucket_name, holiday_list_key, f) f.seek(0) diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 650826ee..3212de18 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -14,7 +14,7 @@ ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET'] ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] -JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_HOLIDAY_LIST_FILE_NAME'] +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 243373e647e24d2574df8ab5c41ed747a671d144 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Apr 2023 20:58:44 +0900 Subject: [PATCH 121/962] =?UTF-8?q?fix:=20=E3=83=90=E3=82=AF=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=83=90=E3=82=B1=E3=83=83=E3=83=88=E3=82=92?= =?UTF-8?q?=E7=A4=BA=E3=81=99=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 2 +- ecs/jskult-batch-daily/src/aws/s3.py | 2 +- ecs/jskult-batch-daily/src/system_var/environment.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 6df005c8..95aef7fe 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -6,7 +6,7 @@ DB_SCHEMA=src05 LOG_LEVEL=INFO ULTMARC_DATA_BUCKET=**************** ULTMARC_DATA_FOLDER=recv -ULTMARC_BACKUP_BUCKET=**************** +JSKULT_BACKUP_BUCKET=**************** ULTMARC_BACKUP_FOLDER=ultmarc JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 9927036c..2ac3efe6 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -91,7 +91,7 @@ class ConfigBucket(S3Bucket): class JskUltBackupBucket(S3Bucket): - _bucket_name = environment.ULTMARC_BACKUP_BUCKET + _bucket_name = environment.JSKULT_BACKUP_BUCKET class UltmarcBackupBucket(JskUltBackupBucket): diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 3212de18..b1730224 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -10,7 +10,7 @@ DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] -ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET'] +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] From 81e1fc8abb5e5df82e2867d6bbea3db56d38c438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 19 Apr 2023 10:25:25 +0900 Subject: [PATCH 122/962] =?UTF-8?q?feat:=20=E4=BE=8B=E5=A4=96=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E6=A8=AA=E5=B1=95=E9=96=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datachange/create_inst_merge_for_laundering.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/datachange/create_inst_merge_for_laundering.py b/ecs/jskult-batch-daily/src/batch/datachange/create_inst_merge_for_laundering.py index 2e03188f..f631d460 100644 --- a/ecs/jskult-batch-daily/src/batch/datachange/create_inst_merge_for_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/datachange/create_inst_merge_for_laundering.py @@ -10,14 +10,15 @@ def batch_process(): try: db.connect() + + logger.debug('処理開始') + call_v_inst_merge_t_create(db) + call_inst_merge_t_create(db) + logger.debug('処理終了') except Exception as e: raise BatchOperationException(e) - - logger.info('処理開始') - call_v_inst_merge_t_create(db) - call_inst_merge_t_create(db) - db.disconnect() - logger.info('処理終了') + finally: + db.disconnect() def call_v_inst_merge_t_create(db: Database): From d8b6dd9978f72eb227e4b4e2fa15ae871691bd71 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 13:18:12 +0900 Subject: [PATCH 123/962] =?UTF-8?q?feat:=20async-await=E3=81=A7=E9=9D=9E?= =?UTF-8?q?=E5=90=8C=E6=9C=9F=E5=87=A6=E7=90=86=E3=82=92=E5=88=B6=E5=BE=A1?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/bio_sales/create_bio_sales_lot.py | 5 ++ .../laundering/emp_chg_inst_laundering.py | 43 +++++++++-------- .../src/db/async_database.py | 48 +++++++++++++++++++ 3 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/db/async_database.py 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 be9f2164..53b6a2c4 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 @@ -13,6 +13,11 @@ async def exec(): logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') return + # 並列処理の確認用コード + # import asyncio + # for i in range(50): + # logger.debug('生物由来卸販売ロット分解:処理中') + # await asyncio.sleep(0.5) # TODO: ここに処理を追記していく logger.debug('生物由来卸販売ロット分解:終了') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 57ef56be..9cd5ba07 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -1,51 +1,52 @@ from src.batch.batch_functions import logging_sql from src.batch.common.batch_context import BatchContext -from src.db.database import Database +from src.db.async_database import AsyncDatabase from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime -logger = get_logger('48-施設担当者マスタ洗替') +logger = get_logger('施設担当者マスタ洗替') batch_context = BatchContext.get_instance() async def exec(): - db = Database.get_instance() + db = AsyncDatabase.get_instance() try: - db.connect() + await db.connect() logger.debug('##########################') logger.debug('START Changing Employee in charge of institution PGM.') # 業務日付を取得 syor_date = batch_context.syor_date # `emp_chg_inst_lau`をTruncate - _truncate_emp_chg_inst_lau(db) + await _truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert - _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) + await _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) # vop_hco_merge_vから、emp_chg_inst_lauをUpdate - _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) + await _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) + await _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) logger.debug('##########################') logger.debug('End All Processing PGM.') except Exception as e: raise BatchOperationException(e) finally: - db.disconnect() + await db.disconnect() -def _truncate_emp_chg_inst_lau(db: Database): +async def _truncate_emp_chg_inst_lau(db: AsyncDatabase): logger.debug("##########################") try: - db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") + await db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") except Exception as e: logger.debug("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") + logger.exception(e) raise e logger.debug("Table `emp_chg_inst_lau` was truncated!") return -def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): +async def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: AsyncDatabase): logger.debug("##########################") try: elapsed_time = ElapsedTime() @@ -70,22 +71,21 @@ def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): WHERE enabled_flg = 'Y' """ - res = db.execute(sql) + res = await db.execute(sql) logging_sql(logger, sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') except Exception as e: logger.debug("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") raise e logger.debug("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") - return -def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): +async def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: AsyncDatabase, syor_date: str): # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする logger.debug("##########################") try: - select_result = db.execute_select( + select_result = await db.execute_select( """ SELECT COUNT(v_inst_cd) AS row_count @@ -106,7 +106,7 @@ def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): logger.info('vop_hco_merge_v Table Data is exists!') # vop_hco_merge_v から、emp_chg_inst_lauをUpdateします - result = db.execute_select( + result = await db.execute_select( """ SELECT v_inst_cd, @@ -144,15 +144,16 @@ def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") raise e logger.debug(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") + return -def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): +async def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: AsyncDatabase, syor_date: str): # dcf_inst_mergeから、emp_chg_inst_lauをUpdate # Get count from DCF_INST_MERGE logger.debug("##########################") try: - select_result = db.execute_select( + select_result = await db.execute_select( """ SELECT COUNT(dcf_inst_cd) AS row_count @@ -166,6 +167,7 @@ def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): """, {'syor_date': syor_date} ) + except Exception as e: logger.debug("Error! Getting Count of dcf_inst_merge was failed!") raise e @@ -203,7 +205,7 @@ def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): WHERE el.inst_cd = dm.dcf_inst_cd """ - res = db.execute( + res = await db.execute( update_sql, {'syor_date': syor_date} ) @@ -214,5 +216,4 @@ def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): raise e logger.debug("emp_chg_inst_lau.v_inst_cd was set!") - return diff --git a/ecs/jskult-batch-daily/src/db/async_database.py b/ecs/jskult-batch-daily/src/db/async_database.py new file mode 100644 index 00000000..fb026fa4 --- /dev/null +++ b/ecs/jskult-batch-daily/src/db/async_database.py @@ -0,0 +1,48 @@ +import asyncio + +from sqlalchemy import CursorResult +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.db.database import Database +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + + +class AsyncDatabase(Database): + """データベース非同期操作クラス""" + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + super().__init__(username, password, host, port, schema) + + @classmethod + def get_instance(cls): + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + async def connect(self): + await asyncio.get_event_loop().run_in_executor(None, super().connect) + + async def execute_select(self, select_query: str, parameters=None) -> list[dict]: + res = await asyncio.get_event_loop().run_in_executor(None, super().execute_select, select_query, parameters) + return res + + async def execute(self, query: str, parameters=None) -> CursorResult: + res = await asyncio.get_event_loop().run_in_executor(None, super().execute, query, parameters) + return res + + async def disconnect(self): + await asyncio.get_event_loop().run_in_executor(None, super().disconnect) From ac374afb858938777a75879fa1021db1b9380e82 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 13:39:33 +0900 Subject: [PATCH 124/962] =?UTF-8?q?Revert=20"feat:=20async-await=E3=81=A7?= =?UTF-8?q?=E9=9D=9E=E5=90=8C=E6=9C=9F=E5=87=A6=E7=90=86=E3=82=92=E5=88=B6?= =?UTF-8?q?=E5=BE=A1=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d8b6dd9978f72eb227e4b4e2fa15ae871691bd71. --- .../batch/bio_sales/create_bio_sales_lot.py | 5 -- .../laundering/emp_chg_inst_laundering.py | 43 ++++++++--------- .../src/db/async_database.py | 48 ------------------- 3 files changed, 21 insertions(+), 75 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/db/async_database.py 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 53b6a2c4..be9f2164 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 @@ -13,11 +13,6 @@ async def exec(): logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') return - # 並列処理の確認用コード - # import asyncio - # for i in range(50): - # logger.debug('生物由来卸販売ロット分解:処理中') - # await asyncio.sleep(0.5) # TODO: ここに処理を追記していく logger.debug('生物由来卸販売ロット分解:終了') diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 9cd5ba07..57ef56be 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -1,52 +1,51 @@ from src.batch.batch_functions import logging_sql from src.batch.common.batch_context import BatchContext -from src.db.async_database import AsyncDatabase +from src.db.database import Database from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime -logger = get_logger('施設担当者マスタ洗替') +logger = get_logger('48-施設担当者マスタ洗替') batch_context = BatchContext.get_instance() async def exec(): - db = AsyncDatabase.get_instance() + db = Database.get_instance() try: - await db.connect() + db.connect() logger.debug('##########################') logger.debug('START Changing Employee in charge of institution PGM.') # 業務日付を取得 syor_date = batch_context.syor_date # `emp_chg_inst_lau`をTruncate - await _truncate_emp_chg_inst_lau(db) + _truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert - await _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) + _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) # vop_hco_merge_vから、emp_chg_inst_lauをUpdate - await _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) + _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - await _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) + _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) logger.debug('##########################') logger.debug('End All Processing PGM.') except Exception as e: raise BatchOperationException(e) finally: - await db.disconnect() + db.disconnect() -async def _truncate_emp_chg_inst_lau(db: AsyncDatabase): +def _truncate_emp_chg_inst_lau(db: Database): logger.debug("##########################") try: - await db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") + db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau") except Exception as e: logger.debug("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!") - logger.exception(e) raise e logger.debug("Table `emp_chg_inst_lau` was truncated!") return -async def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: AsyncDatabase): +def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): logger.debug("##########################") try: elapsed_time = ElapsedTime() @@ -71,21 +70,22 @@ async def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: AsyncDatabase): WHERE enabled_flg = 'Y' """ - res = await db.execute(sql) + res = db.execute(sql) logging_sql(logger, sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') except Exception as e: logger.debug("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!") raise e logger.debug("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!") + return -async def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: AsyncDatabase, syor_date: str): +def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする logger.debug("##########################") try: - select_result = await db.execute_select( + select_result = db.execute_select( """ SELECT COUNT(v_inst_cd) AS row_count @@ -106,7 +106,7 @@ async def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: AsyncDatabase, syor_ logger.info('vop_hco_merge_v Table Data is exists!') # vop_hco_merge_v から、emp_chg_inst_lauをUpdateします - result = await db.execute_select( + result = db.execute_select( """ SELECT v_inst_cd, @@ -144,16 +144,15 @@ async def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: AsyncDatabase, syor_ logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") raise e logger.debug(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") - return -async def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: AsyncDatabase, syor_date: str): +def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): # dcf_inst_mergeから、emp_chg_inst_lauをUpdate # Get count from DCF_INST_MERGE logger.debug("##########################") try: - select_result = await db.execute_select( + select_result = db.execute_select( """ SELECT COUNT(dcf_inst_cd) AS row_count @@ -167,7 +166,6 @@ async def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: AsyncDatabase, syor_d """, {'syor_date': syor_date} ) - except Exception as e: logger.debug("Error! Getting Count of dcf_inst_merge was failed!") raise e @@ -205,7 +203,7 @@ async def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: AsyncDatabase, syor_d WHERE el.inst_cd = dm.dcf_inst_cd """ - res = await db.execute( + res = db.execute( update_sql, {'syor_date': syor_date} ) @@ -216,4 +214,5 @@ async def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: AsyncDatabase, syor_d raise e logger.debug("emp_chg_inst_lau.v_inst_cd was set!") + return diff --git a/ecs/jskult-batch-daily/src/db/async_database.py b/ecs/jskult-batch-daily/src/db/async_database.py deleted file mode 100644 index fb026fa4..00000000 --- a/ecs/jskult-batch-daily/src/db/async_database.py +++ /dev/null @@ -1,48 +0,0 @@ -import asyncio - -from sqlalchemy import CursorResult -from tenacity import retry, stop_after_attempt, wait_exponential - -from src.db.database import Database -from src.logging.get_logger import get_logger -from src.system_var import environment - -logger = get_logger(__name__) - - -class AsyncDatabase(Database): - """データベース非同期操作クラス""" - - def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: - super().__init__(username, password, host, port, schema) - - @classmethod - def get_instance(cls): - return cls( - username=environment.DB_USERNAME, - password=environment.DB_PASSWORD, - host=environment.DB_HOST, - port=environment.DB_PORT, - schema=environment.DB_SCHEMA - ) - - @retry( - wait=wait_exponential( - multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, - min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, - max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS - ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) - async def connect(self): - await asyncio.get_event_loop().run_in_executor(None, super().connect) - - async def execute_select(self, select_query: str, parameters=None) -> list[dict]: - res = await asyncio.get_event_loop().run_in_executor(None, super().execute_select, select_query, parameters) - return res - - async def execute(self, query: str, parameters=None) -> CursorResult: - res = await asyncio.get_event_loop().run_in_executor(None, super().execute, query, parameters) - return res - - async def disconnect(self): - await asyncio.get_event_loop().run_in_executor(None, super().disconnect) From 3299d88ac7231125cab057f4dac85e3197078a6a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 13:53:17 +0900 Subject: [PATCH 125/962] =?UTF-8?q?Revert=20"feat:=20=E4=B8=A6=E8=A1=8C?= =?UTF-8?q?=E5=87=A6=E7=90=86=E8=A6=8B=E7=9B=B4=E3=81=97=E3=80=82ECS=20?= =?UTF-8?q?=E3=82=BF=E3=82=B9=E3=82=AF=E3=81=AEvCPU=E6=95=B0=E6=9C=80?= =?UTF-8?q?=E9=81=A9=E5=8C=96=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81async-awa?= =?UTF-8?q?it=E3=81=A7=E4=B8=A6=E5=88=97=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e27757e3ee7ef20a218a354549bef89737660bae. --- ecs/jskult-batch-daily/entrypoint.py | 15 ++------ ...io_sales_lot.py => create_bio_sale_lot.py} | 2 +- .../laundering/emp_chg_inst_laundering.py | 2 +- .../src/batch/laundering/sales_laundering.py | 8 ++--- .../src/batch/parallel_processes.py | 32 +++++++++++++++++ .../src/batch/parallel_tasks.py | 34 ------------------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 8 ++--- 7 files changed, 43 insertions(+), 58 deletions(-) rename ecs/jskult-batch-daily/src/batch/bio_sales/{create_bio_sales_lot.py => create_bio_sale_lot.py} (97%) create mode 100644 ecs/jskult-batch-daily/src/batch/parallel_processes.py delete mode 100644 ecs/jskult-batch-daily/src/batch/parallel_tasks.py diff --git a/ecs/jskult-batch-daily/entrypoint.py b/ecs/jskult-batch-daily/entrypoint.py index 5b06ca48..472efd9f 100644 --- a/ecs/jskult-batch-daily/entrypoint.py +++ b/ecs/jskult-batch-daily/entrypoint.py @@ -1,21 +1,10 @@ """実消化&アルトマーク 日次バッチのエントリーポイント""" -import asyncio - from src import jobctrl_daily - -# 一部並行実行のため、非同期関数化 -async def run(): +if __name__ == '__main__': try: - task = asyncio.create_task(jobctrl_daily.exec()) - result_code = await task - exit(result_code) + exit(jobctrl_daily.exec()) except Exception: # エラーが起きても、正常系のコードで返す。 # エラーが起きた事実はbatch_process内でログを出す。 exit(0) - - -if __name__ == '__main__': - # 非同期関数を実行 - asyncio.run(run()) 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_sale_lot.py similarity index 97% rename from ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py rename to ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py index be9f2164..49bd19f1 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_sale_lot.py @@ -5,7 +5,7 @@ batch_context = BatchContext.get_instance() logger = get_logger('生物由来卸販売ロット分解') -async def exec(): +def exec(): """生物由来卸販売ロット分解""" logger.debug('生物由来卸販売ロット分解:起動') # 営業日ではない場合、処理をスキップする diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 57ef56be..16ff0c79 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -9,7 +9,7 @@ logger = get_logger('48-施設担当者マスタ洗替') batch_context = BatchContext.get_instance() -async def exec(): +def exec(): db = Database.get_instance() try: db.connect() 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 3265440f..7b77d8ac 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -7,15 +7,15 @@ batch_context = BatchContext.get_instance() logger = get_logger('実績洗替') -async def exec(): +def exec(): """実績洗替処理""" - logger.debug('実績更新:起動') + logger.info('実績更新:起動') # 営業日ではない場合、実績洗替処理は実行しない if batch_context.is_not_business_day: logger.info('営業日ではないため、実績洗替処理をスキップします。') return # 施設担当者洗替 - await emp_chg_inst_laundering.exec() + emp_chg_inst_laundering.exec() - logger.debug('実績更新:終了') + logger.info('実績更新:終了') diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py new file mode 100644 index 00000000..1b7db6c7 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -0,0 +1,32 @@ +"""並行処理""" + +import concurrent.futures + +from src.batch.bio_sales import create_bio_sale_lot +from src.batch.laundering import sales_laundering +from src.error.exceptions import BatchOperationException + + +def exec(): + # 並行処理を開始 + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + + # 実績更新 + future_sales_laundering = executor.submit(sales_laundering.exec) + # 生物由来ロット分解 + future_create_bio_sales_lot = executor.submit(create_bio_sale_lot.exec) + + # 両方の処理が完了するまで待つ + concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) + + # エラーがあれば呼び出し元でキャッチする + sales_laundering_exc = future_sales_laundering.exception() + create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() + + # いずれかにエラーが発生していれば、1つのエラーとして返す。 + if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: + sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' + create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' + raise BatchOperationException(f'並行処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') + + return diff --git a/ecs/jskult-batch-daily/src/batch/parallel_tasks.py b/ecs/jskult-batch-daily/src/batch/parallel_tasks.py deleted file mode 100644 index afb58820..00000000 --- a/ecs/jskult-batch-daily/src/batch/parallel_tasks.py +++ /dev/null @@ -1,34 +0,0 @@ -"""並行処理""" - -import asyncio - -from src.batch.bio_sales import create_bio_sales_lot -from src.batch.laundering import sales_laundering -from src.error.exceptions import BatchOperationException - - -async def exec(): - tasks = { - '実績更新': sales_laundering.exec(), - '生物由来ロット分解': create_bio_sales_lot.exec() - } - - # 並行処理を開始 - # 両方の処理が完了するまで待つ - done, _ = await asyncio.wait(tasks.values(), return_when=asyncio.ALL_COMPLETED) - task_results = {} - # 実行結果を確認する - for task_key, task in zip(tasks.keys(), done): - try: - task.result() - task_results[task_key] = True - except Exception as e: - task_results[task_key] = str(e) - - # エラーが発生しているかを確認し、エラーがあれば例外とする - if_error_tasks = {k: v for k, v in task_results.items() if v is not True} - if len(if_error_tasks.keys()) != 0: - messages = ', '.join([f'{k}={v}' for k, v in if_error_tasks.items()]) - raise BatchOperationException(f'並行処理中にエラーが発生しました。{messages}') - - return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 5c178220..3788d368 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -1,7 +1,7 @@ """実消化&アルトマーク 日次バッチ処理""" from src.aws.s3 import ConfigBucket -from src.batch import parallel_tasks +from src.batch import parallel_processes from src.batch.batch_functions import ( get_batch_statuses, update_batch_process_complete, update_batch_processing_flag_in_processing) @@ -19,7 +19,7 @@ logger = get_logger('日次処理コントロール') batch_context = BatchContext.get_instance() -async def exec(): +def exec(): try: logger.info('日次バッチ:開始') try: @@ -100,7 +100,7 @@ async def exec(): try: # 実績生物由来ロット分解と並行処理 logger.info('並行処理(実績更新-生物由来ロット分解):起動') - await parallel_tasks.exec() + parallel_processes.exec() logger.info('並行処理(実績更新-生物由来ロット分解):終了') except BatchOperationException as e: logger.exception(f'並行処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') @@ -130,5 +130,3 @@ async def exec(): except Exception as e: logger.exception(f'日次バッチ処理中に想定外のエラーが発生しました {e}') raise e - finally: - logger.info('日次バッチ:終了') From 5f7dc50040ed949616d566565e68055422224f8f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 14:07:32 +0900 Subject: [PATCH 126/962] =?UTF-8?q?feat:=20=E4=B8=A6=E8=A1=8C=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=85=83=E3=81=AB=E6=88=BB=E3=81=97=E3=81=9F?= =?UTF-8?q?(async-await=E2=86=92ThreadPoolExecutor)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{create_bio_sale_lot.py => create_bio_sales_lot.py} | 6 ++++++ ecs/jskult-batch-daily/src/batch/parallel_processes.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) rename ecs/jskult-batch-daily/src/batch/bio_sales/{create_bio_sale_lot.py => create_bio_sales_lot.py} (83%) diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py similarity index 83% rename from ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py rename to ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py index 49bd19f1..306ff772 100644 --- a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sale_lot.py +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py @@ -13,6 +13,12 @@ def exec(): logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') return + # 非同期処理のサンプル + import time + for _ in range(50): + logger.info('処理中') + time.sleep(0.5) + # TODO: ここに処理を追記していく logger.debug('生物由来卸販売ロット分解:終了') diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py index 1b7db6c7..603b5e52 100644 --- a/ecs/jskult-batch-daily/src/batch/parallel_processes.py +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -2,7 +2,7 @@ import concurrent.futures -from src.batch.bio_sales import create_bio_sale_lot +from src.batch.bio_sales import create_bio_sales_lot from src.batch.laundering import sales_laundering from src.error.exceptions import BatchOperationException @@ -14,7 +14,7 @@ def exec(): # 実績更新 future_sales_laundering = executor.submit(sales_laundering.exec) # 生物由来ロット分解 - future_create_bio_sales_lot = executor.submit(create_bio_sale_lot.exec) + future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec) # 両方の処理が完了するまで待つ concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) From 70637d960e4016b4471ab598ee08d01bf550a897 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 14:16:20 +0900 Subject: [PATCH 127/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0ID=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/emp_chg_inst_laundering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index 16ff0c79..e9d77529 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -5,7 +5,7 @@ from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime -logger = get_logger('48-施設担当者マスタ洗替') +logger = get_logger('施設担当者マスタ洗替') batch_context = BatchContext.get_instance() From c053e6aee4d3a90d7c428256b17827cfcb07753e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 14:19:51 +0900 Subject: [PATCH 128/962] =?UTF-8?q?feat:=20=E6=97=A2=E5=AD=98=E3=81=AE?= =?UTF-8?q?=E8=B3=87=E6=9D=90=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80?= =?UTF-8?q?=E6=A7=8B=E6=88=90=E5=A4=89=E6=9B=B4=EF=BC=88=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E6=B8=88=E3=81=BF=E3=81=AA=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E3=80=81=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=AE=E5=BD=B1=E9=9F=BF=E3=81=AF=E3=81=AA=E3=81=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/{ => src02}/crm_data_sync.sql | 0 rds_mysql/stored_procedure/{ => src02}/crm_history.sql | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename rds_mysql/stored_procedure/{ => src02}/crm_data_sync.sql (100%) rename rds_mysql/stored_procedure/{ => src02}/crm_history.sql (100%) diff --git a/rds_mysql/stored_procedure/crm_data_sync.sql b/rds_mysql/stored_procedure/src02/crm_data_sync.sql similarity index 100% rename from rds_mysql/stored_procedure/crm_data_sync.sql rename to rds_mysql/stored_procedure/src02/crm_data_sync.sql diff --git a/rds_mysql/stored_procedure/crm_history.sql b/rds_mysql/stored_procedure/src02/crm_history.sql similarity index 100% rename from rds_mysql/stored_procedure/crm_history.sql rename to rds_mysql/stored_procedure/src02/crm_history.sql From 2ff19c9d6def46e56ec3c11daf31c43f11c7a1b5 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 14:26:27 +0900 Subject: [PATCH 129/962] =?UTF-8?q?feat:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E7=94=A8=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AF=E4=B8=80?= =?UTF-8?q?=E6=97=A6=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E3=81=97=E3=81=A6=E3=81=8A=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/create_bio_sales_lot.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 306ff772..509d7300 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 @@ -13,11 +13,11 @@ def exec(): logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。') return - # 非同期処理のサンプル - import time - for _ in range(50): - logger.info('処理中') - time.sleep(0.5) + # # 非同期処理のサンプル + # import time + # for _ in range(50): + # logger.info('処理中') + # time.sleep(0.5) # TODO: ここに処理を追記していく From fff319f98b1a8268f1503738fd1a7802e2ae0d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 14:43:38 +0900 Subject: [PATCH 130/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_pharm_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 8a91d87d..50241a36 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -294,8 +294,8 @@ class ComPharmMapper(UltmarcTableMapper): if self.record.franchise_hq_id != '': set_clauses.append('franchise_hq_cd = :franchise_hq_cd') if self.record.franchise_hq_id == '@': - self.query_parameter['close_flg'] = None - self.query_parameter['close_yearmonth'] = None + self.query_parameter['franchise_hq_id'] = None + self.query_parameter['franchise_hq_cd'] = None self.query_parameter['franchise_hq_yobi'] = None return set_clauses From 38a3338f173f962bc90632d231cfd00b8b56f212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 14:44:20 +0900 Subject: [PATCH 131/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E7=94=A8=E3=83=87=E3=83=BC=E3=82=BF=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_pharm/com_pharm_insert.csv | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv index 24dfad89..1eb9a6de 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv @@ -1 +1,46 @@ -"102","1","2","3","A","200501","200601","7","8","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" \ No newline at end of file +"102","12","345678","3","A","200501","200601","7","8","123","456","78901","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオ","6","17","189","19","2099","221-0001","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","1.23457E+12","25","26","27","28","29","30","31","32","3","0120-1234-12345","353","22","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","9","204001","1","204201","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","12","3456","78901" +"102","3","3673000",,"A","20121127","20121128",,,,,,"正式店舗名03","セイシキテンポメイ03","略式03","リヤクシキ03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","2-45-1-03","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673001",,"A","20121128","20121129",,,,,,"正式店舗名03A01a","セイシキテンポメイ03A01A","略式03A01a","リヤクシキ03A01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","2-45-1-03A01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673002",,"A","20121127","20121128",,,,,,"正式店舗名03A01b-01","セイシキテンポメイ03A01B-01","略式03A01b-01","リヤクシキ03A01B-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673003",,"A","20121128","20121129",,,,,,"正式店舗名03A01b-02","セイシキテンポメイ03A01B-02","略式03A01b-02","リヤクシキ03A01B-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673004",,"A","20121128","20121129",,,,,,"正式店舗名03A01c","セイシキテンポメイ03A01C","略式03A01c","リヤクシキ03A01C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","2-45-1-03A01C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","3","3673005",,"A","20121128","20121129","1",,,,,"正式店舗名03A01d","セイシキテンポメイ03A01D","略式03A01d","リヤクシキ03A01D",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","2-45-1-03A01D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673010",,"A","20121127","20121128",,"1",,,,"正式店舗名03A02a","セイシキテンポメイ03A02A","略式03A02a","リヤクシキ03A02A","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","2-45-1-03A02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673011",,"A","20121127","20121128","1",,,,,"正式店舗名03B01a","セイシキテンポメイ03B01A","略式03B01a","リヤクシキ03B01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","2-45-1-03B01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673012",,"A","20121127","20121128",,,,,,"正式店舗名03B02a","セイシキテンポメイ03B02A","略式03B02a","リヤクシキ03B02A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","2-45-1-03B02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673013",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02b","セイシキテンポメイ03B02B","略式03B02b","リヤクシキ03B02B","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","2-45-1-03B02B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673014",,"A","20121127","20121128",,,,,,"正式店舗名03B02c-01","セイシキテンポメイ03B02C-01","略式03B02c-01","リヤクシキ03B02C-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673015",,"A","20121128","20121129",,,,,,"正式店舗名03B02c-02","セイシキテンポメイ03B02C-02","略式03B02c-02","リヤクシキ03B02C-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673016",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-01","セイシキテンポメイ03B02D-01","略式03B02d-01","リヤクシキ03B02D-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673020",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-02","セイシキテンポメイ03B02D-02","略式03B02d-02","リヤクシキ03B02D-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673021",,"A","20121128","20121129",,,,,,"正式店舗名03B02d-03","セイシキテンポメイ03B02D-03","略式03B02d-03","リヤクシキ03B02D-03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673022",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02e","セイシキテンポメイ03B02E","略式03B02e","リヤクシキ03B02E","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02e","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","2-45-1-03B02E","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673023",,"A","20121127","20121128",,,,,,"正式店舗名03B03a全件","セイシキテンポメイ03B03Aゼンケン","略式03B03a全件","リヤクシキ03B03Aゼンケン",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","2-45-1-03B03A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673024",,"A","20121127","20121128",,,,,,"正式店舗名03B03b","セイシキテンポメイ03B03B","略式03B03b","リヤクシキ03B03B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","2-45-1-03B03B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673025",,"A","20121127","20121128",,,,,,"正式店舗名03B04a","セイシキテンポメイ03B04A","略式03B04a","リヤクシキ03B04A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","2-45-1-03B04A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673026",,"A","20121127","20121128",,,,,,"正式店舗名03B04b","セイシキテンポメイ03B04B","略式03B04b","リヤクシキ03B04B","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","2-45-1-03B04B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673030",,"A","20121127","20121128",,,,,,"正式店舗名03B04c","セイシキテンポメイ03B04C","略式03B04c","リヤクシキ03B04C","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","2-45-1-03B04C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673031",,"A","20121127","20121128",,,,,,"正式店舗名03B05a","セイシキテンポメイ03B05A","略式03B05a","リヤクシキ03B05A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","2-45-1-03B05A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673032",,"A","20121127","20121128",,,,,,"正式店舗名03B05b","セイシキテンポメイ03B05B","略式03B05b","リヤクシキ03B05B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","2-45-1-03B05B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673033",,"A","20121127","20121128",,,,,,"正式店舗名03B06a","セイシキテンポメイ03B06A","略式03B06a","リヤクシキ03B06A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","2-45-1-03B06A","3","3","5","2","7","7","12","2","1",,"471","85",,,,,,,,,,, +"102","3","3673034",,"A","20121127","20121128",,,,,,"正式店舗名03B06b","セイシキテンポメイ03B06B","略式03B06b","リヤクシキ03B06B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","2-45-1-03B06B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673035",,"A","20121127","20121128",,,,,,"正式店舗名03B06c","セイシキテンポメイ03B06C","略式03B06c","リヤクシキ03B06C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","2-45-1-03B06C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673036",,"A","20121127","20121128",,,,,,"正式店舗名03B07a","セイシキテンポメイ03B07A","略式03B07a","リヤクシキ03B07A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B07a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","2-45-1-03B07A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673040",,"A","20121127","20121128",,,,,,"正式店舗名03B08a","セイシキテンポメイ03B08A","略式03B08a","リヤクシキ03B08A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B08a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","2-45-1-03B08A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673041",,"A","20121127","20121128",,,,,,"正式店舗名03B09a","セイシキテンポメイ03B09A","略式03B09a","リヤクシキ03B09A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","2-45-1-03B09A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673042",,"A","20121127","20121128",,,,,,"正式店舗名03B09b","セイシキテンポメイ03B09B","略式03B09b","リヤクシキ03B09B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","2-45-1-03B09B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09b","ダイヒヨウシヤメイ 03B09B",,,,,,,,, +"102","3","3673043",,"A","20121127","20121128",,,,,,"正式店舗名03B09c","セイシキテンポメイ03B09C","略式03B09c","リヤクシキ03B09C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","2-45-1-03B09C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09c","ダイヒヨウシヤメイ 03B09C",,,,,,,,, +"102","3","3673044",,"A","20121127","20121128",,,,,,"正式店舗名03B10a","セイシキテンポメイ03B10A","略式03B10a","リヤクシキ03B10A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","2-45-1-03B10A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","3","3673045",,"A","20121127","20121128",,,,,,"正式店舗名03B10b","セイシキテンポメイ03B10B","略式03B10b","リヤクシキ03B10B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","2-45-1-03B10B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201210",,,,,,, +"102","3","3673046",,"A","20121127","20121128",,,,,,"正式店舗名03B11a","セイシキテンポメイ03B11A","略式03B11a","リヤクシキ03B11A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","2-45-1-03B11A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673047",,"A","20121127","20121128",,,,,,"正式店舗名03B11b","セイシキテンポメイ03B11B","略式03B11b","リヤクシキ03B11B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","2-45-1-03B11B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","3","3673048",,"A","20121127","20121128",,,,,,"正式店舗名03B11c","セイシキテンポメイ03B11C","略式03B11c","リヤクシキ03B11C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","2-45-1-03B11C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","3","3673051",,"A","20121127","20121128",,,,,,"正式店舗名03B12a","セイシキテンポメイ03B12A","略式03B12a","リヤクシキ03B12A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","2-45-1-03B12A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673052",,"A","20121127","20121128",,,,,,"正式店舗名03B12b","セイシキテンポメイ03B12B","略式03B12b","リヤクシキ03B12B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","2-45-1-03B12B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,, +"102","3","3673053",,"A","20121127","20121128",,,,,,"正式店舗名03B12c","セイシキテンポメイ03B12C","略式03B12c","リヤクシキ03B12C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","2-45-1-03B12C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,, +"102","3","3673054",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","3","3673055",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","3","3673056",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","3","3673060",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","3","3673061",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673056", +"102","3","3673062",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, From c9b22d901e5d88fe262fe2587ed90b6c349e2f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 14:44:41 +0900 Subject: [PATCH 132/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E7=94=A8=E3=83=87=E3=83=BC=E3=82=BF=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_pharm/expect_com_pharm_insert.csv | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv index f692eb44..7c0b01c6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv @@ -1,2 +1,47 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" \ No newline at end of file +"123456783","22","6","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","アイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","亜居宇絵尾亜居宇絵尾亜居宇絵尾","1","9","204201","204001","アイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","3","7","0120-1234-12345","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","221-0001","17189192099","17","189","1.23457E+12","29303132","25262728","353","8","12345678901","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","12345678901","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673000","85","","セイシキテンポメイ03","リヤクシキ03","正式店舗名03","略式03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","東京都中央区日本橋浜町2-45-1 03","103-0007","13102242","13","102","2-45-1-03","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673001","85","","セイシキテンポメイ03A01A","リヤクシキ03A01A","正式店舗名03A01a","略式03A01a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","東京都中央区日本橋浜町2-45-1 03A01a","103-0007","13102242","13","102","2-45-1-03A01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673002","85","","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673003","85","","セイシキテンポメイ03A01B-02","リヤクシキ03A01B-02","正式店舗名03A01b-02","略式03A01b-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673004","85","","セイシキテンポメイ03A01C","リヤクシキ03A01C","正式店舗名03A01c","略式03A01c","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","東京都中央区日本橋浜町2-45-1 03A01c","103-0007","13102242","13","102","2-45-1-03A01C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673005","85","","セイシキテンポメイ03A01D","リヤクシキ03A01D","正式店舗名03A01d","略式03A01d","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","東京都中央区日本橋浜町2-45-1 03A01d","103-0007","13102242","13","102","2-45-1-03A01D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673012","85","","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673014","85","","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673015","85","","セイシキテンポメイ03B02C-02","リヤクシキ03B02C-02","正式店舗名03B02c-02","略式03B02c-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673016","85","","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673020","85","","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673021","85","","セイシキテンポメイ03B02D-03","リヤクシキ03B02D-03","正式店舗名03B02d-03","略式03B02d-03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673023","85","","セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673024","85","","セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673025","85","","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673031","85","","セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673040","85","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B","代表者名 03B09b","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","ダイヒヨウシヤメイ 03B09C","代表者名 03B09c","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","1","","201210","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673054","89","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673056","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673060","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"33673062","89","","セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" From da3b4251c35addbd6830dd7e2845e585a86e055a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 14:45:05 +0900 Subject: [PATCH 133/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_pharm/test_com_pharm_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py index 8d190859..6b9bc7cf 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -28,13 +28,13 @@ class TestComPharmMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): From fc64409badfd301642ba71573e14fc521fc75071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 18:18:17 +0900 Subject: [PATCH 134/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 50241a36..fbe7542f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -117,7 +117,6 @@ class ComPharmMapper(UltmarcTableMapper): src05.com_pharm SET abolish_ymd = :maintdate, - delete_sche_reason_cd = :del_cd, sys_update_date = :execute_date_str_ymd, update_prgm_id = :program_name WHERE @@ -173,7 +172,7 @@ class ComPharmMapper(UltmarcTableMapper): # 住所不明理由コード if self.record.hp_addr_lost_code != '': set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') - self.query_parameter['hp_addr_lost_code'] = None if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code + self.query_parameter['hp_addr_lost_code'] = '' if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code # 正式施設名カナ if self.record.hp_name_kana != '': @@ -196,41 +195,41 @@ class ComPharmMapper(UltmarcTableMapper): set_clauses.append('close_flg = :close_flg') set_clauses.append('close_start_ym = :close_yearmonth') if self.record.close_flg == '@': - self.query_parameter['close_flg'] = None - self.query_parameter['close_yearmonth'] = None + self.query_parameter['close_flg'] = '' + self.query_parameter['close_yearmonth'] = '' # 開業予定フラグ、開業予定年月 if len(self.record.open_flag + self.record.open_yearmonth) > 0: set_clauses.append('estab_sche_flg = :open_flag') set_clauses.append('estab_sche_ym = :open_yearmonth') if self.record.open_flag == '@': - self.query_parameter['open_flag'] = None - self.query_parameter['open_yearmonth'] = None + self.query_parameter['open_flag'] = '' + self.query_parameter['open_yearmonth'] = '' # 施設代表者カナ if self.record.president_Kana != '': set_clauses.append('inst_repre_kana = :president_Kana') - self.query_parameter['president_Kana'] = None if self.record.president_Kana == '@' else self.record.president_Kana + self.query_parameter['president_Kana'] = '' if self.record.president_Kana == '@' else self.record.president_Kana # 施設代表者 ※@が大文字 if self.record.president != '': set_clauses.append('inst_repre = :president') - self.query_parameter['president'] = None if self.record.president == '@' else self.record.president + self.query_parameter['president'] = '' if self.record.president == '@' else self.record.president # 電話番号なしフラグ if self.record.tel_nothing_flag != '': set_clauses.append('phone_number_non_flg = :tel_nothing_flag') - self.query_parameter['tel_nothing_flag'] = None if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag + self.query_parameter['tel_nothing_flag'] = '' if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag # 未確認フラグ if self.record.unconf_flg != '': set_clauses.append('unconf_flg = :unconf_flg') - self.query_parameter['unconf_flg'] = None if self.record.unconf_flg == '@' else self.record.unconf_flg + self.query_parameter['unconf_flg'] = '' if self.record.unconf_flg == '@' else self.record.unconf_flg # 施設電話番号 if self.record.tel_number != '': set_clauses.append('inst_phone_number = :tel_number') - self.query_parameter['tel_number'] = None if self.record.tel_number == '@' else self.record.tel_number + self.query_parameter['tel_number'] = '' if self.record.tel_number == '@' else self.record.tel_number # 施設住所カナ if self.record.addr_kana != '': @@ -256,7 +255,7 @@ class ComPharmMapper(UltmarcTableMapper): # 住所表示番号 if self.record.addr_number != '': set_clauses.append('addr_display_number = :addr_number') - self.query_parameter['addr_number'] = None if self.record.addr_number == '@' else self.record.addr_number + self.query_parameter['addr_number'] = '' if self.record.addr_number == '@' else self.record.addr_number # 住所カウント(集合項目である県コードが入っていればカウントをセットする) if len(self.record.prefc_cd) > 0: @@ -268,34 +267,34 @@ class ComPharmMapper(UltmarcTableMapper): # 経営体コード if self.record.mgtclass_code != '': set_clauses.append('manage_cd = :mgtclass_code') - self.query_parameter['mgtclass_code'] = None if self.record.mgtclass_code == '@' else self.record.mgtclass_code + self.query_parameter['mgtclass_code'] = '' if self.record.mgtclass_code == '@' else self.record.mgtclass_code # 削除予定理由コード if self.record.del_cd != '': set_clauses.append('delete_sche_reason_cd = :del_cd') - self.query_parameter['del_cd'] = None if self.record.del_cd == '@' else self.record.del_cd + self.query_parameter['del_cd'] = '' if self.record.del_cd == '@' else self.record.del_cd # 重複時相手先コード if self.record.dup_opp_cd != '': set_clauses.append('dup_opp_cd = :dup_opp_cd') - self.query_parameter['dup_opp_cd'] = None if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd + self.query_parameter['dup_opp_cd'] = '' if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd - # 管理薬剤師名(漢字) + # 管理薬剤師名(漢字)※@が大文字 if self.record.pharmacist != '': set_clauses.append('supervising_pharmacist = :pharmacist') - self.query_parameter['pharmacist'] = None if self.record.pharmacist == '@' else self.record.pharmacist + self.query_parameter['pharmacist'] = '' if self.record.pharmacist == '@' else self.record.pharmacist # 管理薬剤師名(カナ) if self.record.pharmacist_kana != '': set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana') - self.query_parameter['pharmacist_kana'] = None if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana + self.query_parameter['pharmacist_kana'] = '' if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana # チェーン店本部コード if self.record.franchise_hq_id != '': set_clauses.append('franchise_hq_cd = :franchise_hq_cd') if self.record.franchise_hq_id == '@': - self.query_parameter['franchise_hq_id'] = None - self.query_parameter['franchise_hq_cd'] = None - self.query_parameter['franchise_hq_yobi'] = None + self.query_parameter['franchise_hq_id'] = '' + self.query_parameter['franchise_hq_cd'] = '' + self.query_parameter['franchise_hq_yobi'] = '' return set_clauses From 75aa631b64737d337b843112e57d0039b8975170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 18:19:00 +0900 Subject: [PATCH 135/962] =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv index e6a84d8c..e806d922 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv @@ -1 +1,2 @@ -"102","9","9","9","C","200501","200601","7","0","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" \ No newline at end of file +"102","03","3673010",,"C","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","9","9","9","C","200501","200601","7","0","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" From de6183d68f59311ec9fc67785e735c4096b2e849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Apr 2023 18:19:26 +0900 Subject: [PATCH 136/962] =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_pharm/com_pharm_update.csv | 36 ++++++++++++++++++ .../com_pharm/db_com_pharm_before_delete.csv | 3 ++ .../com_pharm/db_com_pharm_before_update.csv | 37 +++++++++++++++++++ .../com_pharm/expect_com_pharm_delete.csv | 3 ++ .../com_pharm/expect_com_pharm_update.csv | 37 ++++++++++++++++++- 5 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv new file mode 100644 index 00000000..12427943 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv @@ -0,0 +1,36 @@ +"102","1","2","3","B",,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","4","5","6","B","200501","200601","6","7","55","56","57","正漢字","正カナ","略漢字","略カナ","0","61","62","63","64","001-6234","住所漢字","住所カナ","11","県","市","通","丁目","ケ","シ","ト","チ","0","119991234","11","66","代漢","代カナ","4","204411","8","204812","薬剤師漢字","薬剤師カナ","99","88","77" +"102","7","8","9","B","200501","200601","6","@","@",,,"正漢字","正カナ","略漢字","略カナ","@","61","62","63","64","001-6234","住所漢字","住所カナ","@","県","市","通","丁目","ケ","シ","ト","チ","@","@","@","66","@","@","@",,"@",,"@","@","@",,, +"102","03","3673002",,"B","20121128","20121129",,"5","03","3673003",,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673011",,"B","20121128","20121129","@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673012",,"B","20121128","20121129",,"1",,,,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673013",,"B","20121128","20121129",,"2",,,,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673014",,"B","20121128","20121129",,"5","03","3673015",,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673016",,"B","20121128","20121129",,"7","03","3673021",,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673020",,"B","20121128","20121129",,"7","03","3673021",,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673022",,"B","20121128","20121129",,"@",,,,,,,,"@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673023",,"B","20121128","20121129",,,,,,"正式店舗名03B03a差分","セイシキテンポメイ03B03Aサブン","略式03B03a差分","リヤクシキ03B03Aサブン",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673024",,"B","20121128","20121129",,,,,,"正式店舗名03B03b---+----2----+----3----+----4----+----5","セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8","略式03B03b-1----+","リヤクシキ03B03B---+----2----+----3----+----4",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673025",,"B","20121128","20121129",,,,,,,,,,"1",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673026",,"B","20121128","20121129",,,,,,,,,,"2",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673030",,"B","20121128","20121129",,,,,,,,,,"@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","03","3673031",,"B","20121128","20121129",,,,,,,,,,,"13","205","007","010","198-0036","東京都青梅市河辺町10-45-1 03B05a","トウキヨウト オウメシ カベマチ 10-45-1 03B05A","10-45-1-03B05","3","3","3","3","7","5","6","3",,,,,,,,,,,,,,,, +"102","03","3673032",,"B","20121128","20121129",,,,,,,,,,,"13","102","024","002","103-0007","東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6","2-45-1-03B05B","3","3","5","2","7","7","12","2",,,,,,,,,,,,,,,, +"102","03","3673033",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,"@","03-3249-8231",,,,,,,,,,,,,, +"102","03","3673034",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,"03-3249-8232",,,,,,,,,,,,,, +"102","03","3673035",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,"1","@",,,,,,,,,,,,,, +"102","03","3673036",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,"472",,,,,,,,,,,,, +"102","03","3673040",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"86",,,,,,,,,,,, +"102","03","3673041",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"代表者名 03B09a","ダイヒヨウシヤメイ 03B09A",,,,,,,,,, +"102","03","3673042",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"代表者名 03B09b---+----2","ダイヒヨウシヤメイ 03B09B--2",,,,,,,,,, +"102","03","3673043",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"@","@",,,,,,,,,, +"102","03","3673044",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1","201301",,,,,,,, +"102","03","3673045",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"@",,,,,,,,, +"102","03","3673046",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1","201210",,,,,, +"102","03","3673047",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1","201209",,,,,, +"102","03","3673048",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"@",,,,,,, +"102","03","3673051",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"管理薬剤師名 03B12a","カンリヤクザイシメイ 03B12A",,,, +"102","03","3673052",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"管理薬剤師名 03B12b-+----2","カンリヤクザイシメイ 03B12B-2",,,, +"102","03","3673053",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"@","@",,,, +"102","03","3673055",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"03","3673054",, +"102","03","3673061",,"B","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"03","3673060",, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv new file mode 100644 index 00000000..9951f19e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv @@ -0,0 +1,3 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv new file mode 100644 index 00000000..750492a9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv @@ -0,0 +1,37 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"456","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/18 10:27:00","com_pharm_mapper" +"789","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27","com_pharm_mapper","2023/4/18 10:27","com_pharm_mapper" +"033673002","85","","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85","","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85","","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85","","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85","","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85","","セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85","","セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85","","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673031","85","","セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","85","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B","代表者名 03B09b","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","ダイヒヨウシヤメイ 03B09C","代表者名 03B09c","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","1","","201210","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv new file mode 100644 index 00000000..66e0e414 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv @@ -0,0 +1,3 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","20121128","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","200501","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv index 9eb9020e..a428a914 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv @@ -1,3 +1,36 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" -"456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","ケシトチ","県市通丁目","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/18 10:27:00","com_pharm_mapper" +"033673002","85","6","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","5","033673003","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85","6","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","2","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85","6","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","5","033673015","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85","6","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85","6","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85","","セイシキテンポメイ03B03Aサブン","リヤクシキ03B03Aサブン","正式店舗名03B03a差分","略式03B03a差分","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85","","セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8","リヤクシキ03B03B---+----2----+----3----+----4","正式店舗名03B03b---+----2----+----3----+----4----+----5","略式03B03b-1----+","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85","1","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","2","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6","東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5","103-0007","13102024002","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8232","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","472","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","86","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","ダイヒヨウシヤメイ 03B09A","代表者名 03B09a","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B--2","代表者名 03B09b---+----2","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201301","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201209","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","管理薬剤師名 03B12a","カンリヤクザイシメイ 03B12A","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b-+----2","カンリヤクザイシメイ 03B12B-2","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","033673054","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","033673060","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/19 08:27:33","com_pharm_mapper" +"456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","ケシトチ","県市通丁目","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" +"789","66","","正カナ","略カナ","正漢字","略漢字","","","","","","","","6","","住所カナ","住所漢字","001-6234","61626364","61","62","","ケシトチ","県市通丁目","","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" From ecf193e61f6f3e7d84cc6146441cd3cd7796ea5e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 18:30:06 +0900 Subject: [PATCH 137/962] =?UTF-8?q?feat:=20=E4=B8=A6=E8=A1=8C=E5=87=A6?= =?UTF-8?q?=E7=90=86=E2=86=92=E4=B8=A6=E5=88=97=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/parallel_processes.py | 6 +++--- ecs/jskult-batch-daily/src/jobctrl_daily.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/parallel_processes.py b/ecs/jskult-batch-daily/src/batch/parallel_processes.py index 603b5e52..0fb2d715 100644 --- a/ecs/jskult-batch-daily/src/batch/parallel_processes.py +++ b/ecs/jskult-batch-daily/src/batch/parallel_processes.py @@ -1,4 +1,4 @@ -"""並行処理""" +"""並列処理""" import concurrent.futures @@ -8,7 +8,7 @@ from src.error.exceptions import BatchOperationException def exec(): - # 並行処理を開始 + # 並列処理を開始 with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: # 実績更新 @@ -27,6 +27,6 @@ def exec(): if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' - raise BatchOperationException(f'並行処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') + raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 3788d368..370f2179 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -98,12 +98,12 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS try: - # 実績生物由来ロット分解と並行処理 - logger.info('並行処理(実績更新-生物由来ロット分解):起動') + # 実績生物由来ロット分解と並列処理 + logger.info('並列処理(実績更新-生物由来ロット分解):起動') parallel_processes.exec() - logger.info('並行処理(実績更新-生物由来ロット分解):終了') + logger.info('並列処理(実績更新-生物由来ロット分解):終了') except BatchOperationException as e: - logger.exception(f'並行処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') + logger.exception(f'並列処理(実績更新-生物由来ロット分解)エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS try: From 149dbc5bf1a4fa25c50fb4ffdee4c7e6384eba4a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Apr 2023 18:30:41 +0900 Subject: [PATCH 138/962] =?UTF-8?q?feat:=20=E4=B8=A6=E5=88=97=E3=81=A7?= =?UTF-8?q?=E5=8B=95=E3=81=84=E3=81=A6=E3=81=84=E3=82=8B=E6=84=9F=E3=82=92?= =?UTF-8?q?=E5=87=BA=E3=81=99=E3=81=9F=E3=82=81=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E7=94=A8=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=82=E6=99=AE=E6=AE=B5=E3=81=AF=E3=82=B3=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=82=A2=E3=82=A6=E3=83=88=E3=80=82=E6=9C=80?= =?UTF-8?q?=E7=B5=82=E7=9A=84=E3=81=AB=E3=81=AF=E6=B6=88=E3=81=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/sales_laundering.py | 6 ++++++ 1 file changed, 6 insertions(+) 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 7b77d8ac..cb95b702 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -18,4 +18,10 @@ def exec(): # 施設担当者洗替 emp_chg_inst_laundering.exec() + # # 並列処理のテスト用コード + # import time + # for _ in range(100): + # logger.info('実績洗替処理中') + # time.sleep(0.25) + logger.info('実績更新:終了') From aca55d20f9ab44a66a7642c35c563402105a979b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 20 Apr 2023 10:55:23 +0900 Subject: [PATCH 139/962] =?UTF-8?q?feat:=20=E3=83=90=E3=83=83=E3=83=81?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AE=E3=82=BF=E3=82=B9=E3=82=AF=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task_settings/batch_daily_task_settings.env | 16 ++++++++++++++++ .../batch_lanudering_task_settings.env | 8 ++++++++ .../batch_monthly_task_settings.env | 10 ++++++++++ .../task_settings/dbdump_task_settings.env | 7 +++++++ 4 files changed, 41 insertions(+) create mode 100644 s3/config/jskult/task_settings/batch_daily_task_settings.env create mode 100644 s3/config/jskult/task_settings/batch_lanudering_task_settings.env create mode 100644 s3/config/jskult/task_settings/batch_monthly_task_settings.env create mode 100644 s3/config/jskult/task_settings/dbdump_task_settings.env diff --git a/s3/config/jskult/task_settings/batch_daily_task_settings.env b/s3/config/jskult/task_settings/batch_daily_task_settings.env new file mode 100644 index 00000000..2590fe79 --- /dev/null +++ b/s3/config/jskult/task_settings/batch_daily_task_settings.env @@ -0,0 +1,16 @@ +# jskult batch daily task environment file. +LOG_LEVEL=DEBUG +ULTMARC_DATA_FOLDER=recv +VJSK_DATA_RECEIVE_FOLDER=recv +VJSK_DATA_SEND_FOLDER=send +ULTMARC_BACKUP_FOLDER=ultmarc +VJSK_BACKUP_FOLDER=vjsk +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILENAME=jskult_wholesaler_stock_input_day_list.txt +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 diff --git a/s3/config/jskult/task_settings/batch_lanudering_task_settings.env b/s3/config/jskult/task_settings/batch_lanudering_task_settings.env new file mode 100644 index 00000000..23a40f3f --- /dev/null +++ b/s3/config/jskult/task_settings/batch_lanudering_task_settings.env @@ -0,0 +1,8 @@ +# jskult batch lanudering task environment file. +LOG_LEVEL=DEBUG +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=7 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau_all +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 diff --git a/s3/config/jskult/task_settings/batch_monthly_task_settings.env b/s3/config/jskult/task_settings/batch_monthly_task_settings.env new file mode 100644 index 00000000..441779df --- /dev/null +++ b/s3/config/jskult/task_settings/batch_monthly_task_settings.env @@ -0,0 +1,10 @@ +# jskult batch monthly task environment file. +LOG_LEVEL=DEBUG +ARISJ_DATA_FOLDER=DATA +ARISJ_BACKUP_FOLDER=arisj +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME=jskult_arisj_output_day_list.txt +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 diff --git a/s3/config/jskult/task_settings/dbdump_task_settings.env b/s3/config/jskult/task_settings/dbdump_task_settings.env new file mode 100644 index 00000000..9620ee44 --- /dev/null +++ b/s3/config/jskult/task_settings/dbdump_task_settings.env @@ -0,0 +1,7 @@ +# jskult db dump task environment file. +LOG_LEVEL=DEBUG +DUMP_BACKUP_FOLDER=dump +DB_CONNECTION_MAX_RETRY_ATTEMPT=4 +DB_CONNECTION_RETRY_INTERVAL_INIT=5 +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 From 16d0225068c57e8067c448b7ef51ed386540fac1 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 20 Apr 2023 12:34:03 +0900 Subject: [PATCH 140/962] =?UTF-8?q?pipenv=20update=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E3=82=92=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 224 +++++++++--------- .../check-view-security-option/Pipfile.lock | 62 +++-- 2 files changed, 135 insertions(+), 151 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 4ca22ac8..0e05bb05 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -18,27 +18,27 @@ "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:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", + "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" ], "index": "pypi", - "version": "==1.26.97" + "version": "==1.26.116" }, "botocore": { "hashes": [ - "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", - "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" + "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", + "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" ], "markers": "python_version >= '3.7'", - "version": "==1.29.97" + "version": "==1.29.116" }, "certifi": { "hashes": [ @@ -237,11 +237,11 @@ }, "platformdirs": { "hashes": [ - "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa", - "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8" + "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08", + "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e" ], "markers": "python_version >= '3.7'", - "version": "==3.1.1" + "version": "==3.2.0" }, "pyjwt": { "hashes": [ @@ -261,10 +261,10 @@ }, "pytz": { "hashes": [ - "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", - "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", + "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" ], - "version": "==2022.7.1" + "version": "==2023.3" }, "requests": { "hashes": [ @@ -339,14 +339,6 @@ } }, "develop": { - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" - }, "autopep8": { "hashes": [ "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", @@ -357,19 +349,19 @@ }, "boto3": { "hashes": [ - "sha256:19762b6a1adbe1963e26b8280211ca148017c970a2e1386312a9fc8a0a17dbd5", - "sha256:367a73c1ff04517849d8c4177fd775da2e258a3912ff6a497be258c30f509046" + "sha256:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", + "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" ], "index": "pypi", - "version": "==1.26.97" + "version": "==1.26.116" }, "botocore": { "hashes": [ - "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", - "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" + "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", + "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" ], "markers": "python_version >= '3.7'", - "version": "==1.29.97" + "version": "==1.29.116" }, "certifi": { "hashes": [ @@ -542,89 +534,85 @@ "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:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93", + "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013", + "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f", + "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21", + "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462", + "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc", + "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df", + "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1", + "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235", + "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934", + "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9", + "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1", + "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48", + "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4", + "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe", + "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a", + "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b", + "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21", + "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d", + "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa", + "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367", + "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535", + "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152", + "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e", + "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539", + "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1", + "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925", + "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0", + "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2", + "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab", + "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841", + "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30", + "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91", + "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c", + "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257", + "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9", + "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040", + "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911", + "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623", + "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259", + "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c", + "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79", + "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5", + "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4", + "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4", + "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22", + "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd", + "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1", + "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910", + "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859", + "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312" ], "markers": "python_version >= '3.7'", - "version": "==7.2.2" + "version": "==7.2.3" }, "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:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440", + "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288", + "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b", + "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958", + "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b", + "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d", + "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a", + "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404", + "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b", + "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e", + "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2", + "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c", + "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b", + "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9", + "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b", + "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636", + "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99", + "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e", + "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9" ], "markers": "python_version >= '3.6'", - "version": "==39.0.2" + "version": "==40.0.2" }, "exceptiongroup": { "hashes": [ @@ -740,19 +728,19 @@ }, "moto": { "hashes": [ - "sha256:363577f7a0cdf639852420f6ba5caa9aa3c90a688feae6315f8ee4bf324b8c27", - "sha256:63542b7b9f307b00fae460b42d15cf9346de3ad3b1287fba38fc68f3c05e4da4" + "sha256:56de986179f79920f59243bc532e03a7039d24a5ee5aec2eb3b666dcd23d6262", + "sha256:fb9a7615f744da4ea7f154ff8e79782b19781344a6356ca4c0d6217c1237d379" ], "index": "pypi", - "version": "==4.1.5" + "version": "==4.1.7" }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.1" }, "pluggy": { "hashes": [ @@ -795,11 +783,11 @@ }, "pytest": { "hashes": [ - "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", - "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" + "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362", + "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3" ], "index": "pypi", - "version": "==7.2.2" + "version": "==7.3.1" }, "pytest-cov": { "hashes": [ @@ -921,10 +909,10 @@ }, "types-pyyaml": { "hashes": [ - "sha256:19304869a89d49af00be681e7b267414df213f4eb89634c4495fa62e8f942b9f", - "sha256:5314a4b2580999b2ea06b2e5f9a7763d860d6e09cdf21c0e9561daa9cbd60178" + "sha256:5aed5aa66bd2d2e158f75dda22b059570ede988559f030cf294871d3b647e3e8", + "sha256:c51b1bd6d99ddf0aa2884a7a328810ebf70a4262c292195d3f4f9a0005f9eeb6" ], - "version": "==6.0.12.8" + "version": "==6.0.12.9" }, "urllib3": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index 91874a55..3aa17556 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:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", + "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" ], "index": "pypi", - "version": "==1.26.97" + "version": "==1.26.116" }, "botocore": { "hashes": [ - "sha256:0df677eb2bef3ba18ac69e007633559b4426df310eee99df9882437b5faf498a", - "sha256:176740221714c0f031c2cd773879df096dbc0f977c63b3e2ed6a956205f02e82" + "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", + "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" ], "markers": "python_version >= '3.7'", - "version": "==1.29.97" + "version": "==1.29.116" }, "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:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440", + "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288", + "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b", + "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958", + "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b", + "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d", + "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a", + "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404", + "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b", + "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e", + "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2", + "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c", + "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b", + "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9", + "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b", + "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636", + "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99", + "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e", + "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9" ], "index": "pypi", - "version": "==39.0.2" + "version": "==40.0.2" }, "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": [ From 0bb0af582e7cf2b0199122badcbf7ab4e9594cae Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 20 Apr 2023 13:28:15 +0900 Subject: [PATCH 141/962] =?UTF-8?q?fix:=20=E8=AA=8D=E8=A8=BC=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E3=82=92=E5=90=AB=E3=82=93=E3=81=A0=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AF=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 ecs/jskult-batch-daily/.env diff --git a/ecs/jskult-batch-daily/.env b/ecs/jskult-batch-daily/.env deleted file mode 100644 index 214b488c..00000000 --- a/ecs/jskult-batch-daily/.env +++ /dev/null @@ -1,10 +0,0 @@ -DB_HOST=localhost -DB_PORT=3306 -DB_USERNAME=root -DB_PASSWORD=admin -DB_SCHEMA=src05 -LOG_LEVEL=INFO -ULTMARC_DATA_BUCKET=**************** -ULTMARC_DATA_FOLDER=recv -ULTMARC_BACKUP_BUCKET=**************** -ULTMARC_BACKUP_FOLDER=ultmarc From 102e3318e4de5750b138a2a613d7875716644b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 20 Apr 2023 13:35:46 +0900 Subject: [PATCH 142/962] =?UTF-8?q?feat:=20=E6=96=BD=E8=A8=AD=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E3=83=9E=E3=82=B9=E3=82=BF=E6=B4=97=E6=9B=BF?= =?UTF-8?q?=E3=81=AE=E5=8B=95=E4=BD=9C=E3=81=AB=E5=A4=89=E5=8C=96=E3=81=8C?= =?UTF-8?q?=E7=94=9F=E3=81=98=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=80=81inst=5Fmerge=5Ft=5Fcreate=E3=83=97=E3=83=AD=E3=82=B7?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A3=E3=83=BC=E3=81=AESQL=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/src05/inst_merge_t_create.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 0afdedad..74472fcc 100644 --- a/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql +++ b/rds_mysql/stored_procedure/src05/inst_merge_t_create.sql @@ -56,11 +56,12 @@ BEGIN 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 - ci.delete_flg = '0' - AND src05.to_date_yyyymm01(dim.tekiyo_month) <= src05.get_syor_date() - AND dim.muko_flg = '0' - AND dim.enabled_flg = 'Y'; + 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, 'アルトマーク施設統合マスタ(洗替処理一時テーブル)作成② 終了' From 453fdb087b3f1a6b33303a05ef8df0e68e88b4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:21:47 +0900 Subject: [PATCH 143/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_pharm_mapper.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index fbe7542f..ded33379 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -248,9 +248,6 @@ class ComPharmMapper(UltmarcTableMapper): set_clauses.append('village_cd = :village_code') # 住所コード set_clauses.append('prefc_cd = :prefc_cd') # 都道府県コード set_clauses.append('city_cd = :city_cd') # 市区町村コード - self.record.village_code - self.record.prefc_cd - self.record.city_cd # 住所表示番号 if self.record.addr_number != '': @@ -261,8 +258,6 @@ class ComPharmMapper(UltmarcTableMapper): if len(self.record.prefc_cd) > 0: set_clauses.append('addr_cnt = :addr_count') # 住所カウント set_clauses.append('addr_cnt_kana = :addr_count_kana') # 住所カウントカナ - self.record.addr_count - self.record.addr_count_kana # 経営体コード if self.record.mgtclass_code != '': From 4e59971966f81ea50596462fe794e2b45ae65008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:22:27 +0900 Subject: [PATCH 144/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_pharm/test_com_pharm_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py index 6b9bc7cf..8d190859 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -28,13 +28,13 @@ class TestComPharmMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From f838146b319fda3d262ae73cf0910170da11e87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:28:05 +0900 Subject: [PATCH 145/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 4656d290..8482de45 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, com_pharm_mapper, null_mapper) + com_inst_mapper, com_pharm_mapper, com_forfront_med_equip_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -60,7 +60,7 @@ COM_TABLE_LIST = { # COM_高度先進医療 "021": com_hamtec_mapper.ComHamtecMapper, # COM_先端医療機器 - "022": null_mapper.NullMapper, + "022": com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, # COM_看護種別 "023": null_mapper.NullMapper, # COM_医療機能評価 From 5deec338edfbefa359bf1c04b9dc4b74e5c2481c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:28:56 +0900 Subject: [PATCH 146/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py new file mode 100644 index 00000000..62496980 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip + + +class ComForfrontMedEquipMapper(UltmarcTableMapper): + """レイアウト区分102: COM_薬局 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_forfront_med_equip + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_forfront_med_equip + ( + forfront_med_equip_cd, + forfront_med_equip_name, + regist_ymd, + update_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hi_medicmach_code, + :hi_medicmach_name, + :execute_datetime, + :execute_datetime, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_forfront_med_equip + SET + forfront_med_equip_name = :hi_medicmach_name, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 削除年月日 ← システム日付 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_forfront_med_equip + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + record: ComForfrontMedEquip + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPharm) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 更新の場合 + if self.record.hi_medicmach_name != '': + self.queries.append(update_query) + return From 143ba78b3802577961f221487afe27746a26ff55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:29:27 +0900 Subject: [PATCH 147/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env | 3 +++ .../utmp_tables/tables/com_forfront_med_equip.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py diff --git a/ecs/jskult-batch-daily/.env b/ecs/jskult-batch-daily/.env index 214b488c..96e2c07f 100644 --- a/ecs/jskult-batch-daily/.env +++ b/ecs/jskult-batch-daily/.env @@ -6,5 +6,8 @@ DB_SCHEMA=src05 LOG_LEVEL=INFO ULTMARC_DATA_BUCKET=**************** ULTMARC_DATA_FOLDER=recv +JSKULT_BACKUP_BUCKET=**************** ULTMARC_BACKUP_BUCKET=**************** ULTMARC_BACKUP_FOLDER=ultmarc +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py new file mode 100644 index 00000000..261ca07c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py @@ -0,0 +1,15 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComForfrontMedEquip(UltmarcTable): + """レイアウト区分022: COM_先端医療機器""" + hi_medicmach_code: str # 先進医療機器コード + hi_medicmach_name: str # 先端医療機器名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + + self.hi_medicmach_code = record[1] + self.hi_medicmach_name = record[4] + self.maint_flag = record[2] From 5eb217a048248eca988c78c16ed3f2ea7205e2ec Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 20 Apr 2023 15:53:27 +0900 Subject: [PATCH 148/962] =?UTF-8?q?feat:=20Web=E3=82=A2=E3=83=97=E3=83=AA?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=82=AF=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/jskult/task_settings/web_task_settings.env | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 s3/config/jskult/task_settings/web_task_settings.env diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env new file mode 100644 index 00000000..9cd4ecf8 --- /dev/null +++ b/s3/config/jskult/task_settings/web_task_settings.env @@ -0,0 +1,6 @@ +# webapp task environment file. +AWS_REGION=ap-northeast-1 +AUTHORIZE_ENDPOINT=oauth2/authorize +TOKEN_ENDPOINT=oauth2/token +BIO_SEARCH_RESULT_MAX_COUNT=35000 +SESSION_EXPIRE_MINUTE=20 From b0fbacc2eb4b961b71fa1c94271e39b0854683c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:28:05 +0900 Subject: [PATCH 149/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index ebea9e55..faf872ad 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, null_mapper) + com_inst_mapper, com_pharm_mapper, com_forfront_med_equip_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -60,7 +60,7 @@ COM_TABLE_LIST = { # COM_高度先進医療 "021": com_hamtec_mapper.ComHamtecMapper, # COM_先端医療機器 - "022": null_mapper.NullMapper, + "022": com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, # COM_看護種別 "023": null_mapper.NullMapper, # COM_医療機能評価 From 5047c9c02ab65f3f8e3d7583c66e8d9d9972a3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:28:56 +0900 Subject: [PATCH 150/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py new file mode 100644 index 00000000..62496980 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip + + +class ComForfrontMedEquipMapper(UltmarcTableMapper): + """レイアウト区分102: COM_薬局 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_forfront_med_equip + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_forfront_med_equip + ( + forfront_med_equip_cd, + forfront_med_equip_name, + regist_ymd, + update_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hi_medicmach_code, + :hi_medicmach_name, + :execute_datetime, + :execute_datetime, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_forfront_med_equip + SET + forfront_med_equip_name = :hi_medicmach_name, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 削除年月日 ← システム日付 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_forfront_med_equip + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + forfront_med_equip_cd = :hi_medicmach_code + """ + record: ComForfrontMedEquip + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPharm) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 更新の場合 + if self.record.hi_medicmach_name != '': + self.queries.append(update_query) + return From da81de238d2136a70447d7985d5e59673b853e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 14:29:27 +0900 Subject: [PATCH 151/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/tables/com_forfront_med_equip.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py new file mode 100644 index 00000000..261ca07c --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py @@ -0,0 +1,15 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComForfrontMedEquip(UltmarcTable): + """レイアウト区分022: COM_先端医療機器""" + hi_medicmach_code: str # 先進医療機器コード + hi_medicmach_name: str # 先端医療機器名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + + self.hi_medicmach_code = record[1] + self.hi_medicmach_name = record[4] + self.maint_flag = record[2] From f615f9b6d36016160595b55b7746c1d46d2be084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 18:21:28 +0900 Subject: [PATCH 152/962] =?UTF-8?q?Revert=20"=E5=85=88=E9=80=B2=E5=8C=BB?= =?UTF-8?q?=E7=99=82=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 143ba78b3802577961f221487afe27746a26ff55. --- .../utmp_tables/tables/com_forfront_med_equip.py | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py deleted file mode 100644 index 261ca07c..00000000 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py +++ /dev/null @@ -1,15 +0,0 @@ -from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable - - -class ComForfrontMedEquip(UltmarcTable): - """レイアウト区分022: COM_先端医療機器""" - hi_medicmach_code: str # 先進医療機器コード - hi_medicmach_name: str # 先端医療機器名 - maint_flag: str # 修正区分 - - def __init__(self, record: list[str]): - super().__init__(record) - - self.hi_medicmach_code = record[1] - self.hi_medicmach_name = record[4] - self.maint_flag = record[2] From 5f7cdc9af6db8cebd6451d50009ce57b9632c08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 18:21:53 +0900 Subject: [PATCH 153/962] =?UTF-8?q?Revert=20"=E5=85=88=E9=80=B2=E5=8C=BB?= =?UTF-8?q?=E7=99=82=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5deec338edfbefa359bf1c04b9dc4b74e5c2481c. --- .../concrete/com_forfront_med_equip_mapper.py | 93 ------------------- 1 file changed, 93 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py deleted file mode 100644 index 62496980..00000000 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ /dev/null @@ -1,93 +0,0 @@ -from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ - UltmarcTableMapper -from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip - - -class ComForfrontMedEquipMapper(UltmarcTableMapper): - """レイアウト区分102: COM_薬局 登録処理 """ - - # レコード存在確認SQL - RECORD_EXISTS_QUERY = """\ - SELECT - COUNT(*) AS count_num - FROM - src05.com_forfront_med_equip - WHERE - forfront_med_equip_cd = :hi_medicmach_code - """ - # データ登録用SQL - INSERT_QUERY = """\ - INSERT INTO src05.com_forfront_med_equip - ( - forfront_med_equip_cd, - forfront_med_equip_name, - regist_ymd, - update_ymd, - delete_ymd, - sys_regist_date, - regist_prgm_id, - sys_update_date, - update_prgm_id - ) - VALUES ( - :hi_medicmach_code, - :hi_medicmach_name, - :execute_datetime, - :execute_datetime, - NULL, - :execute_datetime, - :program_name, - :execute_datetime, - :program_name - ) - """ - # 更新用SQL - UPDATE_QUERY = """\ - UPDATE src05.com_forfront_med_equip - SET - forfront_med_equip_name = :hi_medicmach_name, - sys_update_date = :execute_datetime, - update_prgm_id = :program_name - WHERE - forfront_med_equip_cd = :hi_medicmach_code - """ - - # 修正区分が「C(削除)」の場合の更新SQL - # 削除年月日 ← システム日付 - LOGICAL_DELETE_QUERY = """\ - UPDATE - src05.com_forfront_med_equip - SET - delete_ymd = :execute_date_str_ymd, - sys_update_date = :execute_date_str_ymd, - update_prgm_id = :program_name - WHERE - forfront_med_equip_cd = :hi_medicmach_code - """ - record: ComForfrontMedEquip - - def __init__(self, record: list[str], db) -> None: - super().__init__(record, db, ComPharm) - program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) - # モジュール名をクエリパラメータに設定 - self.query_parameter['program_name'] = program_name - # 読み込んだレコード値もクエリパラメータに追加 - self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} - - def make_query(self): - # 修正区分がC(削除)の場合、論理削除 - if self.record.maint_flag == 'C': - self.queries.append(self.LOGICAL_DELETE_QUERY) - return - - # レコードの存在確認 - record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) - # 存在しない場合はInsert - if record_count[0]['count_num'] == 0: - self.queries.append(self.INSERT_QUERY) - return - - # 更新の場合 - if self.record.hi_medicmach_name != '': - self.queries.append(update_query) - return From d18caacc88993355f51ab15d71539796e816d2eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 18:21:59 +0900 Subject: [PATCH 154/962] =?UTF-8?q?Revert=20"=E5=85=88=E9=80=B2=E5=8C=BB?= =?UTF-8?q?=E7=99=82=E6=A9=9F=E5=99=A8=E3=80=80=E8=BF=BD=E5=8A=A0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f838146b319fda3d262ae73cf0910170da11e87a. --- .../batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 8482de45..4656d290 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, com_pharm_mapper, com_forfront_med_equip_mapper, null_mapper) + com_inst_mapper, com_pharm_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -60,7 +60,7 @@ COM_TABLE_LIST = { # COM_高度先進医療 "021": com_hamtec_mapper.ComHamtecMapper, # COM_先端医療機器 - "022": com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, + "022": null_mapper.NullMapper, # COM_看護種別 "023": null_mapper.NullMapper, # COM_医療機能評価 From d3fd0f7898ad3dbb14a55ee7727fcd8137c70018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 20 Apr 2023 18:32:06 +0900 Subject: [PATCH 155/962] =?UTF-8?q?=E5=85=88=E9=80=B2=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 16 +- .../tables/com_forfront_med_equip.py | 3 +- .../com_forfront_med_equip/__init__.py | 0 .../com_forfront_med_equip_delete.csv | 1 + .../com_forfront_med_equip_insert.csv | 1 + .../com_forfront_med_equip_update.csv | 2 + ...b_com_forfront_med_equip_before_delete.csv | 2 + ...b_com_forfront_med_equip_before_update.csv | 3 + .../expect_com_forfront_med_equip_delete.csv | 2 + .../expect_com_forfront_med_equip_insert.csv | 2 + .../expect_com_forfront_med_equip_update.csv | 3 + .../test_com_forfront_med_equip_mapper.py | 197 ++++++++++++++++++ 12 files changed, 222 insertions(+), 10 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py index 62496980..3c4c4e18 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -1,10 +1,10 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ - UltmarcTableMapper +UltmarcTableMapper + from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip - class ComForfrontMedEquipMapper(UltmarcTableMapper): - """レイアウト区分102: COM_薬局 登録処理 """ + """レイアウト区分022: COM_先進医療機器 登録処理 """ # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ @@ -32,8 +32,8 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): VALUES ( :hi_medicmach_code, :hi_medicmach_name, - :execute_datetime, - :execute_datetime, + :execute_date_str_ymd, + :execute_date_str_ymd, NULL, :execute_datetime, :program_name, @@ -59,7 +59,7 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): src05.com_forfront_med_equip SET delete_ymd = :execute_date_str_ymd, - sys_update_date = :execute_date_str_ymd, + sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE forfront_med_equip_cd = :hi_medicmach_code @@ -67,7 +67,7 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): record: ComForfrontMedEquip def __init__(self, record: list[str], db) -> None: - super().__init__(record, db, ComPharm) + super().__init__(record, db, ComForfrontMedEquip) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) # モジュール名をクエリパラメータに設定 self.query_parameter['program_name'] = program_name @@ -89,5 +89,5 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): # 更新の場合 if self.record.hi_medicmach_name != '': - self.queries.append(update_query) + self.queries.append(self.UPDATE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py index 261ca07c..a7559d0e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_forfront_med_equip.py @@ -9,7 +9,6 @@ class ComForfrontMedEquip(UltmarcTable): def __init__(self, record: list[str]): super().__init__(record) - self.hi_medicmach_code = record[1] - self.hi_medicmach_name = record[4] + self.hi_medicmach_name = record[5] self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv new file mode 100644 index 00000000..11deb49c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv @@ -0,0 +1 @@ +"022","99","C",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv new file mode 100644 index 00000000..80c3e354 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv @@ -0,0 +1 @@ +"022","99","A",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv new file mode 100644 index 00000000..251fc712 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv @@ -0,0 +1,2 @@ +"022","98","B",,,"" +"022","99","B",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv new file mode 100644 index 00000000..2153bc3e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv @@ -0,0 +1,2 @@ +"forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv new file mode 100644 index 00000000..416587f9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv @@ -0,0 +1,3 @@ +"forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv new file mode 100644 index 00000000..9d109626 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv @@ -0,0 +1,2 @@ +"forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv new file mode 100644 index 00000000..2153bc3e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv @@ -0,0 +1,2 @@ +"forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv new file mode 100644 index 00000000..b5527022 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv @@ -0,0 +1,3 @@ +"forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py new file mode 100644 index 00000000..b5d4cc09 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_config import BatchConfig +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_forfront_med_equip_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComForfrontMedEquipMapper: + """ レイアウト区分022: COM_先端医療機器 """ + + db: Database + batch_config: BatchConfig + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_config = BatchConfig.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_先端医療機器テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_insert.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_先端医療機器テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_forfront_med_equip_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_forfront_med_equip', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_update.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_先端医療機器テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_forfront_med_equip', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_forfront_med_equip_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_forfront_med_equip', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_forfront_med_equip_mapper.ComForfrontMedEquipMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_forfront_med_equip_delete.csv')) + primary_keys = [f"'{primary_key['forfront_med_equip_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 8efa0e9204621acf0d507ab572d8bbce8b444100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 09:36:57 +0900 Subject: [PATCH 156/962] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_forfront_med_equip_mapper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py index 3c4c4e18..d8ed1786 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -91,3 +91,6 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): if self.record.hi_medicmach_name != '': self.queries.append(self.UPDATE_QUERY) return + else: + return None + From 79447d3534e403a01f739f8f07d123c816f0a2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 10:07:33 +0900 Subject: [PATCH 157/962] =?UTF-8?q?=E5=B7=AE=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 7 ++++--- .../utmp_tables/ultmarc_table_mapper_factory.py | 2 +- .../test_com_forfront_med_equip_mapper.py | 12 ++++++------ ecs/jskult-batch-daily/tests/testing_utility.py | 7 ++++--- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py index d8ed1786..00ebc987 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -1,8 +1,9 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ -UltmarcTableMapper + UltmarcTableMapper from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip + class ComForfrontMedEquipMapper(UltmarcTableMapper): """レイアウト区分022: COM_先進医療機器 登録処理 """ @@ -92,5 +93,5 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): self.queries.append(self.UPDATE_QUERY) return else: - return None - + self.queries.append(None) + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index faf872ad..54507832 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, com_pharm_mapper, com_forfront_med_equip_mapper, null_mapper) + com_inst_mapper, com_forfront_med_equip_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py index b5d4cc09..fccc56ad 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -3,7 +3,7 @@ from datetime import datetime import pytest -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_forfront_med_equip_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, @@ -18,13 +18,13 @@ class TestComForfrontMedEquipMapper: """ レイアウト区分022: COM_先端医療機器 """ db: Database - batch_config: BatchConfig + batch_context: BatchContext test_file_path: str = path.dirname(__file__) @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """ テスト実行前後処理 """ - self.batch_config = BatchConfig.get_instance() + self.batch_context = BatchContext.get_instance() # setup self.db = database self.db.connect() @@ -50,7 +50,7 @@ class TestComForfrontMedEquipMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_insert.csv')) # 一旦全データをDBから削除 @@ -95,7 +95,7 @@ class TestComForfrontMedEquipMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_update.csv')) # 一旦全データをDBから削除 @@ -152,7 +152,7 @@ class TestComForfrontMedEquipMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_forfront_med_equip_delete.csv')) # 一旦全データをDBから削除 diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index e95da8e7..5a6c3a42 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,5 +1,5 @@ -"""テスト用共通処理関数""" import csv +import os import tempfile from datetime import datetime @@ -22,12 +22,13 @@ def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: """ # 一度、Shift-JISファイルで書き出す - with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932') as tmp_file: + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932', delete=False) as tmp_file: tmp_file.write(csv_file.read()) tmp_file.seek(0) tmpfile_path = tmp_file.name - dat_file = DatFile.from_path(tmpfile_path) + dat_file = DatFile.from_path(tmpfile_path) + os.unlink(tmpfile_path) return dat_file From 0b05b04cabfae7db09b112b944e15a00b7c9ab1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 10:11:16 +0900 Subject: [PATCH 158/962] =?UTF-8?q?=E5=B7=AE=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_pharm/test_com_pharm_mapper.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py index 8d190859..1cdd738c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -3,7 +3,7 @@ from datetime import datetime import pytest -from src.batch.common.batch_config import BatchConfig +from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_pharm_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, @@ -18,13 +18,13 @@ class TestComPharmMapper: """ レイアウト区分102: COM_薬局 """ db: Database - batch_config: BatchConfig + batch_context: BatchContext test_file_path: str = path.dirname(__file__) @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """ テスト実行前後処理 """ - self.batch_config = BatchConfig.get_instance() + self.batch_context = BatchContext.get_instance() # setup self.db = database self.db.connect() @@ -50,7 +50,7 @@ class TestComPharmMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_insert.csv')) # 一旦全データをDBから削除 @@ -95,7 +95,7 @@ class TestComPharmMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_update.csv')) # 一旦全データをDBから削除 @@ -152,7 +152,7 @@ class TestComPharmMapper: # Arrange # 処理日設定 - self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_pharm_delete.csv')) # 一旦全データをDBから削除 From 55674e03e9fa5877f36423f14139aacc78c784ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 10:17:36 +0900 Subject: [PATCH 159/962] =?UTF-8?q?win=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/testing_utility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index e95da8e7..5a6c3a42 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,5 +1,5 @@ -"""テスト用共通処理関数""" import csv +import os import tempfile from datetime import datetime @@ -22,12 +22,13 @@ def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: """ # 一度、Shift-JISファイルで書き出す - with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932') as tmp_file: + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932', delete=False) as tmp_file: tmp_file.write(csv_file.read()) tmp_file.seek(0) tmpfile_path = tmp_file.name - dat_file = DatFile.from_path(tmpfile_path) + dat_file = DatFile.from_path(tmpfile_path) + os.unlink(tmpfile_path) return dat_file From 59f0a2704d3e239bfb793cbee41599fbbf493820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 10:52:37 +0900 Subject: [PATCH 160/962] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E4=BB=95=E6=A7=98=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index ded33379..8be2741b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -147,17 +147,18 @@ class ComPharmMapper(UltmarcTableMapper): # 更新の場合 update_columns = ','.join(self.__make_update_query()) - - # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる - if len(update_columns) > 0: + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + self.queries.append(None) + return + else: + # 末尾にカンマを付けてSET句を完成させる update_columns += ',' - - update_query = self.UPDATE_QUERY.format( - update_columns=update_columns - ) - - self.queries.append(update_query) - return + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + return def __make_update_query(self): set_clauses = [] # 設定項目 From 53cea74369ad3ad022681c9b139eb7a7b8f86a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 11:31:15 +0900 Subject: [PATCH 161/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_pharm/com_pharm_update.csv | 1 + .../table_mapper/com_pharm/db_com_pharm_before_update.csv | 1 + .../table_mapper/com_pharm/expect_com_pharm_update.csv | 1 + 3 files changed, 3 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv index 12427943..c2f3a2a9 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_update.csv @@ -1,4 +1,5 @@ "102","1","2","3","B",,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"102","9","9","9","B",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "102","4","5","6","B","200501","200601","6","7","55","56","57","正漢字","正カナ","略漢字","略カナ","0","61","62","63","64","001-6234","住所漢字","住所カナ","11","県","市","通","丁目","ケ","シ","ト","チ","0","119991234","11","66","代漢","代カナ","4","204411","8","204812","薬剤師漢字","薬剤師カナ","99","88","77" "102","7","8","9","B","200501","200601","6","@","@",,,"正漢字","正カナ","略漢字","略カナ","@","61","62","63","64","001-6234","住所漢字","住所カナ","@","県","市","通","丁目","ケ","シ","ト","チ","@","@","@","66","@","@","@",,"@",,"@","@","@",,, "102","03","3673002",,"B","20121128","20121129",,"5","03","3673003",,,,,,"6",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv index 750492a9..398d83cd 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_update.csv @@ -1,5 +1,6 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" "456","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/18 10:27:00","com_pharm_mapper" "789","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27","com_pharm_mapper","2023/4/18 10:27","com_pharm_mapper" "033673002","85","","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv index a428a914..dccf6b06 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv @@ -34,3 +34,4 @@ "123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/19 08:27:33","com_pharm_mapper" "456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","ケシトチ","県市通丁目","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" "789","66","","正カナ","略カナ","正漢字","略漢字","","","","","","","","6","","住所カナ","住所漢字","001-6234","61626364","61","62","","ケシトチ","県市通丁目","","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" +"999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" From ab6920e16aa3d46bbd36e3e48faea59fb7b048c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 12:39:22 +0900 Subject: [PATCH 162/962] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E6=89=8B=E4=BB=95=E6=A7=98=E5=A4=89=E6=9B=B4=EF=BC=88?= =?UTF-8?q?alma=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_alma_mapper.py | 7 +++++-- .../table_mapper/com_alma/db_com_alma_before_delete.csv | 2 +- .../table_mapper/com_alma/expect_com_alma_delete.csv | 2 +- .../table_mapper/com_alma/expect_com_alma_update.csv | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index 5963aa3f..699cbe6c 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -88,5 +88,8 @@ class ComAlmaMapper(UltmarcTableMapper): if record_count[0]['count_num'] == 0: return self.INSERT_QUERY - # 存在する場合はUpdate - return self.UPDATE_QUERY + # 存在する場合ではUpdate + if self.record.alma == '': + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv index 259afa23..2aa73354 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/db_com_alma_before_delete.csv @@ -2,6 +2,6 @@ "001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" "002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" -"004",,"20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 11:35:27","clsComAlma" "005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" "006","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","clsComAlma" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv index 6cb36d4b..afaca4a8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv @@ -2,7 +2,7 @@ "001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" -"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","clsComAlma" "005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "006","福島医","20171020","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "007","群馬大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:43:15","com_alma_mapper","2017/10/20 10:43:15","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv index 50811ab3..4fc8b3bc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv @@ -2,7 +2,7 @@ "001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" -"004",,"20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" +"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" "005","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" -"007","神大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:35:27","com_alma_mapper" +"007","神大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:35:27","com_alma_mapper" \ No newline at end of file From ceaeffa02c99b45c21eeaa1708b20a4663cdaf4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 21 Apr 2023 13:38:00 +0900 Subject: [PATCH 163/962] =?UTF-8?q?feat:=20=E6=96=BD=E8=A8=AD=E6=8B=85?= =?UTF-8?q?=E5=BD=93=E8=80=85=E3=83=9E=E3=82=B9=E3=82=BF=E6=B4=97=E6=9B=BF?= =?UTF-8?q?(=E4=BB=AE=E8=A3=BD=E9=80=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laundering/emp_chg_inst_laundering.py | 79 +++++++------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index e9d77529..aabf4e10 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -21,10 +21,10 @@ def exec(): _truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) - # vop_hco_merge_vから、emp_chg_inst_lauをUpdate - _update_emp_chg_inst_lau_from_vop_hco_merge_v(db, syor_date) - # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - _update_dcf_inst_merge_from_emp_chg_inst_lau(db, syor_date) + # v_inst_merge_tから、emp_chg_inst_lauをUpdate + _update_emp_chg_inst_lau_from_v_inst_merge_t(db, syor_date) + # v_inst_merge_tから、emp_chg_inst_lauをUpdate + _update_v_inst_merge_t_from_emp_chg_inst_lau(db, syor_date) logger.debug('##########################') logger.debug('End All Processing PGM.') except Exception as e: @@ -81,8 +81,8 @@ def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): return -def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): - # vop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする +def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database, syor_date: str): + # v_inst_merge_tはデータが作られないため、この洗い替え処理は基本空振りする logger.debug("##########################") try: select_result = db.execute_select( @@ -90,35 +90,29 @@ def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): SELECT COUNT(v_inst_cd) AS row_count FROM - src05.vop_hco_merge_v - WHERE - STR_TO_DATE(apply_dt, '%Y-%m-%d') <= :syor_date - """, - {'syor_date': syor_date} + internal05.v_inst_merge_t + """ ) except Exception as e: - logger.debug("Error! `vop_hco_merge_v` Table count error!") + logger.debug("Error! `v_inst_merge_t` Table count error!") raise e count = [row for row in select_result][0]['row_count'] if count == 0: - logger.info('vop_hco_merge_v Table Data is not exists!') + logger.info('v_inst_merge_t Table Data is not exists!') return - logger.info('vop_hco_merge_v Table Data is exists!') - # vop_hco_merge_v から、emp_chg_inst_lauをUpdateします + logger.info('v_inst_merge_t Table Data is exists!') + # v_inst_merge_t から、emp_chg_inst_lauをUpdateします result = db.execute_select( """ SELECT v_inst_cd, v_inst_cd_merg FROM - src05.vop_hco_merge_v - WHERE - STR_TO_DATE(apply_dt, '%Y-%m-%d') <= :syor_date + internal05.v_inst_merge_t ORDER BY STR_TO_DATE(apply_dt, '%Y-%m-%d') ASC - """, - {'syor_date': syor_date} + """ ) for row in result: v_inst_cd = row['v_inst_cd'] @@ -147,9 +141,9 @@ def _update_emp_chg_inst_lau_from_vop_hco_merge_v(db: Database, syor_date: str): return -def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): - # dcf_inst_mergeから、emp_chg_inst_lauをUpdate - # Get count from DCF_INST_MERGE +def _update_v_inst_merge_t_from_emp_chg_inst_lau(db: Database, syor_date: str): + # inst_merge_tから、emp_chg_inst_lauをUpdate + # Get count from INST_MERGE_T logger.debug("##########################") try: select_result = db.execute_select( @@ -157,26 +151,20 @@ def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): SELECT COUNT(dcf_inst_cd) AS row_count FROM - src05.dcf_inst_merge - WHERE - muko_flg = '0' - AND dcf_inst_cd_new IS NOT NULL - AND enabled_flg = 'Y' - AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date - """, - {'syor_date': syor_date} + internal05.inst_merge_t + """ ) except Exception as e: - logger.debug("Error! Getting Count of dcf_inst_merge was failed!") + logger.debug("Error! Getting Count of internal05.inst_merge_t was failed!") raise e count = [row for row in select_result][0]['row_count'] if count == 0: - logger.info('dcf_inst_merge Table Data is not exists!') + logger.info('inst_merge_t Table Data is not exists!') return - logger.debug('dcf_inst_merge Table Data is exists!') - # dcf_inst_mergeから、emp_chg_inst_lauをUpdate + logger.debug('inst_merge_t Table Data is exists!') + # inst_merge_tから、emp_chg_inst_lauをUpdate logger.debug("##########################") logger.debug("#### UPDATE DATA #########") logger.debug("##########################") @@ -184,28 +172,15 @@ def _update_dcf_inst_merge_from_emp_chg_inst_lau(db: Database, syor_date: str): elapsed_time = ElapsedTime() update_sql = """ UPDATE - src05.emp_chg_inst_lau el, - ( - SELECT - dcf_inst_cd, - dcf_inst_cd_new - FROM - src05.dcf_inst_merge - WHERE - muko_flg = '0' - AND dcf_inst_cd_new IS NOT NULL - AND enabled_flg = 'Y' - AND STR_TO_DATE(CONCAT(tekiyo_month, '01'), '%Y%m%d') <= :syor_date - ) dm + src05.emp_chg_inst_lau el, internal05.inst_merge_t imt SET - el.inst_cd = dm.dcf_inst_cd_new, + el.inst_cd = imt.dcf_inst_cd_new, el.lua_ope_dt = SYSDATE() WHERE - el.inst_cd = dm.dcf_inst_cd + el.inst_cd = imt.dcf_inst_cd """ res = db.execute( - update_sql, - {'syor_date': syor_date} + update_sql ) logging_sql(logger, update_sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') From b28f7f1612b6ababaa1f5e87d4eba3babd04377c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 14:16:38 +0900 Subject: [PATCH 164/962] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E4=BB=95=E6=A7=98=E5=A4=89=E6=9B=B4=E4=B8=AD=EF=BC=88?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=93=E3=81=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_wrkplace_mapper.py | 13 +++++++------ .../com_dr_wrkplace/com_dr_wrkplace_update.csv | 3 ++- .../db_com_dr_wrkplace_before_update.csv | 1 + .../expect_com_dr_wrkplace_update.csv | 17 +++++++++-------- .../test_com_dr_wrkplace_mapper.py | 4 ++-- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py index 8b9253a2..eacaadae 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_wrkplace_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace class ComDrWrkplaceMapper(UltmarcTableMapper): - """レイアウト区分501-01:COM_医師勤務先 登録処理""" + """レイアウト区分502:COM_医師勤務先 登録処理""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ @@ -212,13 +212,14 @@ class ComDrWrkplaceMapper(UltmarcTableMapper): make_history_query = self.TO_HISTORY_QUERY update_columns = ','.join(set_clauses_with_historical + set_clause_without_historical) - if len(update_columns) > 0: + if len(update_columns) == 0: + update_query = None + else: # 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる update_columns += ',' - - update_query = self.UPDATE_QUERY.format( - update_columns=update_columns - ) + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) return [make_history_query, update_query] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv index 73c4c336..5cc42095 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/com_dr_wrkplace_update.csv @@ -2,4 +2,5 @@ "502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","@","@","" "502","01","997682","","A","00","5408060","","","20141113","20141114","","","","","","" "502","01","997682","","B","00","5402984","","","20141113","20141114","165","@","","","","" -"502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ","" \ No newline at end of file +"502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ","" +"502","01","999999","","B","00","5409446","","","20170906","20170910","","","","","","" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv index f0da440a..8113fcc1 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/db_com_dr_wrkplace_before_update.csv @@ -9,3 +9,4 @@ "005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005409446","01999999","1118",,,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:54:00","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv index 1cee6ac3..cce6de1e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -1,11 +1,12 @@ "dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" -"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" -"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" -"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" -"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" \ No newline at end of file +"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" +"005409446","01999999","1118",,,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:00:00","com_dr_wrkplace_mapper" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" +"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index 89e65b54..e532513d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -29,13 +29,13 @@ class TestComDrWrkplaceMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): From 0142c2658ea8851196db278733ca9b38ab1ff5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 21 Apr 2023 15:34:11 +0900 Subject: [PATCH 165/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=80=81=E3=82=AB?= =?UTF-8?q?=E3=83=A9=E3=83=A0=E5=90=8D=E5=A4=89=E6=9B=B4=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laundering/emp_chg_inst_laundering.py | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index aabf4e10..dc596f60 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -15,16 +15,14 @@ def exec(): db.connect() logger.debug('##########################') logger.debug('START Changing Employee in charge of institution PGM.') - # 業務日付を取得 - syor_date = batch_context.syor_date # `emp_chg_inst_lau`をTruncate _truncate_emp_chg_inst_lau(db) # emp_chg_inst から、`emp_chg_inst_lau`へInsert _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db) # v_inst_merge_tから、emp_chg_inst_lauをUpdate - _update_emp_chg_inst_lau_from_v_inst_merge_t(db, syor_date) - # v_inst_merge_tから、emp_chg_inst_lauをUpdate - _update_v_inst_merge_t_from_emp_chg_inst_lau(db, syor_date) + _update_emp_chg_inst_lau_from_v_inst_merge_t(db) + # inst_merge_tから、emp_chg_inst_lauをUpdate + _update_emp_chg_inst_lau_from_inst_merge_t(db) logger.debug('##########################') logger.debug('End All Processing PGM.') except Exception as e: @@ -81,8 +79,8 @@ def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database): return -def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database, syor_date: str): - # v_inst_merge_tはデータが作られないため、この洗い替え処理は基本空振りする +def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database): + # v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする logger.debug("##########################") try: select_result = db.execute_select( @@ -107,30 +105,28 @@ def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database, syor_date: str): """ SELECT v_inst_cd, - v_inst_cd_merg + v_inst_cd_merge FROM internal05.v_inst_merge_t - ORDER BY - STR_TO_DATE(apply_dt, '%Y-%m-%d') ASC """ ) for row in result: v_inst_cd = row['v_inst_cd'] - v_inst_cd_merge = row['v_inst_cd_merg'] + v_inst_cd_merge = row['v_inst_cd_merge'] try: elapsed_time = ElapsedTime() update_sql = """ UPDATE emp_chg_inst_lau SET - inst_cd = :v_inst_merge, + inst_cd = :v_inst_cd_merge, lua_ope_dt = SYSDATE() WHERE inst_cd = :v_inst_cd; """ update_result = db.execute( update_sql, - {'v_inst_cd': v_inst_cd, 'v_inst_cd_merg': v_inst_cd_merge} + {'v_inst_cd': v_inst_cd, 'v_inst_cd_merge': v_inst_cd_merge} ) logging_sql(logger, update_sql) logger.info(f'Query OK, {update_result.rowcount} rows affected ({elapsed_time.of})') @@ -141,7 +137,7 @@ def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database, syor_date: str): return -def _update_v_inst_merge_t_from_emp_chg_inst_lau(db: Database, syor_date: str): +def _update_emp_chg_inst_lau_from_inst_merge_t(db: Database): # inst_merge_tから、emp_chg_inst_lauをUpdate # Get count from INST_MERGE_T logger.debug("##########################") @@ -149,7 +145,7 @@ def _update_v_inst_merge_t_from_emp_chg_inst_lau(db: Database, syor_date: str): select_result = db.execute_select( """ SELECT - COUNT(dcf_inst_cd) AS row_count + COUNT(dcf_dsf_inst_cd) AS row_count FROM internal05.inst_merge_t """ @@ -174,14 +170,12 @@ def _update_v_inst_merge_t_from_emp_chg_inst_lau(db: Database, syor_date: str): UPDATE src05.emp_chg_inst_lau el, internal05.inst_merge_t imt SET - el.inst_cd = imt.dcf_inst_cd_new, + el.inst_cd = imt.dup_opp_cd, el.lua_ope_dt = SYSDATE() WHERE - el.inst_cd = imt.dcf_inst_cd + el.inst_cd = imt.dcf_dsf_inst_cd """ - res = db.execute( - update_sql - ) + res = db.execute(update_sql) logging_sql(logger, update_sql) logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') except Exception as e: From d64d6d2d4589c236f2f3a12612d979b20da714a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 15:38:13 +0900 Subject: [PATCH 166/962] =?UTF-8?q?=E5=85=88=E7=AB=AF=E5=8C=BB=E7=99=82?= =?UTF-8?q?=E6=A9=9F=E5=99=A8=E3=80=80=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 5 ++--- .../com_forfront_med_equip_delete.csv | 6 ++++++ .../com_forfront_med_equip_insert.csv | 6 ++++++ .../com_forfront_med_equip_update.csv | 7 ++++++- .../db_com_forfront_med_equip_before_delete.csv | 6 ++++++ .../db_com_forfront_med_equip_before_update.csv | 10 ++++++++-- .../expect_com_forfront_med_equip_delete.csv | 8 +++++++- .../expect_com_forfront_med_equip_insert.csv | 8 +++++++- .../expect_com_forfront_med_equip_update.csv | 10 ++++++++-- .../test_com_forfront_med_equip_mapper.py | 4 ++-- 10 files changed, 58 insertions(+), 12 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py index 00ebc987..2892d074 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -5,7 +5,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfr class ComForfrontMedEquipMapper(UltmarcTableMapper): - """レイアウト区分022: COM_先進医療機器 登録処理 """ + """レイアウト区分022: COM_先端医療機器 登録処理 """ # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ @@ -23,7 +23,6 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): forfront_med_equip_cd, forfront_med_equip_name, regist_ymd, - update_ymd, delete_ymd, sys_regist_date, regist_prgm_id, @@ -34,7 +33,6 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): :hi_medicmach_code, :hi_medicmach_name, :execute_date_str_ymd, - :execute_date_str_ymd, NULL, :execute_datetime, :program_name, @@ -47,6 +45,7 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): UPDATE src05.com_forfront_med_equip SET forfront_med_equip_name = :hi_medicmach_name, + update_ymd = :execute_date_str_ymd, sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv index 11deb49c..39f5dce7 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv @@ -1 +1,7 @@ +"022","11","A","20141113","20141114","" +"022","12","A","20141113","20141114","X線CT" +"022","13","A","20141113","20141114","CR" +"022","14","C","20141113","20141114","血管造影システム" +"022","15","A","20141113","20141114","アンガー型カメラ" +"022","16","A","20141113","20141114","SPECT" "022","99","C",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv index 80c3e354..fe5ae507 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_insert.csv @@ -1 +1,7 @@ +"022","11","A","20141113","20141114","MRI" +"022","12","A","20141113","20141114","X線CT" +"022","13","A","20141113","20141114","CR" +"022","14","A","20141113","20141114","血管造影システム" +"022","15","A","20141113","20141114","SPECT" +"022","16","A","20141113","20141114","アンガー型カメラ" "022","99","A",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv index 251fc712..5ae8452f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_update.csv @@ -1,2 +1,7 @@ -"022","98","B",,,"" +"022","11","B","20141113","20141114","" +"022","12","B","20141113","20141114","X線CT" +"022","13","B","20141113","20141114","CR" +"022","14","B","20141113","20141114","血管造影システム" +"022","15","B","20141113","20141114","アンガー型カメラ" +"022","16","B","20141113","20141114","SPECT" "022","99","B",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv index 2153bc3e..e9b7e50d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_delete.csv @@ -1,2 +1,8 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"11","MRI","20171023","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","clsComForfrontMedEqu" +"12","X線CT","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"13","CR","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"14","血管造影システム","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"15","アンガー型カメラ","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" +"16","SPECT","20171023","20171023","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","clsComForfrontMedEqu" "99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv index 416587f9..716c01cc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/db_com_forfront_med_equip_before_update.csv @@ -1,3 +1,9 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" -"99","あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"12","X線CT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"13","CR","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"15","SPECT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"16","アンガー型カメラ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv index 9d109626..0eead53f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv @@ -1,2 +1,8 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"11","MRI","20171023","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","clsComForfrontMedEqu" +"12","X線CT","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"13","CR","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"14","血管造影システム","20171023","20171023","20230421","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:14:25","com_forfront_med_equip_mapper" +"15","アンガー型カメラ","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"16","SPECT","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230421","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv index 2153bc3e..4c37e0fd 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_insert.csv @@ -1,2 +1,8 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"12","X線CT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"13","CR","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"15","SPECT","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"16","アンガー型カメラ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","com_forfront_med_equip_mapper","2017/10/23 15:01:26","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv index b5527022..133e13a9 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv @@ -1,3 +1,9 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" -"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230420","20230420","20230420","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 10:07:41","com_forfront_med_equip_mapper" +"12","X線CT","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"13","CR","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"14","血管造影システム","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"15","アンガー型カメラ","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"16","SPECT","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" +"98","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" +"99","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_forfront_med_equip_mapper","2023/04/19 00:00:00","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py index fccc56ad..73292fd8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -28,13 +28,13 @@ class TestComForfrontMedEquipMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): From 864a99f03a1ca8aaa6f6ba054847290b6f2bf376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 16:23:54 +0900 Subject: [PATCH 167/962] =?UTF-8?q?=E5=85=83=E3=81=AE=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expect_com_dr_wrkplace_update.csv | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv index cce6de1e..867d9fe5 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -1,12 +1,11 @@ "dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" -"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk" -"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" -"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" -"005409446","01999999","1118",,,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-02","NULL","NULL","NULL","NULL","NULL","2022-02-02 10:45:16","com_dr_wrkplace_mapper","2022-02-02 14:00:00","com_dr_wrkplace_mapper" -"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" -"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" -"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:39","clsComDrWrk" -"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:00:43","com_dr_wrkplace_mapper" +"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" +"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" From 9aea1a589ad5de1af902f096ac5bb679ab11b4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 16:24:45 +0900 Subject: [PATCH 168/962] =?UTF-8?q?DB=E3=81=AE=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=92=E5=A4=96=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_com_forfront_med_equip_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py index 73292fd8..fccc56ad 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -28,13 +28,13 @@ class TestComForfrontMedEquipMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From 3bdc7495b5b65e16def9fc1907c2b74216cef82a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 21 Apr 2023 16:28:47 +0900 Subject: [PATCH 169/962] =?UTF-8?q?feat:=20=E6=97=A5=E6=AC=A1=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=81=AEStepFunctions=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 47 +++++++++++- .../r-jskult-batch-daily-state.json | 72 +++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index be3baa0e..b2822e23 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -20,6 +20,14 @@ resource: - &STG_SG_ECS_ALL "sg-051e0fb9925539592" # セキュリティグループ(ecs-crm-datafetch) - &STG_SG_CRM_DATAFETCH "sg-0b20b7bb1cb1ab886" + # セキュリティグループ(ecs-jskult-batch-daily) + - &STG_SG_JSKULT_BATCH_DAILY "sg-020b3f6a5a6d6a3a0" + # セキュリティグループ(ecs-jskult-batch-monthly) + - &STG_SG_JSKULT_BATCH_MONTHLY "sg-05c7ad620d69e6f5f" + # セキュリティグループ(ecs-jskult-dbdump) + - &STG_SG_JSKULT_DBDUMP "sg-0967779af13538a8e" + # セキュリティグループ(ecs-jskult-batch-laundering) + - &STG_SG_JSKULT_BATCH_LAUNDERING "sg-00b9ea30c5c6bb77a" # 本番環境 product: # サブネット(PrivateSubnet1) @@ -30,7 +38,15 @@ resource: - &PRD_SG_ECS_ALL "sg-05df4823fc789b0fa" # セキュリティグループ(ecs-crm-datafetch) - &PRD_SG_CRM_DATAFETCH "sg-04de7fc3357d852af" - + # TODO: 本番リリース時にIDを正式化する + # セキュリティグループ(ecs-jskult-batch-daily) + - &PRD_SG_JSKULT_BATCH_DAILY "sg-xxxxxxxxxxxxxxxx" + # セキュリティグループ(ecs-jskult-batch-monthly) + - &PRD_SG_JSKULT_BATCH_MONTHLY "sg-xxxxxxxxxxxxxxxx" + # セキュリティグループ(ecs-jskult-dbdump) + - &PRD_SG_JSKULT_DBDUMP "sg-xxxxxxxxxxxxxxxx" + # セキュリティグループ(ecs-jskult-batch-laundering) + - &PRD_SG_JSKULT_BATCH_LAUNDERING "sg-xxxxxxxxxxxxxxxx" config: r-crm-datafetch-state: # ステージング環境 @@ -74,3 +90,32 @@ config: AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID # 東京リージョン REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + r-jskult-batch-daily-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-crm-datafetch) + SG_JSKULT_BATCH_DAILY: *STG_SG_JSKULT_BATCH_DAILY + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-crm-datafetch) + SG_JSKULT_BATCH_DAILY: *PRD_SG_JSKULT_BATCH_DAILY diff --git a/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json new file mode 100644 index 00000000..10f36de2 --- /dev/null +++ b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 日次バッチ起動ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-batch-daily-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_BATCH_DAILY}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-daily" + }, + "exec-batch-daily": { + "Comment": "実消化&アルトマーク 日次バッチ", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-batch-daily", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} From b52f8e6611812c6dbaaefcb94cfd72a2837b9876 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 21 Apr 2023 16:37:27 +0900 Subject: [PATCH 170/962] =?UTF-8?q?feat:=20=E6=9C=88=E6=AC=A1=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=83=81=E3=81=AE=E3=82=B9=E3=83=86=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=82=B7=E3=83=B3=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 37 +++++++++- .../r-jskult-batch-monthly-state.json | 72 +++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index b2822e23..ef81ab5e 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -48,6 +48,7 @@ resource: # セキュリティグループ(ecs-jskult-batch-laundering) - &PRD_SG_JSKULT_BATCH_LAUNDERING "sg-xxxxxxxxxxxxxxxx" config: + # CRMデータ取得 r-crm-datafetch-state: # ステージング環境 staging: @@ -77,6 +78,7 @@ config: SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-crm-datafetch) SG_CRM_DATAFETCH: *PRD_SG_CRM_DATAFETCH + # データ登録処理 r-data-import-state: # ステージング環境 staging: @@ -90,6 +92,7 @@ config: AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID # 東京リージョン REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # 実消化&アルトマーク 日次バッチ r-jskult-batch-daily-state: # ステージング環境 staging: @@ -103,7 +106,7 @@ config: SUBNET_PRI_1D: *STG_SUBNET_PRI_1D # セキュリティグループ(ecs-all) SG_ECS_ALL: *STG_SG_ECS_ALL - # セキュリティグループ(ecs-crm-datafetch) + # セキュリティグループ(ecs-jskut-batch-daily) SG_JSKULT_BATCH_DAILY: *STG_SG_JSKULT_BATCH_DAILY # 本番環境 product: @@ -117,5 +120,35 @@ config: SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D # セキュリティグループ(ecs-all) SG_ECS_ALL: *PRD_SG_ECS_ALL - # セキュリティグループ(ecs-crm-datafetch) + # セキュリティグループ(ecs-jskut-batch-daily) SG_JSKULT_BATCH_DAILY: *PRD_SG_JSKULT_BATCH_DAILY + # 実消化&アルトマーク 月次バッチ + r-jskult-batch-monthly-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-daily) + SG_JSKULT_BATCH_MONTHLY: *STG_SG_JSKULT_BATCH_MONTHLY + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-daily) + SG_JSKULT_BATCH_MONTHLY: *PRD_SG_JSKULT_BATCH_MONTHLY diff --git a/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json b/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json new file mode 100644 index 00000000..e149bc4a --- /dev/null +++ b/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 月次バッチ起動ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-batch-monthly-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_BATCH_MONTHLY}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-monthly" + }, + "exec-batch-monthly": { + "Comment": "実消化&アルトマーク 日次バッチ", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-batch-monthly", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} From 2a1eeabb02eee0bf0e6b8c0a8183c131d02ebb1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 17:03:42 +0900 Subject: [PATCH 171/962] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E5=A4=89=E6=9B=B4=EF=BC=88=E5=8C=BB=E5=B8=AB=E5=8B=A4?= =?UTF-8?q?=E5=8B=99=E5=85=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_dr_wrkplace/expect_com_dr_wrkplace_update.csv | 2 +- .../com_dr_wrkplace/test_com_dr_wrkplace_mapper.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv index 867d9fe5..142895a6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/expect_com_dr_wrkplace_update.csv @@ -2,7 +2,7 @@ "005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" "005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" -"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" +"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" "005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper" "005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index e532513d..89e65b54 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -29,13 +29,13 @@ class TestComDrWrkplaceMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From a5d48cbff8e85b71d86b2ab8a103a74267e1dd08 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 21 Apr 2023 17:12:02 +0900 Subject: [PATCH 172/962] =?UTF-8?q?feat:=20=E6=97=A5=E6=AC=A1dump=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=81=AE=E3=82=B9=E3=83=86=E3=83=BC=E3=83=88=E3=83=9E?= =?UTF-8?q?=E3=82=B7=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 30 ++++++++ .../r-jskult-batch-daily-state.json | 2 +- .../r-jskult-batch-monthly-state.json | 2 +- .../r-jskult-dbdump-state.json | 72 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index ef81ab5e..172bfbbd 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -152,3 +152,33 @@ config: SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-jskut-batch-daily) SG_JSKULT_BATCH_MONTHLY: *PRD_SG_JSKULT_BATCH_MONTHLY + # 実消化&アルトマーク 日次dump取得 + r-jskult-dbdump-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-dbdump) + SG_JSKULT_DBDUMP: *STG_SG_JSKULT_DBDUMP + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-dbdump) + SG_JSKULT_DBDUMP: *PRD_SG_JSKULT_DBDUMP diff --git a/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json index 10f36de2..07964c60 100644 --- a/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json +++ b/stepfunctions/r-jskult-batch-daily-state/r-jskult-batch-daily-state.json @@ -31,7 +31,7 @@ "Next": "exec-batch-daily" }, "exec-batch-daily": { - "Comment": "実消化&アルトマーク 日次バッチ", + "Comment": "実消化&アルトマーク 日次バッチ起動", "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Parameters": { diff --git a/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json b/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json index e149bc4a..468127bc 100644 --- a/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json +++ b/stepfunctions/r-jskult-batch-monthly-state/r-jskult-batch-monthly-state.json @@ -31,7 +31,7 @@ "Next": "exec-batch-monthly" }, "exec-batch-monthly": { - "Comment": "実消化&アルトマーク 日次バッチ", + "Comment": "実消化&アルトマーク 月次バッチ起動", "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Parameters": { diff --git a/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json new file mode 100644 index 00000000..dbcfb4b4 --- /dev/null +++ b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 日次dump取得ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-dbdump-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_DBDUMP}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-monthly" + }, + "exec-batch-monthly": { + "Comment": "実消化&アルトマーク 日次dump取得起動", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-dbdump", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} From efdc0a0a2398f1c616a120d8a38f377242a00576 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 21 Apr 2023 17:42:43 +0900 Subject: [PATCH 173/962] =?UTF-8?q?feat:=20=E5=AE=9F=E7=B8=BE=E5=85=A8?= =?UTF-8?q?=E4=BB=B6=E6=B4=97=E6=9B=BF=E3=83=90=E3=83=83=E3=83=81=E3=81=AE?= =?UTF-8?q?=E3=82=B9=E3=83=86=E3=83=BC=E3=83=88=E3=83=9E=E3=82=B7=E3=83=B3?= =?UTF-8?q?=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 34 ++++++++- .../r-jskult-batch-laundering-state.json | 72 +++++++++++++++++++ .../r-jskult-dbdump-state.json | 4 +- 3 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index 172bfbbd..c68ae70a 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -136,7 +136,7 @@ config: SUBNET_PRI_1D: *STG_SUBNET_PRI_1D # セキュリティグループ(ecs-all) SG_ECS_ALL: *STG_SG_ECS_ALL - # セキュリティグループ(ecs-jskut-batch-daily) + # セキュリティグループ(ecs-jskut-batch-monthly) SG_JSKULT_BATCH_MONTHLY: *STG_SG_JSKULT_BATCH_MONTHLY # 本番環境 product: @@ -150,7 +150,7 @@ config: SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D # セキュリティグループ(ecs-all) SG_ECS_ALL: *PRD_SG_ECS_ALL - # セキュリティグループ(ecs-jskut-batch-daily) + # セキュリティグループ(ecs-jskut-batch-monthly) SG_JSKULT_BATCH_MONTHLY: *PRD_SG_JSKULT_BATCH_MONTHLY # 実消化&アルトマーク 日次dump取得 r-jskult-dbdump-state: @@ -182,3 +182,33 @@ config: SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-jskut-dbdump) SG_JSKULT_DBDUMP: *PRD_SG_JSKULT_DBDUMP + # 実消化&アルトマーク 実績洗替バッチ + r-jskult-batch-laundering-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-laundering) + SG_JSKULT_BATCH_LAUNDERING: *STG_SG_JSKULT_BATCH_LAUNDERING + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-jskut-batch-laundering) + SG_JSKULT_BATCH_LAUNDERING: *STG_SG_JSKULT_BATCH_LAUNDERING diff --git a/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json b/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json new file mode 100644 index 00000000..c720e349 --- /dev/null +++ b/stepfunctions/r-jskult-batch-laundering-state/r-jskult-batch-laundering-state.json @@ -0,0 +1,72 @@ +{ + "Comment": "MeDaCA 実消化&アルトマーク 実績全件洗替バッチ起動ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:nds-notice-#{ENV_NAME}" + }, + "ecs": { + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-jskult-batch-laundering-ecs", + "LaunchType": "FARGATE", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_JSKULT_BATCH_LAUNDERING}" + ], + "AssignPublicIp": "DISABLED" + } + } + } + }, + "ResultPath": "$.params", + "Next": "exec-batch-laundering" + }, + "exec-batch-laundering": { + "Comment": "実消化&アルトマーク 実績全件洗替バッチ起動", + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "Cluster.$": "$.params.ecs.Cluster", + "LaunchType.$": "$.params.ecs.LaunchType", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-jskult-batch-laundering", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration" + }, + "Retry": [ + { + "ErrorEquals": ["States.ALL"], + "BackoffRate": 2, + "IntervalSeconds": 5, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": ["States.ALL"], + "ResultPath": "$.result", + "Next": "ErrorEnd" + } + ], + "ResultPath": "$.result", + "Next": "NormalEnd" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} diff --git a/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json index dbcfb4b4..47fc9208 100644 --- a/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json +++ b/stepfunctions/r-jskult-dbdump-state/r-jskult-dbdump-state.json @@ -28,9 +28,9 @@ } }, "ResultPath": "$.params", - "Next": "exec-batch-monthly" + "Next": "exec-dbdump" }, - "exec-batch-monthly": { + "exec-dbdump": { "Comment": "実消化&アルトマーク 日次dump取得起動", "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", From a50d021ae5639f997425f5d3bc0dafb2603cc1ec Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 21 Apr 2023 17:44:27 +0900 Subject: [PATCH 174/962] =?UTF-8?q?feat:=20=E3=82=BF=E3=82=B9=E3=82=AF?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D?= =?UTF-8?q?=E3=81=AEtypo=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ing_task_settings.env => batch_laundering_task_settings.env} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename s3/config/jskult/task_settings/{batch_lanudering_task_settings.env => batch_laundering_task_settings.env} (84%) diff --git a/s3/config/jskult/task_settings/batch_lanudering_task_settings.env b/s3/config/jskult/task_settings/batch_laundering_task_settings.env similarity index 84% rename from s3/config/jskult/task_settings/batch_lanudering_task_settings.env rename to s3/config/jskult/task_settings/batch_laundering_task_settings.env index 23a40f3f..c80314cf 100644 --- a/s3/config/jskult/task_settings/batch_lanudering_task_settings.env +++ b/s3/config/jskult/task_settings/batch_laundering_task_settings.env @@ -1,4 +1,4 @@ -# jskult batch lanudering task environment file. +# jskult batch laundering task environment file. LOG_LEVEL=DEBUG SALES_LAUNDERING_EXTRACT_DATE_PERIOD=7 SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau_all From ae27ee5c815f6c3b5db5f9772edd46730ee64cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 21 Apr 2023 18:49:07 +0900 Subject: [PATCH 175/962] =?UTF-8?q?=E7=9C=8B=E8=AD=B7=E7=A8=AE=E5=88=A5?= =?UTF-8?q?=E3=80=80=E6=96=B0=E8=A6=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_nurse_assrt_mapper.py | 98 +++++++++ .../utmp_tables/tables/com_nurse_assrt.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_nurse_assrt/__init__.py | 0 .../com_nurse_assrt_delete.csv | 7 + .../com_nurse_assrt_insert.csv | 7 + .../com_nurse_assrt_update.csv | 6 + .../db_com_nurse_assrt_before_delete.csv | 7 + .../db_com_nurse_assrt_before_update.csv | 7 + .../expect_com_nurse_assrt_delete.csv | 8 + .../expect_com_nurse_assrt_insert.csv | 8 + .../expect_com_nurse_assrt_update.csv | 7 + .../test_com_nurse_assrt_mapper.py | 197 ++++++++++++++++++ 13 files changed, 368 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py new file mode 100644 index 00000000..6d1086f0 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py @@ -0,0 +1,98 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_nurse_assrt import ComNurseAssrt + + +class ComNurseAssrtMapper(UltmarcTableMapper): + """レイアウト区分023: COM_看護種別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_nurse_assrt + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_nurse_assrt + ( + nurse_assrt_cd, + nurse_assrt_name, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :nurse_assrt_cd, + :nurse_assrt_name, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_nurse_assrt + SET + nurse_assrt_name = :nurse_assrt_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_nurse_assrt + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + nurse_assrt_cd = :nurse_assrt_cd + """ + record: ComNurseAssrt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComNurseAssrt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 更新する項目が無い場合 + if self.record.nurse_assrt_name == '': + return None + else: + # 更新する項目がある場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py new file mode 100644 index 00000000..710b9a0a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComNurseAssrt(UltmarcTable): + """レイアウト区分022: COM_看護種別""" + nurse_assrt_cd: str # 看護種別コード + nurse_assrt_name: str # 看護種別名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.nurse_assrt_cd = record[1] + self.nurse_assrt_name = record[5] + self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index ebea9e55..5896fc21 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, null_mapper) + com_inst_mapper, com_nurse_assrt_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -62,7 +62,7 @@ COM_TABLE_LIST = { # COM_先端医療機器 "022": null_mapper.NullMapper, # COM_看護種別 - "023": null_mapper.NullMapper, + "023": com_nurse_assrt_mapper.ComNurseAssrtMapper, # COM_医療機能評価 "024": null_mapper.NullMapper, # COM_地域クリティカルパス diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv new file mode 100644 index 00000000..9eafda82 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv @@ -0,0 +1,7 @@ +"023","3991","A","20141113","20141114","" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","C","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","4105","A","20141113","20141114","療養型介護療養施設サービス費" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv new file mode 100644 index 00000000..b12393f2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_insert.csv @@ -0,0 +1,7 @@ +"023","3991","A","20141113","20141114","診療所療養型種別不明" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","A","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","9999","A","20141113","20141114","ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおか" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv new file mode 100644 index 00000000..2eac2208 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_update.csv @@ -0,0 +1,6 @@ +"023","3991","A","20141113","20141114","" +"023","4101","A","20141113","20141114","療養型介護療養施設サービス費(Ⅰ)" +"023","4102","A","20141113","20141114","療養型介護療養施設サービス費(Ⅱ)" +"023","4103","A","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" +"023","4104","A","20141113","20141114","療養型介護療養施設サービス費種別不明" +"023","4999","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv new file mode 100644 index 00000000..de1019b7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_delete.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv new file mode 100644 index 00000000..de1019b7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/db_com_nurse_assrt_before_update.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","clsComNurseAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv new file mode 100644 index 00000000..2c4cc78a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv @@ -0,0 +1,8 @@ +"nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","20230421","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4105","療養型介護療養施設サービス費","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:31:18","com_nurse_assrt_mapper","2017/10/19 10:31:18","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv new file mode 100644 index 00000000..564adfff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_insert.csv @@ -0,0 +1,8 @@ +"nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"3991","診療所療養型種別不明","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4101","療養型介護療養施設サービス費(Ⅰ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費(Ⅳ)","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費種別不明","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" +"9999","ああああああああああいいいいいいいいいいううううううううううええええええええええおおおおおおか","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:01:14","com_nurse_assrt_mapper","2017/10/19 10:01:14","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv new file mode 100644 index 00000000..664f4879 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv @@ -0,0 +1,7 @@ +"nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4104","療養型介護療養施設サービス費種別不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" +"4999","療養型介護療養施設サービス費(Ⅳ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py new file mode 100644 index 00000000..8794677f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_nurse_assrt_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComNurseAssrtMapper: + """レイアウト区分004: COM_出身校""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_insert.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_出身校テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_nurse_assrt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_nurse_assrt', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_update.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_出身校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_nurse_assrt_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_nurse_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_nurse_assrt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_nurse_assrt', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_nurse_assrt_mapper.ComNurseAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_nurse_assrt_mapper.ComNurseAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_nurse_assrt_delete.csv')) + primary_keys = [f"'{primary_key['nurse_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_nurse_assrt WHERE nurse_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 4f48c40566120c2614c2f87762194e54597d8943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 09:27:08 +0900 Subject: [PATCH 176/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_pharm/com_pharm_insert.csv | 163 ++++++++++++----- .../com_pharm/expect_com_pharm_insert.csv | 164 +++++++++++++----- 2 files changed, 236 insertions(+), 91 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv index 1eb9a6de..cd75c6c1 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_insert.csv @@ -1,46 +1,119 @@ "102","12","345678","3","A","200501","200601","7","8","123","456","78901","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオ","6","17","189","19","2099","221-0001","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","1.23457E+12","25","26","27","28","29","30","31","32","3","0120-1234-12345","353","22","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","9","204001","1","204201","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","12","3456","78901" -"102","3","3673000",,"A","20121127","20121128",,,,,,"正式店舗名03","セイシキテンポメイ03","略式03","リヤクシキ03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","2-45-1-03","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673001",,"A","20121128","20121129",,,,,,"正式店舗名03A01a","セイシキテンポメイ03A01A","略式03A01a","リヤクシキ03A01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","2-45-1-03A01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673002",,"A","20121127","20121128",,,,,,"正式店舗名03A01b-01","セイシキテンポメイ03A01B-01","略式03A01b-01","リヤクシキ03A01B-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673003",,"A","20121128","20121129",,,,,,"正式店舗名03A01b-02","セイシキテンポメイ03A01B-02","略式03A01b-02","リヤクシキ03A01B-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673004",,"A","20121128","20121129",,,,,,"正式店舗名03A01c","セイシキテンポメイ03A01C","略式03A01c","リヤクシキ03A01C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","2-45-1-03A01C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, -"102","3","3673005",,"A","20121128","20121129","1",,,,,"正式店舗名03A01d","セイシキテンポメイ03A01D","略式03A01d","リヤクシキ03A01D",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","2-45-1-03A01D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673010",,"A","20121127","20121128",,"1",,,,"正式店舗名03A02a","セイシキテンポメイ03A02A","略式03A02a","リヤクシキ03A02A","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","2-45-1-03A02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673011",,"A","20121127","20121128","1",,,,,"正式店舗名03B01a","セイシキテンポメイ03B01A","略式03B01a","リヤクシキ03B01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","2-45-1-03B01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673012",,"A","20121127","20121128",,,,,,"正式店舗名03B02a","セイシキテンポメイ03B02A","略式03B02a","リヤクシキ03B02A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","2-45-1-03B02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673013",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02b","セイシキテンポメイ03B02B","略式03B02b","リヤクシキ03B02B","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","2-45-1-03B02B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673014",,"A","20121127","20121128",,,,,,"正式店舗名03B02c-01","セイシキテンポメイ03B02C-01","略式03B02c-01","リヤクシキ03B02C-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673015",,"A","20121128","20121129",,,,,,"正式店舗名03B02c-02","セイシキテンポメイ03B02C-02","略式03B02c-02","リヤクシキ03B02C-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673016",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-01","セイシキテンポメイ03B02D-01","略式03B02d-01","リヤクシキ03B02D-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673020",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-02","セイシキテンポメイ03B02D-02","略式03B02d-02","リヤクシキ03B02D-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673021",,"A","20121128","20121129",,,,,,"正式店舗名03B02d-03","セイシキテンポメイ03B02D-03","略式03B02d-03","リヤクシキ03B02D-03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673022",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02e","セイシキテンポメイ03B02E","略式03B02e","リヤクシキ03B02E","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02e","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","2-45-1-03B02E","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673023",,"A","20121127","20121128",,,,,,"正式店舗名03B03a全件","セイシキテンポメイ03B03Aゼンケン","略式03B03a全件","リヤクシキ03B03Aゼンケン",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","2-45-1-03B03A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673024",,"A","20121127","20121128",,,,,,"正式店舗名03B03b","セイシキテンポメイ03B03B","略式03B03b","リヤクシキ03B03B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","2-45-1-03B03B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673025",,"A","20121127","20121128",,,,,,"正式店舗名03B04a","セイシキテンポメイ03B04A","略式03B04a","リヤクシキ03B04A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","2-45-1-03B04A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673026",,"A","20121127","20121128",,,,,,"正式店舗名03B04b","セイシキテンポメイ03B04B","略式03B04b","リヤクシキ03B04B","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","2-45-1-03B04B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673030",,"A","20121127","20121128",,,,,,"正式店舗名03B04c","セイシキテンポメイ03B04C","略式03B04c","リヤクシキ03B04C","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","2-45-1-03B04C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673031",,"A","20121127","20121128",,,,,,"正式店舗名03B05a","セイシキテンポメイ03B05A","略式03B05a","リヤクシキ03B05A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","2-45-1-03B05A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673032",,"A","20121127","20121128",,,,,,"正式店舗名03B05b","セイシキテンポメイ03B05B","略式03B05b","リヤクシキ03B05B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","2-45-1-03B05B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673033",,"A","20121127","20121128",,,,,,"正式店舗名03B06a","セイシキテンポメイ03B06A","略式03B06a","リヤクシキ03B06A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","2-45-1-03B06A","3","3","5","2","7","7","12","2","1",,"471","85",,,,,,,,,,, -"102","3","3673034",,"A","20121127","20121128",,,,,,"正式店舗名03B06b","セイシキテンポメイ03B06B","略式03B06b","リヤクシキ03B06B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","2-45-1-03B06B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673035",,"A","20121127","20121128",,,,,,"正式店舗名03B06c","セイシキテンポメイ03B06C","略式03B06c","リヤクシキ03B06C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","2-45-1-03B06C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673036",,"A","20121127","20121128",,,,,,"正式店舗名03B07a","セイシキテンポメイ03B07A","略式03B07a","リヤクシキ03B07A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B07a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","2-45-1-03B07A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673040",,"A","20121127","20121128",,,,,,"正式店舗名03B08a","セイシキテンポメイ03B08A","略式03B08a","リヤクシキ03B08A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B08a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","2-45-1-03B08A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673041",,"A","20121127","20121128",,,,,,"正式店舗名03B09a","セイシキテンポメイ03B09A","略式03B09a","リヤクシキ03B09A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","2-45-1-03B09A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673042",,"A","20121127","20121128",,,,,,"正式店舗名03B09b","セイシキテンポメイ03B09B","略式03B09b","リヤクシキ03B09B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","2-45-1-03B09B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09b","ダイヒヨウシヤメイ 03B09B",,,,,,,,, -"102","3","3673043",,"A","20121127","20121128",,,,,,"正式店舗名03B09c","セイシキテンポメイ03B09C","略式03B09c","リヤクシキ03B09C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","2-45-1-03B09C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09c","ダイヒヨウシヤメイ 03B09C",,,,,,,,, -"102","3","3673044",,"A","20121127","20121128",,,,,,"正式店舗名03B10a","セイシキテンポメイ03B10A","略式03B10a","リヤクシキ03B10A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","2-45-1-03B10A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, -"102","3","3673045",,"A","20121127","20121128",,,,,,"正式店舗名03B10b","セイシキテンポメイ03B10B","略式03B10b","リヤクシキ03B10B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","2-45-1-03B10B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201210",,,,,,, -"102","3","3673046",,"A","20121127","20121128",,,,,,"正式店舗名03B11a","セイシキテンポメイ03B11A","略式03B11a","リヤクシキ03B11A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","2-45-1-03B11A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673047",,"A","20121127","20121128",,,,,,"正式店舗名03B11b","セイシキテンポメイ03B11B","略式03B11b","リヤクシキ03B11B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","2-45-1-03B11B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, -"102","3","3673048",,"A","20121127","20121128",,,,,,"正式店舗名03B11c","セイシキテンポメイ03B11C","略式03B11c","リヤクシキ03B11C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","2-45-1-03B11C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, -"102","3","3673051",,"A","20121127","20121128",,,,,,"正式店舗名03B12a","セイシキテンポメイ03B12A","略式03B12a","リヤクシキ03B12A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","2-45-1-03B12A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673052",,"A","20121127","20121128",,,,,,"正式店舗名03B12b","セイシキテンポメイ03B12B","略式03B12b","リヤクシキ03B12B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","2-45-1-03B12B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,, -"102","3","3673053",,"A","20121127","20121128",,,,,,"正式店舗名03B12c","セイシキテンポメイ03B12C","略式03B12c","リヤクシキ03B12C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","2-45-1-03B12C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,, -"102","3","3673054",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, -"102","3","3673055",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, -"102","3","3673056",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, -"102","3","3673060",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, -"102","3","3673061",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673056", -"102","3","3673062",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673000",,"A","20121127","20121128",,,,,,"正式店舗名03","セイシキテンポメイ03","略式03","リヤクシキ03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","2-45-1-03","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673001",,"A","20121128","20121129",,,,,,"正式店舗名03A01a","セイシキテンポメイ03A01A","略式03A01a","リヤクシキ03A01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","2-45-1-03A01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673002",,"A","20121127","20121128",,,,,,"正式店舗名03A01b-01","セイシキテンポメイ03A01B-01","略式03A01b-01","リヤクシキ03A01B-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673003",,"A","20121128","20121129",,,,,,"正式店舗名03A01b-02","セイシキテンポメイ03A01B-02","略式03A01b-02","リヤクシキ03A01B-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","2-45-1-03A01B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673004",,"A","20121128","20121129",,,,,,"正式店舗名03A01c","セイシキテンポメイ03A01C","略式03A01c","リヤクシキ03A01C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","2-45-1-03A01C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","03","3673005",,"A","20121128","20121129","1",,,,,"正式店舗名03A01d","セイシキテンポメイ03A01D","略式03A01d","リヤクシキ03A01D",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A01d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","2-45-1-03A01D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673010",,"A","20121127","20121128",,"1",,,,"正式店舗名03A02a","セイシキテンポメイ03A02A","略式03A02a","リヤクシキ03A02A","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03A02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","2-45-1-03A02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673011",,"A","20121127","20121128","1",,,,,"正式店舗名03B01a","セイシキテンポメイ03B01A","略式03B01a","リヤクシキ03B01A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B01a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","2-45-1-03B01A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673012",,"A","20121127","20121128",,,,,,"正式店舗名03B02a","セイシキテンポメイ03B02A","略式03B02a","リヤクシキ03B02A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","2-45-1-03B02A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673013",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02b","セイシキテンポメイ03B02B","略式03B02b","リヤクシキ03B02B","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","2-45-1-03B02B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673014",,"A","20121127","20121128",,,,,,"正式店舗名03B02c-01","セイシキテンポメイ03B02C-01","略式03B02c-01","リヤクシキ03B02C-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673015",,"A","20121128","20121129",,,,,,"正式店舗名03B02c-02","セイシキテンポメイ03B02C-02","略式03B02c-02","リヤクシキ03B02C-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","2-45-1-03B02C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673016",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-01","セイシキテンポメイ03B02D-01","略式03B02d-01","リヤクシキ03B02D-01",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673020",,"A","20121127","20121128",,,,,,"正式店舗名03B02d-02","セイシキテンポメイ03B02D-02","略式03B02d-02","リヤクシキ03B02D-02",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673021",,"A","20121128","20121129",,,,,,"正式店舗名03B02d-03","セイシキテンポメイ03B02D-03","略式03B02d-03","リヤクシキ03B02D-03",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02d","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","2-45-1-03B02D","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673022",,"A","20121127","20121128",,"1",,,,"正式店舗名03B02e","セイシキテンポメイ03B02E","略式03B02e","リヤクシキ03B02E","6","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B02e","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","2-45-1-03B02E","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673023",,"A","20121127","20121128",,,,,,"正式店舗名03B03a全件","セイシキテンポメイ03B03Aゼンケン","略式03B03a全件","リヤクシキ03B03Aゼンケン",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","2-45-1-03B03A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673024",,"A","20121127","20121128",,,,,,"正式店舗名03B03b","セイシキテンポメイ03B03B","略式03B03b","リヤクシキ03B03B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B03b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","2-45-1-03B03B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673025",,"A","20121127","20121128",,,,,,"正式店舗名03B04a","セイシキテンポメイ03B04A","略式03B04a","リヤクシキ03B04A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","2-45-1-03B04A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673026",,"A","20121127","20121128",,,,,,"正式店舗名03B04b","セイシキテンポメイ03B04B","略式03B04b","リヤクシキ03B04B","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","2-45-1-03B04B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673030",,"A","20121127","20121128",,,,,,"正式店舗名03B04c","セイシキテンポメイ03B04C","略式03B04c","リヤクシキ03B04C","1","13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B04c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","2-45-1-03B04C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673031",,"A","20121127","20121128",,,,,,"正式店舗名03B05a","セイシキテンポメイ03B05A","略式03B05a","リヤクシキ03B05A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","2-45-1-03B05A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673032",,"A","20121127","20121128",,,,,,"正式店舗名03B05b","セイシキテンポメイ03B05B","略式03B05b","リヤクシキ03B05B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B05b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","2-45-1-03B05B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673033",,"A","20121127","20121128",,,,,,"正式店舗名03B06a","セイシキテンポメイ03B06A","略式03B06a","リヤクシキ03B06A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","2-45-1-03B06A","3","3","5","2","7","7","12","2","1",,"471","85",,,,,,,,,,, +"102","03","3673034",,"A","20121127","20121128",,,,,,"正式店舗名03B06b","セイシキテンポメイ03B06B","略式03B06b","リヤクシキ03B06B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","2-45-1-03B06B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673035",,"A","20121127","20121128",,,,,,"正式店舗名03B06c","セイシキテンポメイ03B06C","略式03B06c","リヤクシキ03B06C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B06c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","2-45-1-03B06C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673036",,"A","20121127","20121128",,,,,,"正式店舗名03B07a","セイシキテンポメイ03B07A","略式03B07a","リヤクシキ03B07A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B07a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","2-45-1-03B07A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673040",,"A","20121127","20121128",,,,,,"正式店舗名03B08a","セイシキテンポメイ03B08A","略式03B08a","リヤクシキ03B08A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B08a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","2-45-1-03B08A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673041",,"A","20121127","20121128",,,,,,"正式店舗名03B09a","セイシキテンポメイ03B09A","略式03B09a","リヤクシキ03B09A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","2-45-1-03B09A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673042",,"A","20121127","20121128",,,,,,"正式店舗名03B09b","セイシキテンポメイ03B09B","略式03B09b","リヤクシキ03B09B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","2-45-1-03B09B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09b","ダイヒヨウシヤメイ 03B09B",,,,,,,,, +"102","03","3673043",,"A","20121127","20121128",,,,,,"正式店舗名03B09c","セイシキテンポメイ03B09C","略式03B09c","リヤクシキ03B09C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B09c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","2-45-1-03B09C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","代表者名 03B09c","ダイヒヨウシヤメイ 03B09C",,,,,,,,, +"102","03","3673044",,"A","20121127","20121128",,,,,,"正式店舗名03B10a","セイシキテンポメイ03B10A","略式03B10a","リヤクシキ03B10A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","2-45-1-03B10A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201212",,,,,,, +"102","03","3673045",,"A","20121127","20121128",,,,,,"正式店舗名03B10b","セイシキテンポメイ03B10B","略式03B10b","リヤクシキ03B10B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B10b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","2-45-1-03B10B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,"1","201210",,,,,,, +"102","03","3673046",,"A","20121127","20121128",,,,,,"正式店舗名03B11a","セイシキテンポメイ03B11A","略式03B11a","リヤクシキ03B11A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","2-45-1-03B11A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673047",,"A","20121127","20121128",,,,,,"正式店舗名03B11b","セイシキテンポメイ03B11B","略式03B11b","リヤクシキ03B11B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","2-45-1-03B11B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","03","3673048",,"A","20121127","20121128",,,,,,"正式店舗名03B11c","セイシキテンポメイ03B11C","略式03B11c","リヤクシキ03B11C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B11c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","2-45-1-03B11C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,"1","201210",,,,, +"102","03","3673051",,"A","20121127","20121128",,,,,,"正式店舗名03B12a","セイシキテンポメイ03B12A","略式03B12a","リヤクシキ03B12A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","2-45-1-03B12A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673052",,"A","20121127","20121128",,,,,,"正式店舗名03B12b","セイシキテンポメイ03B12B","略式03B12b","リヤクシキ03B12B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","2-45-1-03B12B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B",,, +"102","03","3673053",,"A","20121127","20121128",,,,,,"正式店舗名03B12c","セイシキテンポメイ03B12C","略式03B12c","リヤクシキ03B12C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B12c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","2-45-1-03B12C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,"管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C",,, +"102","03","3673054",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673055",,"A","20121127","20121128",,,,,,"正式店舗名03B13a","セイシキテンポメイ03B13A","略式03B13a","リヤクシキ03B13A",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13a","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","2-45-1-03B13A","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,,, +"102","03","3673056",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673060",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673061",,"A","20121127","20121128",,,,,,"正式店舗名03B13b","セイシキテンポメイ03B13B","略式03B13b","リヤクシキ03B13B",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13b","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","2-45-1-03B13B","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673056", +"102","03","3673062",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","89",,,,,,,,,,, +"102","03","3673063",,"A","20121127","20121128",,,,,,"正式店舗名03B13c","セイシキテンポメイ03B13C","略式03B13c","リヤクシキ03B13C",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 03B13c","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","2-45-1-03B13C","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85",,,,,,,,,"3","3673062", +"102","03","3673801",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ1","□","リヤクシキモジ1",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ1","2-45-1-1","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ1 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ1 タロウ",,, +"102","03","3673802",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ2","□","リヤクシキモジ2",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ2","2-45-1-2","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ2 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ2 タロウ",,, +"102","03","3673803",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ3","□","リヤクシキモジ3",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ3","2-45-1-3","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ3 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ3 タロウ",,, +"102","03","3673804",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ4","","リヤクシキモジ4",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ4","2-45-1-4","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ4 タロウ",,,,," 太郎","カンリヤクザイシメイモジ4 タロウ",,, +"102","03","3673805",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ5","","リヤクシキモジ5",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ5","2-45-1-5","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ5 タロウ",,,,," 太郎","カンリヤクザイシメイモジ5 タロウ",,, +"102","03","3673806",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ6","","リヤクシキモジ6",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ6","2-45-1-6","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ6 タロウ",,,,," 太郎","カンリヤクザイシメイモジ6 タロウ",,, +"102","03","3673807",,"A","20121127","20121128",,,,,,"□□□□□","セイシキテンポメイモジ7","□□□□□","リヤクシキモジ7",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ7","2-45-1-7","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□ 太郎","ダイヒヨウシヤメイモジ7 タロウ",,,,,"□□□□□ 太郎","カンリヤクザイシメイモジ7 タロウ",,, +"102","03","3673808",,"A","20121127","20121128",,,,,,"□□□□□","セイシキテンポメイモジ8","□□□□□","リヤクシキモジ8",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ8","2-45-1-8","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□ 太郎","ダイヒヨウシヤメイモジ8 タロウ",,,,,"□□□□□ 太郎","カンリヤクザイシメイモジ8 タロウ",,, +"102","03","3673809",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ9","□□□□□□□□","リヤクシキモジ9",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ9","2-45-1-9","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ9 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ9 タロウ",,, +"102","03","3673810",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ10","□□□□□□□□","リヤクシキモジ10",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ10","2-45-1-10","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ10 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ10 タロウ",,, +"102","03","3673811",,"A","20121127","20121128",,,,,,"□□□□□□","セイシキテンポメイモジ11","□□□□□□","リヤクシキモジ11",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ11","2-45-1-11","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□ 太郎","ダイヒヨウシヤメイモジ11 タロウ",,,,,"□□□□□□ 太郎","カンリヤクザイシメイモジ11 タロウ",,, +"102","03","3673812",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ12","□□□□□□□","リヤクシキモジ12",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ12","2-45-1-12","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ12 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ12 タロウ",,, +"102","03","3673813",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ13","□□□□□□□□","リヤクシキモジ13",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ13","2-45-1-13","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ13 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ13 タロウ",,, +"102","03","3673814",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ14","□□□□□□□□","リヤクシキモジ14",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ14","2-45-1-14","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ14 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ14 タロウ",,, +"102","03","3673815",,"A","20121127","20121128",,,,,,"□□□□","セイシキテンポメイモジ15","□□□□","リヤクシキモジ15",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ15","2-45-1-15","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□ 太郎","ダイヒヨウシヤメイモジ15 タロウ",,,,,"□□□□ 太郎","カンリヤクザイシメイモジ15 タロウ",,, +"102","03","3673816",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ16","□□□□□□□","リヤクシキモジ16",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ16","2-45-1-16","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ16 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ16 タロウ",,, +"102","03","3673817",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ17","□□□□□□□","リヤクシキモジ17",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ17","2-45-1-17","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ17 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ17 タロウ",,, +"102","03","3673818",,"A","20121127","20121128",,,,,,"□□□□□□□","セイシキテンポメイモジ18","□□□□□□□","リヤクシキモジ18",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ18","2-45-1-18","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□ 太郎","ダイヒヨウシヤメイモジ18 タロウ",,,,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ18 タロウ",,, +"102","03","3673819",,"A","20121127","20121128",,,,,,"□□□□□□□□□□","セイシキテンポメイモジ19","□□□□□□□□□□","リヤクシキモジ19",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ19","2-45-1-19","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ19 タロウ",,,,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ19 タロウ",,, +"102","03","3673820",,"A","20121127","20121128",,,,,,"□□□□□□□□□□","セイシキテンポメイモジ20","□□□□□□□□□□","リヤクシキモジ20",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ20","2-45-1-20","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ20 タロウ",,,,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ20 タロウ",,, +"102","03","3673821",,"A","20121127","20121128",,,,,,"□□□□□□□□","セイシキテンポメイモジ21","□□□□□□□□","リヤクシキモジ21",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□□□□□□□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ21","2-45-1-21","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□□□□□□□ 太郎","ダイヒヨウシヤメイモジ21 タロウ",,,,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ21 タロウ",,, +"102","03","3673822",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ22","","リヤクシキモジ22",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ22","2-45-1-22","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ22 タロウ",,,,," 太郎","カンリヤクザイシメイモジ22 タロウ",,, +"102","03","3673823",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ23","","リヤクシキモジ23",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ23","2-45-1-23","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ23 タロウ",,,,," 太郎","カンリヤクザイシメイモジ23 タロウ",,, +"102","03","3673824",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ24","","リヤクシキモジ24",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ24","2-45-1-24","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ24 タロウ",,,,," 太郎","カンリヤクザイシメイモジ24 タロウ",,, +"102","03","3673825",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ25","","リヤクシキモジ25",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ25","2-45-1-25","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ25 タロウ",,,,," 太郎","カンリヤクザイシメイモジ25 タロウ",,, +"102","03","3673826",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ26","□","リヤクシキモジ26",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ26","2-45-1-26","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ26 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ26 タロウ",,, +"102","03","3673827",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ27","","リヤクシキモジ27",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ27","2-45-1-27","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ27 タロウ",,,,," 太郎","カンリヤクザイシメイモジ27 タロウ",,, +"102","03","3673828",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ28","","リヤクシキモジ28",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ28","2-45-1-28","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ28 タロウ",,,,," 太郎","カンリヤクザイシメイモジ28 タロウ",,, +"102","03","3673829",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ29","","リヤクシキモジ29",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ29","2-45-1-29","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ29 タロウ",,,,," 太郎","カンリヤクザイシメイモジ29 タロウ",,, +"102","03","3673830",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ30","□","リヤクシキモジ30",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ30","2-45-1-30","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ30 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ30 タロウ",,, +"102","03","3673831",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ31","","リヤクシキモジ31",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ31","2-45-1-31","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ31 タロウ",,,,," 太郎","カンリヤクザイシメイモジ31 タロウ",,, +"102","03","3673832",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ32","","リヤクシキモジ32",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ32","2-45-1-32","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ32 タロウ",,,,," 太郎","カンリヤクザイシメイモジ32 タロウ",,, +"102","03","3673833",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ33","","リヤクシキモジ33",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ33","2-45-1-33","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ33 タロウ",,,,," 太郎","カンリヤクザイシメイモジ33 タロウ",,, +"102","03","3673834",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ34","□□","リヤクシキモジ34",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ34","2-45-1-34","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ34 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ34 タロウ",,, +"102","03","3673835",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ35","","リヤクシキモジ35",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ35","2-45-1-35","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ35 タロウ",,,,," 太郎","カンリヤクザイシメイモジ35 タロウ",,, +"102","03","3673836",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ36","","リヤクシキモジ36",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ36","2-45-1-36","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ36 タロウ",,,,," 太郎","カンリヤクザイシメイモジ36 タロウ",,, +"102","03","3673837",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ37","","リヤクシキモジ37",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ37","2-45-1-37","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ37 タロウ",,,,," 太郎","カンリヤクザイシメイモジ37 タロウ",,, +"102","03","3673838",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ38","□","リヤクシキモジ38",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ38","2-45-1-38","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ38 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ38 タロウ",,, +"102","03","3673839",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ39","","リヤクシキモジ39",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ39","2-45-1-39","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ39 タロウ",,,,," 太郎","カンリヤクザイシメイモジ39 タロウ",,, +"102","03","3673840",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ40","","リヤクシキモジ40",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ40","2-45-1-40","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ40 タロウ",,,,," 太郎","カンリヤクザイシメイモジ40 タロウ",,, +"102","03","3673841",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ41","","リヤクシキモジ41",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ41","2-45-1-41","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ41 タロウ",,,,," 太郎","カンリヤクザイシメイモジ41 タロウ",,, +"102","03","3673842",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ42","","リヤクシキモジ42",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ42","2-45-1-42","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ42 タロウ",,,,," 太郎","カンリヤクザイシメイモジ42 タロウ",,, +"102","03","3673843",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ43","","リヤクシキモジ43",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ43","2-45-1-43","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ43 タロウ",,,,," 太郎","カンリヤクザイシメイモジ43 タロウ",,, +"102","03","3673844",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ44","","リヤクシキモジ44",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ44","2-45-1-44","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ44 タロウ",,,,," 太郎","カンリヤクザイシメイモジ44 タロウ",,, +"102","03","3673845",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ45","","リヤクシキモジ45",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ45","2-45-1-45","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ45 タロウ",,,,," 太郎","カンリヤクザイシメイモジ45 タロウ",,, +"102","03","3673846",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ46","","リヤクシキモジ46",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ46","2-45-1-46","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ46 タロウ",,,,," 太郎","カンリヤクザイシメイモジ46 タロウ",,, +"102","03","3673847",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ47","□","リヤクシキモジ47",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ47","2-45-1-47","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ47 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ47 タロウ",,, +"102","03","3673848",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ48","□","リヤクシキモジ48",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ48","2-45-1-48","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ48 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ48 タロウ",,, +"102","03","3673849",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ49","","リヤクシキモジ49",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ49","2-45-1-49","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ49 タロウ",,,,," 太郎","カンリヤクザイシメイモジ49 タロウ",,, +"102","03","3673850",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ50","□","リヤクシキモジ50",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ50","2-45-1-50","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ50 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ50 タロウ",,, +"102","03","3673851",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ51","","リヤクシキモジ51",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ51","2-45-1-51","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ51 タロウ",,,,," 太郎","カンリヤクザイシメイモジ51 タロウ",,, +"102","03","3673852",,"A","20121127","20121128",,,,,,"□","セイシキテンポメイモジ52","□","リヤクシキモジ52",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ52","2-45-1-52","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□ 太郎","ダイヒヨウシヤメイモジ52 タロウ",,,,,"□ 太郎","カンリヤクザイシメイモジ52 タロウ",,, +"102","03","3673853",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ53","","リヤクシキモジ53",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ53","2-45-1-53","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ53 タロウ",,,,," 太郎","カンリヤクザイシメイモジ53 タロウ",,, +"102","03","3673854",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ54","","リヤクシキモジ54",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ54","2-45-1-54","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ54 タロウ",,,,," 太郎","カンリヤクザイシメイモジ54 タロウ",,, +"102","03","3673855",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ55","","リヤクシキモジ55",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ55","2-45-1-55","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ55 タロウ",,,,," 太郎","カンリヤクザイシメイモジ55 タロウ",,, +"102","03","3673856",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ56","","リヤクシキモジ56",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ56","2-45-1-56","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ56 タロウ",,,,," 太郎","カンリヤクザイシメイモジ56 タロウ",,, +"102","03","3673857",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ57","","リヤクシキモジ57",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ57","2-45-1-57","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ57 タロウ",,,,," 太郎","カンリヤクザイシメイモジ57 タロウ",,, +"102","03","3673858",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ58","","リヤクシキモジ58",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ58","2-45-1-58","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ58 タロウ",,,,," 太郎","カンリヤクザイシメイモジ58 タロウ",,, +"102","03","3673859",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ59","","リヤクシキモジ59",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ59","2-45-1-59","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ59 タロウ",,,,," 太郎","カンリヤクザイシメイモジ59 タロウ",,, +"102","03","3673860",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ60","","リヤクシキモジ60",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ60","2-45-1-60","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ60 タロウ",,,,," 太郎","カンリヤクザイシメイモジ60 タロウ",,, +"102","03","3673861",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ61","","リヤクシキモジ61",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ61","2-45-1-61","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ61 タロウ",,,,," 太郎","カンリヤクザイシメイモジ61 タロウ",,, +"102","03","3673862",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ62","","リヤクシキモジ62",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ62","2-45-1-62","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ62 タロウ",,,,," 太郎","カンリヤクザイシメイモジ62 タロウ",,, +"102","03","3673863",,"A","20121127","20121128",,,,,,"","セイシキテンポメイモジ63","","リヤクシキモジ63",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ63","2-45-1-63","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85"," 太郎","ダイヒヨウシヤメイモジ63 タロウ",,,,," 太郎","カンリヤクザイシメイモジ63 タロウ",,, +"102","03","3673864",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ64","□□","リヤクシキモジ64",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ64","2-45-1-64","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ64 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ64 タロウ",,, +"102","03","3673865",,"A","20121127","20121128",,,,,,"□□","セイシキテンポメイモジ65","□□","リヤクシキモジ65",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 □□","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ65","2-45-1-65","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","□□ 太郎","ダイヒヨウシヤメイモジ65 タロウ",,,,,"□□ 太郎","カンリヤクザイシメイモジ65 タロウ",,, +"102","03","3673866",,"A","20121127","20121128",,,,,,"鯵鰺鴬鶯蛎蠣撹攪竃竈","セイシキテンポメイモジ66","鯵鰺鴬鶯蛎蠣撹攪竃竈","リヤクシキモジ66",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 鯵鰺鴬鶯蛎蠣撹攪竃竈","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ66","2-45-1-66","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","ダイヒヨウシヤメイモジ66 タロウ",,,,,"鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","カンリヤクザイシメイモジ66 タロウ",,, +"102","03","3673867",,"A","20121127","20121128",,,,,,"潅灌諌諫頚頸砿礦蕊蘂","セイシキテンポメイモジ67","潅灌諌諫頚頸砿礦蕊蘂","リヤクシキモジ67",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 潅灌諌諫頚頸砿礦蕊蘂","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ67","2-45-1-67","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","潅灌諌諫頚頸砿礦蕊蘂 太郎","ダイヒヨウシヤメイモジ67 タロウ",,,,,"潅灌諌諫頚頸砿礦蕊蘂 太郎","カンリヤクザイシメイモジ67 タロウ",,, +"102","03","3673868",,"A","20121127","20121128",,,,,,"靭靱賎賤壷壺砺礪梼檮","セイシキテンポメイモジ68","靭靱賎賤壷壺砺礪梼檮","リヤクシキモジ68",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 靭靱賎賤壷壺砺礪梼檮","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ68","2-45-1-68","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","靭靱賎賤壷壺砺礪梼檮 太郎","ダイヒヨウシヤメイモジ68 タロウ",,,,,"靭靱賎賤壷壺砺礪梼檮 太郎","カンリヤクザイシメイモジ68 タロウ",,, +"102","03","3673869",,"A","20121127","20121128",,,,,,"涛濤迩邇蝿蠅桧檜侭儘","セイシキテンポメイモジ69","涛濤迩邇蝿蠅桧檜侭儘","リヤクシキモジ69",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 涛濤迩邇蝿蠅桧檜侭儘","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ69","2-45-1-69","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","涛濤迩邇蝿蠅桧檜侭儘 太郎","ダイヒヨウシヤメイモジ69 タロウ",,,,,"涛濤迩邇蝿蠅桧檜侭儘 太郎","カンリヤクザイシメイモジ69 タロウ",,, +"102","03","3673870",,"A","20121127","20121128",,,,,,"薮藪篭籠","セイシキテンポメイモジ70","薮藪篭籠","リヤクシキモジ70",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 薮藪篭籠","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ70","2-45-1-70","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","薮藪篭籠 太郎","ダイヒヨウシヤメイモジ70 タロウ",,,,,"薮藪篭籠 太郎","カンリヤクザイシメイモジ70 タロウ",,, +"102","03","3673871",,"A","20121127","20121128",,,,,,"尭堯槙槇遥遙瑶瑤凜熙","セイシキテンポメイモジ71","尭堯槙槇遥遙瑶瑤凜熙","リヤクシキモジ71",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 尭堯槙槇遥遙瑶瑤凜熙","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ71","2-45-1-71","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","尭堯槙槇遥遙瑶瑤凜熙 太郎","ダイヒヨウシヤメイモジ71 タロウ",,,,,"尭堯槙槇遥遙瑶瑤凜熙 太郎","カンリヤクザイシメイモジ71 タロウ",,, +"102","03","3673872",,"A","20121127","20121128",,,,,,"ツッー-一医院薬鈴田","セイシキテンポメイモジ72","ツッー-一医院薬鈴田","リヤクシキモジ72",,"13","102","24","2","103-0007","東京都中央区日本橋浜町2-45-1 ツッー-一医院薬鈴田","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ72","2-45-1-72","3","3","5","2","7","7","12","2",,"03-3249-8231","471","85","ツッー-一医院薬鈴田 太郎","ダイヒヨウシヤメイモジ72 タロウ",,,,,"ツッー-一医院薬鈴田 太郎","カンリヤクザイシメイモジ72 タロウ",,, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv index 7c0b01c6..c8e1a6bc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_insert.csv @@ -1,47 +1,119 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"123456783","22","6","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","アイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","亜居宇絵尾亜居宇絵尾亜居宇絵尾","1","9","204201","204001","アイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","3","7","0120-1234-12345","アイウエオアイウエオアイウエオアイウエオアイウエオアイウエオ","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","221-0001","17189192099","17","189","1.23457E+12","29303132","25262728","353","8","12345678901","亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾","アイウエオアイウエオ","12345678901","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673000","85","","セイシキテンポメイ03","リヤクシキ03","正式店舗名03","略式03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","東京都中央区日本橋浜町2-45-1 03","103-0007","13102242","13","102","2-45-1-03","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673001","85","","セイシキテンポメイ03A01A","リヤクシキ03A01A","正式店舗名03A01a","略式03A01a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","東京都中央区日本橋浜町2-45-1 03A01a","103-0007","13102242","13","102","2-45-1-03A01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673002","85","","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673003","85","","セイシキテンポメイ03A01B-02","リヤクシキ03A01B-02","正式店舗名03A01b-02","略式03A01b-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673004","85","","セイシキテンポメイ03A01C","リヤクシキ03A01C","正式店舗名03A01c","略式03A01c","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","東京都中央区日本橋浜町2-45-1 03A01c","103-0007","13102242","13","102","2-45-1-03A01C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673005","85","","セイシキテンポメイ03A01D","リヤクシキ03A01D","正式店舗名03A01d","略式03A01d","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","東京都中央区日本橋浜町2-45-1 03A01d","103-0007","13102242","13","102","2-45-1-03A01D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673012","85","","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673014","85","","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673015","85","","セイシキテンポメイ03B02C-02","リヤクシキ03B02C-02","正式店舗名03B02c-02","略式03B02c-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673016","85","","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673020","85","","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673021","85","","セイシキテンポメイ03B02D-03","リヤクシキ03B02D-03","正式店舗名03B02d-03","略式03B02d-03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673023","85","","セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673024","85","","セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673025","85","","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673031","85","","セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673040","85","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B","代表者名 03B09b","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","ダイヒヨウシヤメイ 03B09C","代表者名 03B09c","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","1","","201210","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673054","89","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673056","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673060","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"33673062","89","","セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673000","85","","セイシキテンポメイ03","リヤクシキ03","正式店舗名03","略式03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03","東京都中央区日本橋浜町2-45-1 03","103-0007","13102242","13","102","2-45-1-03","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673001","85","","セイシキテンポメイ03A01A","リヤクシキ03A01A","正式店舗名03A01a","略式03A01a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01A","東京都中央区日本橋浜町2-45-1 03A01a","103-0007","13102242","13","102","2-45-1-03A01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673002","85","","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673003","85","","セイシキテンポメイ03A01B-02","リヤクシキ03A01B-02","正式店舗名03A01b-02","略式03A01b-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673004","85","","セイシキテンポメイ03A01C","リヤクシキ03A01C","正式店舗名03A01c","略式03A01c","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01C","東京都中央区日本橋浜町2-45-1 03A01c","103-0007","13102242","13","102","2-45-1-03A01C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673005","85","","セイシキテンポメイ03A01D","リヤクシキ03A01D","正式店舗名03A01d","略式03A01d","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01D","東京都中央区日本橋浜町2-45-1 03A01d","103-0007","13102242","13","102","2-45-1-03A01D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","1","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85","","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85","","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673015","85","","セイシキテンポメイ03B02C-02","リヤクシキ03B02C-02","正式店舗名03B02c-02","略式03B02c-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85","","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85","","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673021","85","","セイシキテンポメイ03B02D-03","リヤクシキ03B02D-03","正式店舗名03B02d-03","略式03B02d-03","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","6","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85","","セイシキテンポメイ03B03Aゼンケン","リヤクシキ03B03Aゼンケン","正式店舗名03B03a全件","略式03B03a全件","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85","","セイシキテンポメイ03B03B","リヤクシキ03B03B","正式店舗名03B03b","略式03B03b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85","","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","1","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","1","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673031","85","","セイシキテンポメイ03B05A","リヤクシキ03B05A","正式店舗名03B05a","略式03B05a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05A","東京都中央区日本橋浜町2-45-1 03B05a","103-0007","13102242","13","102","2-45-1-03B05A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B","東京都中央区日本橋浜町2-45-1 03B05b","103-0007","13102242","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","85","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B","代表者名 03B09b","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","ダイヒヨウシヤメイ 03B09C","代表者名 03B09c","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201212","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","1","","201210","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b","カンリヤクザイシメイ 03B12B","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","管理薬剤師名 03B12c","カンリヤクザイシメイ 03B12C","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673054","89","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673056","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673060","89","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","33673056","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673062","89","","セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673063","85",,"セイシキテンポメイ03B13C","リヤクシキ03B13C","正式店舗名03B13c","略式03B13c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13C","東京都中央区日本橋浜町2-45-1 03B13c","103-0007","13102242","13","102","2-45-1-03B13C","77122","3352","471",,,,,"33673062","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673801","85",,"セイシキテンポメイモジ1","リヤクシキモジ1","□","□",,,,,"ダイヒヨウシヤメイモジ1 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ1","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-1","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ1 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673802","85",,"セイシキテンポメイモジ2","リヤクシキモジ2","□","□",,,,,"ダイヒヨウシヤメイモジ2 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ2","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-2","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ2 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673803","85",,"セイシキテンポメイモジ3","リヤクシキモジ3","□","□",,,,,"ダイヒヨウシヤメイモジ3 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ3","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-3","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ3 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673804","85",,"セイシキテンポメイモジ4","リヤクシキモジ4","","",,,,,"ダイヒヨウシヤメイモジ4 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ4","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-4","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ4 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673805","85",,"セイシキテンポメイモジ5","リヤクシキモジ5","","",,,,,"ダイヒヨウシヤメイモジ5 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ5","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-5","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ5 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673806","85",,"セイシキテンポメイモジ6","リヤクシキモジ6","","",,,,,"ダイヒヨウシヤメイモジ6 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ6","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-6","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ6 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673807","85",,"セイシキテンポメイモジ7","リヤクシキモジ7","□□□□□","□□□□□",,,,,"ダイヒヨウシヤメイモジ7 タロウ","□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ7","東京都中央区日本橋浜町2-45-1 □□□□□","103-0007","13102242","13","102","2-45-1-7","77122","3352","471",,,"□□□□□ 太郎","カンリヤクザイシメイモジ7 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673808","85",,"セイシキテンポメイモジ8","リヤクシキモジ8","□□□□□","□□□□□",,,,,"ダイヒヨウシヤメイモジ8 タロウ","□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ8","東京都中央区日本橋浜町2-45-1 □□□□□","103-0007","13102242","13","102","2-45-1-8","77122","3352","471",,,"□□□□□ 太郎","カンリヤクザイシメイモジ8 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673809","85",,"セイシキテンポメイモジ9","リヤクシキモジ9","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ9 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ9","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-9","77122","3352","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ9 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673810","85",,"セイシキテンポメイモジ10","リヤクシキモジ10","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ10 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ10","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-10","77122","3352","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ10 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673811","85",,"セイシキテンポメイモジ11","リヤクシキモジ11","□□□□□□","□□□□□□",,,,,"ダイヒヨウシヤメイモジ11 タロウ","□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ11","東京都中央区日本橋浜町2-45-1 □□□□□□","103-0007","13102242","13","102","2-45-1-11","77122","3352","471",,,"□□□□□□ 太郎","カンリヤクザイシメイモジ11 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673812","85",,"セイシキテンポメイモジ12","リヤクシキモジ12","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ12 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ12","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-12","77122","3352","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ12 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673813","85",,"セイシキテンポメイモジ13","リヤクシキモジ13","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ13 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ13","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-13","77122","3352","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ13 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673814","85",,"セイシキテンポメイモジ14","リヤクシキモジ14","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ14 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ14","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-14","77122","3352","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ14 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673815","85",,"セイシキテンポメイモジ15","リヤクシキモジ15","□□□□","□□□□",,,,,"ダイヒヨウシヤメイモジ15 タロウ","□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ15","東京都中央区日本橋浜町2-45-1 □□□□","103-0007","13102242","13","102","2-45-1-15","77122","3352","471",,,"□□□□ 太郎","カンリヤクザイシメイモジ15 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673816","85",,"セイシキテンポメイモジ16","リヤクシキモジ16","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ16 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ16","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-16","77122","3352","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ16 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673817","85",,"セイシキテンポメイモジ17","リヤクシキモジ17","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ17 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ17","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-17","77122","3352","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ17 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673818","85",,"セイシキテンポメイモジ18","リヤクシキモジ18","□□□□□□□","□□□□□□□",,,,,"ダイヒヨウシヤメイモジ18 タロウ","□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ18","東京都中央区日本橋浜町2-45-1 □□□□□□□","103-0007","13102242","13","102","2-45-1-18","77122","3352","471",,,"□□□□□□□ 太郎","カンリヤクザイシメイモジ18 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673819","85",,"セイシキテンポメイモジ19","リヤクシキモジ19","□□□□□□□□□□","□□□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ19 タロウ","□□□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ19","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","103-0007","13102242","13","102","2-45-1-19","77122","3352","471",,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ19 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673820","85",,"セイシキテンポメイモジ20","リヤクシキモジ20","□□□□□□□□□□","□□□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ20 タロウ","□□□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ20","東京都中央区日本橋浜町2-45-1 □□□□□□□□□□","103-0007","13102242","13","102","2-45-1-20","77122","3352","471",,,"□□□□□□□□□□ 太郎","カンリヤクザイシメイモジ20 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673821","85",,"セイシキテンポメイモジ21","リヤクシキモジ21","□□□□□□□□","□□□□□□□□",,,,,"ダイヒヨウシヤメイモジ21 タロウ","□□□□□□□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ21","東京都中央区日本橋浜町2-45-1 □□□□□□□□","103-0007","13102242","13","102","2-45-1-21","77122","3352","471",,,"□□□□□□□□ 太郎","カンリヤクザイシメイモジ21 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673822","85",,"セイシキテンポメイモジ22","リヤクシキモジ22","","",,,,,"ダイヒヨウシヤメイモジ22 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ22","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-22","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ22 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673823","85",,"セイシキテンポメイモジ23","リヤクシキモジ23","","",,,,,"ダイヒヨウシヤメイモジ23 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ23","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-23","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ23 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673824","85",,"セイシキテンポメイモジ24","リヤクシキモジ24","","",,,,,"ダイヒヨウシヤメイモジ24 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ24","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-24","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ24 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673825","85",,"セイシキテンポメイモジ25","リヤクシキモジ25","","",,,,,"ダイヒヨウシヤメイモジ25 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ25","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-25","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ25 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673826","85",,"セイシキテンポメイモジ26","リヤクシキモジ26","□","□",,,,,"ダイヒヨウシヤメイモジ26 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ26","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-26","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ26 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673827","85",,"セイシキテンポメイモジ27","リヤクシキモジ27","","",,,,,"ダイヒヨウシヤメイモジ27 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ27","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-27","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ27 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673828","85",,"セイシキテンポメイモジ28","リヤクシキモジ28","","",,,,,"ダイヒヨウシヤメイモジ28 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ28","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-28","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ28 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673829","85",,"セイシキテンポメイモジ29","リヤクシキモジ29","","",,,,,"ダイヒヨウシヤメイモジ29 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ29","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-29","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ29 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673830","85",,"セイシキテンポメイモジ30","リヤクシキモジ30","□","□",,,,,"ダイヒヨウシヤメイモジ30 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ30","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-30","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ30 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673831","85",,"セイシキテンポメイモジ31","リヤクシキモジ31","","",,,,,"ダイヒヨウシヤメイモジ31 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ31","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-31","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ31 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673832","85",,"セイシキテンポメイモジ32","リヤクシキモジ32","","",,,,,"ダイヒヨウシヤメイモジ32 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ32","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-32","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ32 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673833","85",,"セイシキテンポメイモジ33","リヤクシキモジ33","","",,,,,"ダイヒヨウシヤメイモジ33 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ33","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-33","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ33 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673834","85",,"セイシキテンポメイモジ34","リヤクシキモジ34","□□","□□",,,,,"ダイヒヨウシヤメイモジ34 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ34","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-34","77122","3352","471",,,"□□ 太郎","カンリヤクザイシメイモジ34 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673835","85",,"セイシキテンポメイモジ35","リヤクシキモジ35","","",,,,,"ダイヒヨウシヤメイモジ35 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ35","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-35","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ35 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673836","85",,"セイシキテンポメイモジ36","リヤクシキモジ36","","",,,,,"ダイヒヨウシヤメイモジ36 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ36","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-36","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ36 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673837","85",,"セイシキテンポメイモジ37","リヤクシキモジ37","","",,,,,"ダイヒヨウシヤメイモジ37 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ37","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-37","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ37 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673838","85",,"セイシキテンポメイモジ38","リヤクシキモジ38","□","□",,,,,"ダイヒヨウシヤメイモジ38 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ38","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-38","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ38 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673839","85",,"セイシキテンポメイモジ39","リヤクシキモジ39","","",,,,,"ダイヒヨウシヤメイモジ39 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ39","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-39","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ39 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673840","85",,"セイシキテンポメイモジ40","リヤクシキモジ40","","",,,,,"ダイヒヨウシヤメイモジ40 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ40","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-40","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ40 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673841","85",,"セイシキテンポメイモジ41","リヤクシキモジ41","","",,,,,"ダイヒヨウシヤメイモジ41 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ41","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-41","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ41 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673842","85",,"セイシキテンポメイモジ42","リヤクシキモジ42","","",,,,,"ダイヒヨウシヤメイモジ42 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ42","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-42","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ42 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673843","85",,"セイシキテンポメイモジ43","リヤクシキモジ43","","",,,,,"ダイヒヨウシヤメイモジ43 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ43","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-43","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ43 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673844","85",,"セイシキテンポメイモジ44","リヤクシキモジ44","","",,,,,"ダイヒヨウシヤメイモジ44 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ44","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-44","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ44 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673845","85",,"セイシキテンポメイモジ45","リヤクシキモジ45","","",,,,,"ダイヒヨウシヤメイモジ45 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ45","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-45","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ45 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673846","85",,"セイシキテンポメイモジ46","リヤクシキモジ46","","",,,,,"ダイヒヨウシヤメイモジ46 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ46","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-46","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ46 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673847","85",,"セイシキテンポメイモジ47","リヤクシキモジ47","□","□",,,,,"ダイヒヨウシヤメイモジ47 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ47","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-47","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ47 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673848","85",,"セイシキテンポメイモジ48","リヤクシキモジ48","□","□",,,,,"ダイヒヨウシヤメイモジ48 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ48","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-48","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ48 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673849","85",,"セイシキテンポメイモジ49","リヤクシキモジ49","","",,,,,"ダイヒヨウシヤメイモジ49 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ49","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-49","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ49 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673850","85",,"セイシキテンポメイモジ50","リヤクシキモジ50","□","□",,,,,"ダイヒヨウシヤメイモジ50 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ50","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-50","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ50 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673851","85",,"セイシキテンポメイモジ51","リヤクシキモジ51","","",,,,,"ダイヒヨウシヤメイモジ51 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ51","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-51","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ51 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673852","85",,"セイシキテンポメイモジ52","リヤクシキモジ52","□","□",,,,,"ダイヒヨウシヤメイモジ52 タロウ","□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ52","東京都中央区日本橋浜町2-45-1 □","103-0007","13102242","13","102","2-45-1-52","77122","3352","471",,,"□ 太郎","カンリヤクザイシメイモジ52 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673853","85",,"セイシキテンポメイモジ53","リヤクシキモジ53","","",,,,,"ダイヒヨウシヤメイモジ53 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ53","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-53","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ53 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673854","85",,"セイシキテンポメイモジ54","リヤクシキモジ54","","",,,,,"ダイヒヨウシヤメイモジ54 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ54","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-54","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ54 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673855","85",,"セイシキテンポメイモジ55","リヤクシキモジ55","","",,,,,"ダイヒヨウシヤメイモジ55 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ55","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-55","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ55 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673856","85",,"セイシキテンポメイモジ56","リヤクシキモジ56","","",,,,,"ダイヒヨウシヤメイモジ56 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ56","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-56","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ56 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673857","85",,"セイシキテンポメイモジ57","リヤクシキモジ57","","",,,,,"ダイヒヨウシヤメイモジ57 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ57","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-57","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ57 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673858","85",,"セイシキテンポメイモジ58","リヤクシキモジ58","","",,,,,"ダイヒヨウシヤメイモジ58 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ58","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-58","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ58 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673859","85",,"セイシキテンポメイモジ59","リヤクシキモジ59","","",,,,,"ダイヒヨウシヤメイモジ59 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ59","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-59","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ59 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673860","85",,"セイシキテンポメイモジ60","リヤクシキモジ60","","",,,,,"ダイヒヨウシヤメイモジ60 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ60","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-60","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ60 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673861","85",,"セイシキテンポメイモジ61","リヤクシキモジ61","","",,,,,"ダイヒヨウシヤメイモジ61 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ61","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-61","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ61 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673862","85",,"セイシキテンポメイモジ62","リヤクシキモジ62","","",,,,,"ダイヒヨウシヤメイモジ62 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ62","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-62","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ62 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673863","85",,"セイシキテンポメイモジ63","リヤクシキモジ63","","",,,,,"ダイヒヨウシヤメイモジ63 タロウ"," 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ63","東京都中央区日本橋浜町2-45-1 ","103-0007","13102242","13","102","2-45-1-63","77122","3352","471",,," 太郎","カンリヤクザイシメイモジ63 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673864","85",,"セイシキテンポメイモジ64","リヤクシキモジ64","□□","□□",,,,,"ダイヒヨウシヤメイモジ64 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ64","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-64","77122","3352","471",,,"□□ 太郎","カンリヤクザイシメイモジ64 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673865","85",,"セイシキテンポメイモジ65","リヤクシキモジ65","□□","□□",,,,,"ダイヒヨウシヤメイモジ65 タロウ","□□ 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ65","東京都中央区日本橋浜町2-45-1 □□","103-0007","13102242","13","102","2-45-1-65","77122","3352","471",,,"□□ 太郎","カンリヤクザイシメイモジ65 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673866","85",,"セイシキテンポメイモジ66","リヤクシキモジ66","鯵鰺鴬鶯蛎蠣撹攪竃竈","鯵鰺鴬鶯蛎蠣撹攪竃竈",,,,,"ダイヒヨウシヤメイモジ66 タロウ","鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ66","東京都中央区日本橋浜町2-45-1 鯵鰺鴬鶯蛎蠣撹攪竃竈","103-0007","13102242","13","102","2-45-1-66","77122","3352","471",,,"鯵鰺鴬鶯蛎蠣撹攪竃竈 太郎","カンリヤクザイシメイモジ66 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673867","85",,"セイシキテンポメイモジ67","リヤクシキモジ67","潅灌諌諫頚頸砿礦蕊蘂","潅灌諌諫頚頸砿礦蕊蘂",,,,,"ダイヒヨウシヤメイモジ67 タロウ","潅灌諌諫頚頸砿礦蕊蘂 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ67","東京都中央区日本橋浜町2-45-1 潅灌諌諫頚頸砿礦蕊蘂","103-0007","13102242","13","102","2-45-1-67","77122","3352","471",,,"潅灌諌諫頚頸砿礦蕊蘂 太郎","カンリヤクザイシメイモジ67 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673868","85",,"セイシキテンポメイモジ68","リヤクシキモジ68","靭靱賎賤壷壺砺礪梼檮","靭靱賎賤壷壺砺礪梼檮",,,,,"ダイヒヨウシヤメイモジ68 タロウ","靭靱賎賤壷壺砺礪梼檮 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ68","東京都中央区日本橋浜町2-45-1 靭靱賎賤壷壺砺礪梼檮","103-0007","13102242","13","102","2-45-1-68","77122","3352","471",,,"靭靱賎賤壷壺砺礪梼檮 太郎","カンリヤクザイシメイモジ68 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673869","85",,"セイシキテンポメイモジ69","リヤクシキモジ69","涛濤迩邇蝿蠅桧檜侭儘","涛濤迩邇蝿蠅桧檜侭儘",,,,,"ダイヒヨウシヤメイモジ69 タロウ","涛濤迩邇蝿蠅桧檜侭儘 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ69","東京都中央区日本橋浜町2-45-1 涛濤迩邇蝿蠅桧檜侭儘","103-0007","13102242","13","102","2-45-1-69","77122","3352","471",,,"涛濤迩邇蝿蠅桧檜侭儘 太郎","カンリヤクザイシメイモジ69 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673870","85",,"セイシキテンポメイモジ70","リヤクシキモジ70","薮藪篭籠","薮藪篭籠",,,,,"ダイヒヨウシヤメイモジ70 タロウ","薮藪篭籠 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ70","東京都中央区日本橋浜町2-45-1 薮藪篭籠","103-0007","13102242","13","102","2-45-1-70","77122","3352","471",,,"薮藪篭籠 太郎","カンリヤクザイシメイモジ70 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673871","85",,"セイシキテンポメイモジ71","リヤクシキモジ71","尭堯槙槇遥遙瑶瑤凜熙","尭堯槙槇遥遙瑶瑤凜熙",,,,,"ダイヒヨウシヤメイモジ71 タロウ","尭堯槙槇遥遙瑶瑤凜熙 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ71","東京都中央区日本橋浜町2-45-1 尭堯槙槇遥遙瑶瑤凜熙","103-0007","13102242","13","102","2-45-1-71","77122","3352","471",,,"尭堯槙槇遥遙瑶瑤凜熙 太郎","カンリヤクザイシメイモジ71 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" +"033673872","85",,"セイシキテンポメイモジ72","リヤクシキモジ72","ツッー-一医院薬鈴田","ツッー-一医院薬鈴田",,,,,"ダイヒヨウシヤメイモジ72 タロウ","ツッー-一医院薬鈴田 太郎",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 モジ72","東京都中央区日本橋浜町2-45-1 ツッー-一医院薬鈴田","103-0007","13102242","13","102","2-45-1-72","77122","3352","471",,,"ツッー-一医院薬鈴田 太郎","カンリヤクザイシメイモジ72 タロウ",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_pharm_mapper","2023/04/12 00:00:00","com_pharm_mapper" From 5e2ce351a26fe5e480bb3e72c95d0a463984a6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 09:45:48 +0900 Subject: [PATCH 177/962] =?UTF-8?q?win=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/testing_utility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/testing_utility.py b/ecs/jskult-batch-daily/tests/testing_utility.py index e95da8e7..5a6c3a42 100644 --- a/ecs/jskult-batch-daily/tests/testing_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_utility.py @@ -1,5 +1,5 @@ -"""テスト用共通処理関数""" import csv +import os import tempfile from datetime import datetime @@ -22,12 +22,13 @@ def create_ultmarc_test_data_from_csv(file_path: str) -> DatFile: """ # 一度、Shift-JISファイルで書き出す - with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932') as tmp_file: + with open(file_path, encoding='utf8') as csv_file, tempfile.NamedTemporaryFile('w', encoding='cp932', delete=False) as tmp_file: tmp_file.write(csv_file.read()) tmp_file.seek(0) tmpfile_path = tmp_file.name - dat_file = DatFile.from_path(tmpfile_path) + dat_file = DatFile.from_path(tmpfile_path) + os.unlink(tmpfile_path) return dat_file From 56bc95c5f7c4b5c84683b579765304e29210e1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 11:29:42 +0900 Subject: [PATCH 178/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_med_func_valuation_mapper.py | 100 +++++++++ .../tables/com_med_func_valuation.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_med_func_valuation/__init__.py | 0 .../com_med_func_valuation_delete.csv | 7 + .../com_med_func_valuation_insert.csv | 7 + .../com_med_func_valuation_update.csv | 6 + ...b_com_med_func_valuation_before_delete.csv | 7 + ...b_com_med_func_valuation_before_update.csv | 7 + .../expect_com_med_func_valuation_delete.csv | 8 + .../expect_com_med_func_valuation_insert.csv | 8 + .../expect_com_med_func_valuation_update.csv | 7 + .../test_com_med_func_valuation_mapper.py | 197 ++++++++++++++++++ 13 files changed, 370 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py new file mode 100644 index 00000000..530a1334 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py @@ -0,0 +1,100 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_func_valuation import ComMedFuncValuation + + +class ComMedFuncValuationMapper(UltmarcTableMapper): + """レイアウト区分024: COM_医療機器評価 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_func_valuation + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_func_valuation + ( + med_func_valuation_cd, + med_func_valuation_name, + regist_ymd, + update_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + + ) + VALUES ( + :med_func_valuation_cd, + :med_func_valuation_name, + :execute_date_str_ymd, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_med_func_valuation + SET + med_func_valuation_name = :med_func_valuation_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_med_func_valuation + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + med_func_valuation_cd = :med_func_valuation_cd + """ + record: ComMedFuncValuation + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedFuncValuation) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # med_func_valuation_nameが空で無い場合はUpdate + if len(self.record.med_func_valuation_name) == 0: + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py new file mode 100644 index 00000000..6ed14c07 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedFuncValuation(UltmarcTable): + """レイアウト区分023: COM_医療機器評価""" + maint_flag: str # 修正区分 + med_func_valuation_cd: str # 医療機器評価コード + med_func_valuation_name: str # 医療機器評価名称(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.med_func_valuation_cd = record[1] + self.med_func_valuation_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index ebea9e55..1f3ec13a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, null_mapper) + com_inst_mapper, com_med_func_valuation_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -64,7 +64,7 @@ COM_TABLE_LIST = { # COM_看護種別 "023": null_mapper.NullMapper, # COM_医療機能評価 - "024": null_mapper.NullMapper, + "024": com_med_func_valuation_mapper.ComMedFuncValuationMapper, # COM_地域クリティカルパス "026": null_mapper.NullMapper, # COM_疾患別リハビリテーション科 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv new file mode 100644 index 00000000..e58811b2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv @@ -0,0 +1,7 @@ +"024","01","A","20141113","20141114","" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","C","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院B" +"024","06","A","20141113","20141114","複合病院A" +"024","07","A","20141113","20141114","長期療養病院" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv new file mode 100644 index 00000000..904b15f6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_insert.csv @@ -0,0 +1,7 @@ +"024","01","A","20141113","20141114","一般病院A" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","A","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院A" +"024","06","A","20141113","20141114","複合病院B" +"024","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv new file mode 100644 index 00000000..6a92676f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_update.csv @@ -0,0 +1,6 @@ +"024","01","A","20141113","20141114","" +"024","02","A","20141113","20141114","一般病院B" +"024","03","A","20141113","20141114","精神病院A" +"024","04","A","20141113","20141114","精神病院B" +"024","05","A","20141113","20141114","複合病院B" +"024","06","A","20141113","20141114","複合病院A" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv new file mode 100644 index 00000000..28ec2538 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_delete.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"03","精神病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"04","精神病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"05","複合病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" +"06","複合病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","clsComMedFuncValuati" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv new file mode 100644 index 00000000..0dec3123 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/db_com_med_func_valuation_before_update.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"03","精神病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"04","精神病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"05","複合病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"06","複合病院B","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv new file mode 100644 index 00000000..1d74c427 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv @@ -0,0 +1,8 @@ +"med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"03","精神病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"04","精神病院B","20171024","20171024","20230424","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2023/04/23 10:22:50","com_med_func_valuation_mapper" +"05","複合病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"06","複合病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" +"07","長期療養病院","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:22:50","com_med_func_valuation_mapper","2017/10/24 10:22:50","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv new file mode 100644 index 00000000..ca00954e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_insert.csv @@ -0,0 +1,8 @@ +"med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","一般病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"02","一般病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"03","精神病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"04","精神病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"05","複合病院A","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"06","複合病院B","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","20230424","20230424","NULL","NULL","NULL","NULL","NULL","2023/04/23 00:00:00","com_med_func_valuation_mapper","2023/04/23 00:00:00","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv new file mode 100644 index 00000000..2d8e985a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv @@ -0,0 +1,7 @@ +"med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"02","一般病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"03","精神病院A","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"04","精神病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"05","複合病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" +"06","複合病院A","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py new file mode 100644 index 00000000..0485eab4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_func_valuation_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedFuncValuationMapper: + """レイアウト区分024: COM_医療機器評価 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療機器評価テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_insert.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医療機器評価テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_func_valuation_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_func_valuation', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_update.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医療機器評価テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_func_valuation_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_func_valuation', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_func_valuation_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_func_valuation', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_func_valuation_mapper.ComMedFuncValuationMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_func_valuation_mapper.ComMedFuncValuationMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_func_valuation_delete.csv')) + primary_keys = [f"'{primary_key['med_func_valuation_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 45e1f7d87b4ad0897db13bad09dc6b7934591eb9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 24 Apr 2023 11:43:54 +0900 Subject: [PATCH 179/962] =?UTF-8?q?fix:=20=E6=B4=97=E3=81=84=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E5=87=A6=E7=90=86=E3=80=81=E6=9C=AC=E7=95=AA=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E5=80=A4=E3=83=9F=E3=82=B9=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index c68ae70a..eaaf44c8 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -211,4 +211,4 @@ config: # セキュリティグループ(ecs-all) SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-jskut-batch-laundering) - SG_JSKULT_BATCH_LAUNDERING: *STG_SG_JSKULT_BATCH_LAUNDERING + SG_JSKULT_BATCH_LAUNDERING: *PRD_SG_JSKULT_BATCH_LAUNDERING From 501b1b6fca609bec146fdf266a257fe57c502199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 12:04:17 +0900 Subject: [PATCH 180/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_com_med_func_valuation_mapper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py index 0485eab4..b21789a6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/test_com_med_func_valuation_mapper.py @@ -28,13 +28,13 @@ class TestComMedFuncValuationMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): @@ -72,14 +72,14 @@ class TestComMedFuncValuationMapper: actual_select_sql = f"SELECT * FROM src05.com_med_func_valuation WHERE med_func_valuation_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): From 120ab82a24bf5c00525b899a1cb515f86a7e4cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 13:03:05 +0900 Subject: [PATCH 181/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py index 8794677f..e7bea2a5 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py @@ -79,7 +79,7 @@ class TestComNurseAssrtMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): From 9476720dc7eea8c26b88de9b8045364c074dfdf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 14:31:27 +0900 Subject: [PATCH 182/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_com_forfront_med_equip_mapper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py index fccc56ad..873d70c6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -72,14 +72,14 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): @@ -126,7 +126,7 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -183,7 +183,7 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 From 5bba2dd9c4a07428ace87d7dae0458ea18041795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 14:39:25 +0900 Subject: [PATCH 183/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_forfront_med_equip/com_forfront_med_equip_delete.csv | 1 + .../table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv | 1 + 2 files changed, 2 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv index 39f5dce7..36459b1c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/com_forfront_med_equip_delete.csv @@ -5,3 +5,4 @@ "022","15","A","20141113","20141114","アンガー型カメラ" "022","16","A","20141113","20141114","SPECT" "022","99","C",,,"亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵尾亜居宇絵あ" +"022","98","C","20141113","20141114","血管造影システム" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv index 9eafda82..a89aed2c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/com_nurse_assrt_delete.csv @@ -5,3 +5,4 @@ "023","4104","A","20141113","20141114","療養型介護療養施設サービス費(Ⅳ)" "023","4999","A","20141113","20141114","療養型介護療養施設サービス費種別不明" "023","4105","A","20141113","20141114","療養型介護療養施設サービス費" +"023","9999","C","20141113","20141114","療養型介護療養施設サービス費(Ⅲ)" From fb999a3a8794ea76d3366ea307254a4c827d0b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 14:46:40 +0900 Subject: [PATCH 184/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv | 1 + .../table_mapper/com_pharm/db_com_pharm_before_delete.csv | 1 + .../table_mapper/com_pharm/expect_com_pharm_delete.csv | 1 + .../table_mapper/com_pharm/test_com_pharm_mapper.py | 6 +++--- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv index e806d922..fddb0e94 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/com_pharm_delete.csv @@ -1,2 +1,3 @@ "102","03","3673010",,"C","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "102","9","9","9","C","200501","200601","7","0","9","10","11","12","13","14","15","6","17","18","19","20","221-000","22","23","24","25","26","27","28","29","30","31","32","3","34","35","2","37","38","9","204001","1","204201","43","44","45","46","47" +"102","99","1234567",,"C","20121128","20121129",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv index 9951f19e..75421028 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/db_com_pharm_before_delete.csv @@ -1,3 +1,4 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" "033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv index 66e0e414..85f84a5c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_delete.csv @@ -1,3 +1,4 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "033673010","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","20121128","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85","6","セイシキテンポメイ03A02A","リヤクシキ03A02A","正式店舗名03A02a","略式03A02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A02A","東京都中央区日本橋浜町2-45-1 03A02a","103-0007","13102242","13","102","2-45-1-03A02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" "999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","200501","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 00:00:00","com_pharm_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py index 1cdd738c..15d046e4 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/test_com_pharm_mapper.py @@ -79,7 +79,7 @@ class TestComPharmMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): @@ -126,7 +126,7 @@ class TestComPharmMapper: actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -183,7 +183,7 @@ class TestComPharmMapper: actual_select_sql = f"SELECT * FROM src05.com_pharm WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 From 0c405204e9c15ba4af5b39f634db9c73c2b413ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 15:06:34 +0900 Subject: [PATCH 185/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_med_func_valuation/com_med_func_valuation_delete.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv index e58811b2..5543c107 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/com_med_func_valuation_delete.csv @@ -5,3 +5,4 @@ "024","05","A","20141113","20141114","複合病院B" "024","06","A","20141113","20141114","複合病院A" "024","07","A","20141113","20141114","長期療養病院" +"024","99","C","20141113","20141114","精神病院B" From 4fc6639eea45b3f482b0cd0ff2e712e3832e876e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Apr 2023 15:55:30 +0900 Subject: [PATCH 186/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/emp_chg_inst_laundering.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index dc596f60..a9d5f1f3 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -117,7 +117,7 @@ def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database): elapsed_time = ElapsedTime() update_sql = """ UPDATE - emp_chg_inst_lau + src05.emp_chg_inst_lau SET inst_cd = :v_inst_cd_merge, lua_ope_dt = SYSDATE() @@ -131,10 +131,10 @@ def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database): logging_sql(logger, update_sql) logger.info(f'Query OK, {update_result.rowcount} rows affected ({elapsed_time.of})') except Exception as e: - logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd_merge} to {v_inst_cd_merge}!") + logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd} to {v_inst_cd_merge}!") raise e logger.debug(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") - return + return def _update_emp_chg_inst_lau_from_inst_merge_t(db: Database): From fdea867047f093daf0540277b856e4d159ff5f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 16:32:01 +0900 Subject: [PATCH 187/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E7=99=BB=E9=8C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_regn_critic_pass_mapper.py | 97 +++++++++ .../tables/com_regn_critic_pass.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_regn_critic_pass/__init__.py | 0 .../com_regn_critic_pass_delete.csv | 4 + .../com_regn_critic_pass_insert.csv | 3 + .../com_regn_critic_pass_update.csv | 3 + .../db_com_regn_critic_pass_before_delete.csv | 3 + .../db_com_regn_critic_pass_before_update.csv | 4 + .../expect_com_regn_critic_pass_delete.csv | 4 + .../expect_com_regn_critic_pass_insert.csv | 4 + .../expect_com_regn_critic_pass_update.csv | 4 + .../test_com_regn_critic_pass_mapper.py | 197 ++++++++++++++++++ 13 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py new file mode 100644 index 00000000..1bfbb38e --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_regn_critic_pass import ComRegnCriticPass + + +class ComRegnCriticPassMapper(UltmarcTableMapper): + """レイアウト区分026: COM_地域クリティカルパス 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_regn_critic_pass + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_regn_critic_pass + ( + regn_co_critic_pass_cd, + disease_name_kanji, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :regn_co_critic_pass_cd, + :disease_name_kanji, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_regn_critic_pass + SET + disease_name_kanji = :disease_name_kanji, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_regn_critic_pass + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + regn_co_critic_pass_cd = :regn_co_critic_pass_cd + """ + record: ComRegnCriticPass + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComRegnCriticPass) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + if len(self.record.disease_name_kanji) == 0: + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py new file mode 100644 index 00000000..ee950adb --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_regn_critic_pass.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComRegnCriticPass(UltmarcTable): + """レイアウト区分026: COM_地域クリティカルパス""" + maint_flag: str # 修正区分 + regn_co_critic_pass_cd: str # 地域クリティカルパスコード + disease_name_kanji: str # 疾患名(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.regn_co_critic_pass_cd = record[1] + self.disease_name_kanji = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 54507832..0b9d973b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,6 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, com_forfront_med_equip_mapper, null_mapper) + com_inst_mapper, com_forfront_med_equip_mapper, com_regn_critic_pass_mapper, null_mapper) from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -66,7 +66,7 @@ COM_TABLE_LIST = { # COM_医療機能評価 "024": null_mapper.NullMapper, # COM_地域クリティカルパス - "026": null_mapper.NullMapper, + "026": com_regn_critic_pass_mapper.ComRegnCriticPassMapper, # COM_疾患別リハビリテーション科 "027": null_mapper.NullMapper, # COM_政策医療 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv new file mode 100644 index 00000000..4c50f5fc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_delete.csv @@ -0,0 +1,4 @@ +"026","01","C","20141113","20141114","" +"026","99","A","20141113","20141114","不明" +"026","02","A","20141113","20141114","骨折" +"026","98","C","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv new file mode 100644 index 00000000..09a4e485 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_insert.csv @@ -0,0 +1,3 @@ +"026","01","A","20141113","20141114","大腿骨頸部骨折" +"026","99","A","20141113","20141114","不明" +"026","55","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv new file mode 100644 index 00000000..7b84a0ff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/com_regn_critic_pass_update.csv @@ -0,0 +1,3 @@ +"026","01","A","20141113","20141114","頸部骨折" +"026","99","A","20141113","20141114","" +"026","55","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv new file mode 100644 index 00000000..bd263ca7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_delete.csv @@ -0,0 +1,3 @@ +"regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","大腿骨頸部骨折","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:17","clsComRegnCriticPass" +"99","不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:51","clsComRegnCriticPass" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv new file mode 100644 index 00000000..e8c2ba1e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/db_com_regn_critic_pass_before_update.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","大腿骨頸部骨折","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","clsComRegnCriticPass" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv new file mode 100644 index 00000000..12548de0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_delete.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","大腿骨頸部骨折","20171019","NULL","20230420","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:17","com_regn_critic_pass_mapper" +"02","骨折","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:18:53","com_regn_critic_pass_mapper","2017/10/19 11:18:53","com_regn_critic_pass_mapper" +"99","不明","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 11:09:17","clsComRegnCriticPass","2017/10/19 11:09:51","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv new file mode 100644 index 00000000..81ce5d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_insert.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","大腿骨頸部骨折","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv new file mode 100644 index 00000000..68d07075 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv @@ -0,0 +1,4 @@ +"regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","頸部骨折","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"55","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" +"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","clsComRegnCriticPass" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py new file mode 100644 index 00000000..a9eda2d6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_regn_critic_pass_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComRegnCriticPassMapper: + """レイアウト区分026: COM_地域連携クリティカルパス""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_insert.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_出身校テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_regn_critic_pass_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_regn_critic_pass', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_update.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_出身校テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_regn_critic_pass_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_regn_critic_pass', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_regn_critic_pass_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_regn_critic_pass', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_regn_critic_pass_mapper.ComRegnCriticPassMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_regn_critic_pass_mapper.ComRegnCriticPassMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_regn_critic_pass_delete.csv')) + primary_keys = [f"'{primary_key['regn_co_critic_pass_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_regn_critic_pass WHERE regn_co_critic_pass_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From e192b88be28c7de993dbe1b76119c819d2914567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 16:35:03 +0900 Subject: [PATCH 188/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_com_forfront_med_equip_mapper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py index fccc56ad..873d70c6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/test_com_forfront_med_equip_mapper.py @@ -72,14 +72,14 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): @@ -126,7 +126,7 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -183,7 +183,7 @@ class TestComForfrontMedEquipMapper: actual_select_sql = f"SELECT * FROM src05.com_forfront_med_equip WHERE forfront_med_equip_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['sys_update_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 From dd32daebcc2cd86dbe3e18376500c297c4191007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 16:39:54 +0900 Subject: [PATCH 189/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E7=B7=A8=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_com_regn_critic_pass_mapper.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py index a9eda2d6..738d7ea4 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/test_com_regn_critic_pass_mapper.py @@ -40,7 +40,7 @@ class TestComRegnCriticPassMapper: def test_insert_record(self): """ Cases: - COM_出身校テーブルにレコードを登録する + COM_地域連携クリティカルパス校テーブルにレコードを登録する Arranges: - CSVデータを用意し、読み込む - 追加対象となるレコードを削除する @@ -85,7 +85,7 @@ class TestComRegnCriticPassMapper: def test_update_record(self): """ Cases: - COM_出身校テーブルのレコードを更新する + COM_地域連携クリティカルパス校テーブルのレコードを更新する Arranges: - CSVデータを用意し、読み込む - 更新対象となるレコードを登録する @@ -142,7 +142,7 @@ class TestComRegnCriticPassMapper: def test_logical_delete(self): """ Cases: - COM_出身校テーブルのレコードを1件論理削除する + COM_地域連携クリティカルパス校テーブルのレコードを1件論理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する From 3ed8363a0f8abc978813447ec4f180d16d27bd50 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 24 Apr 2023 16:44:40 +0900 Subject: [PATCH 190/962] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=B3=E3=83=95?= =?UTF-8?q?=E3=83=AA=E3=82=AF=E3=83=88=E3=82=92=E8=A7=A3=E6=B6=88=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AB=E3=80=81=E3=83=A2=E3=82=B8?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=83=AB=E3=81=94=E3=81=A8=E3=81=AB=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/__init__.py | 8 -- .../ultmarc_table_mapper_factory.py | 89 ++++++++++--------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py index b0f23166..e69de29b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/__init__.py @@ -1,8 +0,0 @@ -import glob -import os - -# 同階層内のモジュールを一括でインポート -__all__ = [ - os.path.split(os.path.splitext(file)[0])[1] - for file in glob.glob(os.path.join(os.path.dirname(__file__), '[a-zA-Z0-9]*.py')) -] \ No newline at end of file diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 1a41bf6b..336a6d4b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -1,7 +1,17 @@ -from src.batch.ultmarc.utmp_tables.table_mapper.concrete import ( - com_alma_mapper, com_dr_wrkplace_mapper, com_hamtec_mapper, - com_inst_mapper, com_forfront_med_equip_mapper, com_nurse_assrt_mapper, null_mapper) - +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_mapper import \ + ComAlmaMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_wrkplace_mapper import \ + ComDrWrkplaceMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_forfront_med_equip_mapper import \ + ComForfrontMedEquipMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hamtec_mapper import \ + ComHamtecMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_mapper import \ + ComInstMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper import \ + ComNurseAssrtMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ + NullMapper from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.db.database import Database @@ -10,76 +20,75 @@ from src.db.database import Database COM_TABLE_LIST = { # レコードID固定 # COM_医師学会 - # TODO: 入れ子にしない - "521": null_mapper.NullMapper, + "521": NullMapper, # COM_施設属性 - "111": null_mapper.NullMapper, + "111": NullMapper, # COM_臨床研修病院 - "112": null_mapper.NullMapper, + "112": NullMapper, # COM_医師 - "501": null_mapper.NullMapper, + "501": NullMapper, # COM_施設 - "101": com_inst_mapper.ComInstMapper, + "101": ComInstMapper, # COM_薬局 - "102": null_mapper.NullMapper, + "102": NullMapper, # COM_医師勤務先 - "502": com_dr_wrkplace_mapper.ComDrWrkplaceMapper, + "502": ComDrWrkplaceMapper, # COM_専門分野 - "511": null_mapper.NullMapper, + "511": NullMapper, # COM_都道府県医療機能情報(基本) - "132": null_mapper.NullMapper, + "132": NullMapper, # COM_都道府県医療機能情報(施設設備) - "133": null_mapper.NullMapper, + "133": NullMapper, # COM_都道府県医療機能情報(疾患治療) - "134": null_mapper.NullMapper, + "134": NullMapper, # COM_都道府県医療機能情報(短期滞在手術) - "135": null_mapper.NullMapper, + "135": NullMapper, # COM_都道府県医療機能情報(専門外来) - "136": null_mapper.NullMapper, + "136": NullMapper, # COM_診療科目 - "001": null_mapper.NullMapper, + "001": NullMapper, # COM_病院種別 - "002": null_mapper.NullMapper, + "002": NullMapper, # COM_出身校学部識別 - "003": null_mapper.NullMapper, + "003": NullMapper, # COM_出身校 - "004": com_alma_mapper.ComAlmaMapper, + "004": ComAlmaMapper, # COM_役職 - "005": null_mapper.NullMapper, + "005": NullMapper, # 都道府県マスタ - "006": null_mapper.NullMapper, + "006": NullMapper, # COM_経営体 - "007": null_mapper.NullMapper, + "007": NullMapper, # COM_所属部科 - "008": null_mapper.NullMapper, + "008": NullMapper, # COM_学会 - "009": null_mapper.NullMapper, + "009": NullMapper, # COM_専門医資格 - "010": null_mapper.NullMapper, + "010": NullMapper, # COM_施設区分 - "011": null_mapper.NullMapper, + "011": NullMapper, # COM_高度先進医療 - "021": com_hamtec_mapper.ComHamtecMapper, + "021": ComHamtecMapper, # COM_先端医療機器 - "022": com_forfront_med_equip_mapper.ComForfrontMedEquipMapper, + "022": ComForfrontMedEquipMapper, # COM_看護種別 - "023": com_nurse_assrt_mapper.ComNurseAssrtMapper, + "023": ComNurseAssrtMapper, # COM_医療機能評価 - "024": null_mapper.NullMapper, + "024": NullMapper, # COM_地域クリティカルパス - "026": null_mapper.NullMapper, + "026": NullMapper, # COM_疾患別リハビリテーション科 - "027": null_mapper.NullMapper, + "027": NullMapper, # COM_政策医療 - "028": null_mapper.NullMapper, + "028": NullMapper, # COM_医療圏都道府県 - "121": null_mapper.NullMapper, + "121": NullMapper, # COM_医療圏3次マスタ - "122": null_mapper.NullMapper, + "122": NullMapper, # COM_二次医療圏 - "123": null_mapper.NullMapper, + "123": NullMapper, # COM_医療圏都道府県市町村対照表 - "124": null_mapper.NullMapper + "124": NullMapper } From de81612a8bd24e8607851a1f72d3702b92520183 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 24 Apr 2023 16:53:50 +0900 Subject: [PATCH 191/962] =?UTF-8?q?feat:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E5=B7=AE=E5=88=86=E3=82=92=E3=82=82=E3=81=A8?= =?UTF-8?q?=E3=81=AB=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e9ded3b7..5639f7fc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,15 +8,11 @@ "name": "Python: データ取り込みローカル実行", "type": "python", "request": "launch", - "program": "entrypoint.py", + // windowsだと\区切りかも + "program": "ecs\\dataimport\\dataimport\\controller.py", "console": "integratedTerminal", "justMyCode": true, "envFile": "${workspaceFolder}/.env" - }, - { "name": "Python: Current File", - "type": "python", - "request": "test", - "console": "integratedTerminal" } ] } \ No newline at end of file From ef559f7f5b68d92e1361265a47af3ab211ecdbc1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 24 Apr 2023 16:54:43 +0900 Subject: [PATCH 192/962] =?UTF-8?q?feat:=20=E6=88=BB=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5639f7fc..753ba49f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -13,6 +13,13 @@ "console": "integratedTerminal", "justMyCode": true, "envFile": "${workspaceFolder}/.env" + }, + { + "name": "Python: Attach using Process Id", + "type": "python", + "request": "attach", + "processId": "${command:pickProcess}", + "justMyCode": true } ] } \ No newline at end of file From d34b3bee7581901bb9eb00a3c99c433c77f97a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Apr 2023 17:02:39 +0900 Subject: [PATCH 193/962] =?UTF-8?q?feat:=20V=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=EF=BC=88=E6=B4=97=E6=9B=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86=E4=B8=80=E6=99=82=E3=83=86=E3=83=BC=E3=83=96?= =?UTF-8?q?=E3=83=AB=EF=BC=89=E3=81=8B=E3=82=89=E3=81=AE=E6=B4=97=E6=9B=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86(=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF)?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laundering/emp_chg_inst_laundering.py | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py index a9d5f1f3..f78ece9b 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/emp_chg_inst_laundering.py @@ -101,39 +101,29 @@ def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database): logger.info('v_inst_merge_t Table Data is exists!') # v_inst_merge_t から、emp_chg_inst_lauをUpdateします - result = db.execute_select( + logger.debug("##########################") + logger.debug("#### UPDATE DATA #########") + logger.debug("##########################") + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.emp_chg_inst_lau el, internal05.v_inst_merge_t vimt + SET + el.inst_cd = vimt.v_inst_cd_merge, + el.lua_ope_dt = SYSDATE() + WHERE + el.inst_cd = vimt.v_inst_cd """ - SELECT - v_inst_cd, - v_inst_cd_merge - FROM - internal05.v_inst_merge_t - """ - ) - for row in result: - v_inst_cd = row['v_inst_cd'] - v_inst_cd_merge = row['v_inst_cd_merge'] - try: - elapsed_time = ElapsedTime() - update_sql = """ - UPDATE - src05.emp_chg_inst_lau - SET - inst_cd = :v_inst_cd_merge, - lua_ope_dt = SYSDATE() - WHERE - inst_cd = :v_inst_cd; - """ - update_result = db.execute( - update_sql, - {'v_inst_cd': v_inst_cd, 'v_inst_cd_merge': v_inst_cd_merge} - ) - logging_sql(logger, update_sql) - logger.info(f'Query OK, {update_result.rowcount} rows affected ({elapsed_time.of})') - except Exception as e: - logger.debug(f"emp_chg_inst_lau v_inst_cd could not set from {v_inst_cd} to {v_inst_cd_merge}!") - raise e - logger.debug(f"Success! emp_chg_inst_lau v_inst_cd was set from {v_inst_cd} to {v_inst_cd_merge}!") + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug("emp_chg_inst_lau.v_inst_cd could not set!") + raise e + + logger.debug("emp_chg_inst_lau.v_inst_cd was set!") + return From 42e6ac73d00e61d519bd743ac18e924b40b82e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Apr 2023 18:20:08 +0900 Subject: [PATCH 194/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_rehabili_mapper.py | 96 +++++++++ .../utmp_tables/tables/com_rehabili.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_rehabili/__init__.py | 0 .../com_rehabili/com_rehabili_delete.csv | 7 + .../com_rehabili/com_rehabili_insert.csv | 6 + .../com_rehabili/com_rehabili_update.csv | 5 + .../db_com_rehabili_before_delete.csv | 6 + .../db_com_rehabili_before_update.csv | 6 + .../expect_com_rehabili_delete.csv | 7 + .../expect_com_rehabili_insert.csv | 7 + .../expect_com_rehabili_update.csv | 6 + .../com_rehabili/test_com_rehabili_mapper.py | 197 ++++++++++++++++++ 13 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py new file mode 100644 index 00000000..1ff87694 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_rehabili import ComRehabili + + +class ComRehabiliMapper(UltmarcTableMapper): + """レイアウト区分027: COM_疾患別リハビリテーション科 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_rehabili + WHERE + rehabili_cd = :rehabili_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_rehabili + ( + rehabili_cd, + rehabili_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :rehabili_cd, + :rehabili_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_rehabili + SET + rehabili_name = :rehabili_name, + update_ymd = :execute_date_str_ymd, + delete_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + rehabili_cd = :rehabili_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_rehabili + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + rehabili_cd = :rehabili_cd + """ + record: ComRehabili + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComRehabili) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + if self.record.rehabili_name == '': + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py new file mode 100644 index 00000000..f1e13bb2 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_rehabili.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComRehabili(UltmarcTable): + """レイアウト区分027: COM_疾患別リハビリテーション科""" + maint_flag: str # 修正区分 + rehabili_cd: str # 疾患別リハビリコード + rehabili_name: str # リハビリテーション名称(漢字) + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.rehabili_cd = record[1] + self.rehabili_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 1c9f8a81..5146aa90 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -12,6 +12,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper ComNurseAssrtMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_pharm_mapper import \ ComPharmMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_rehabili_mapper import \ + ComRehabiliMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ @@ -80,7 +82,7 @@ COM_TABLE_LIST = { # COM_地域クリティカルパス "026": NullMapper, # COM_疾患別リハビリテーション科 - "027": NullMapper, + "027": ComRehabiliMapper, # COM_政策医療 "028": NullMapper, # COM_医療圏都道府県 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv new file mode 100644 index 00000000..85d5cb95 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_delete.csv @@ -0,0 +1,7 @@ +"027","01","A","20141113","20141114","" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","C","20141113","20141114","廃用症候群リハビリテーション" +"027","05","A","20141113","20141114","心大血管疾患リハビリテーション" +"027","06","A","20141113","20141114","糖尿病リハビリテーション" +"027","99","C","20141113","20141114","糖尿病リハビリテーション" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv new file mode 100644 index 00000000..a3d3096b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_insert.csv @@ -0,0 +1,6 @@ +"027","01","A","20141113","20141114","脳血管疾患等リハビリテーション" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","A","20141113","20141114","心大血管疾患リハビリテーション" +"027","05","A","20141113","20141114","廃用症候群リハビリテーション" +"027","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv new file mode 100644 index 00000000..a9450b84 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/com_rehabili_update.csv @@ -0,0 +1,5 @@ +"027","01","A","20141113","20141114","" +"027","02","A","20141113","20141114","運動器リハビリテーション" +"027","03","A","20141113","20141114","呼吸器リハビリテーション" +"027","04","A","20141113","20141114","廃用症候群リハビリテーション" +"027","05","A","20141113","20141114","心大血管疾患リハビリテーション" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv new file mode 100644 index 00000000..50610683 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_delete.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"03","呼吸器リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"04","廃用症候群リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" +"05","心大血管疾患リハビリテーション","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:51:32","clsComRehabili" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv new file mode 100644 index 00000000..5990cb40 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/db_com_rehabili_before_update.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"03","呼吸器リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"04","心大血管疾患リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"05","廃用症候群リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv new file mode 100644 index 00000000..fa1a79eb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv @@ -0,0 +1,7 @@ +"rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"04","廃用症候群リハビリテーション","20171019","20171019","20230423","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"05","心大血管疾患リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" +"06","糖尿病リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:01:11","com_rehabili_mapper","2022/10/19 15:01:11","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv new file mode 100644 index 00000000..1e292c75 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_insert.csv @@ -0,0 +1,7 @@ +"rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","脳血管疾患等リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"02","運動器リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"04","心大血管疾患リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"05","廃用症候群リハビリテーション","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20230423","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 14:44:23","com_rehabili_mapper","2022/10/19 14:44:23","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv new file mode 100644 index 00000000..f39d0ed8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv @@ -0,0 +1,6 @@ +"rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"04","廃用症候群リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" +"05","心大血管疾患リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py new file mode 100644 index 00000000..29d44f4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/test_com_rehabili_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_rehabili_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComRehabiliMapper: + """レイアウト区分027: COM_疾患別リハビリテーション科""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_疾患別リハビリテーション科テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_insert.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_疾患別リハビリテーション科テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_rehabili_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_rehabili', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_update.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_疾患別リハビリテーション科テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_rehabili_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_rehabili', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_rehabili_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_rehabili', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_rehabili_mapper.ComRehabiliMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_rehabili_mapper.ComRehabiliMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_rehabili_delete.csv')) + primary_keys = [f"'{primary_key['rehabili_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_rehabili WHERE rehabili_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From e33bbc88065e3cee0fbde3e90a24114b549c90ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 09:33:27 +0900 Subject: [PATCH 195/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_policy_med_mapper.py | 97 +++++++++ .../utmp_tables/tables/com_policy_med.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_policy_med/__init__.py | 0 .../com_policy_med/com_policy_med_delete.csv | 8 + .../com_policy_med/com_policy_med_insert.csv | 7 + .../com_policy_med/com_policy_med_update.csv | 7 + .../db_com_policy_med_before_delete.csv | 7 + .../db_com_policy_med_before_update.csv | 8 + .../expect_com_policy_med_delete.csv | 8 + .../expect_com_policy_med_insert.csv | 8 + .../expect_com_policy_med_update.csv | 8 + .../test_com_policy_med_mapper.py | 197 ++++++++++++++++++ 13 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py new file mode 100644 index 00000000..17b1d937 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper + +from src.batch.ultmarc.utmp_tables.tables.com_policy_med import ComPolicyMed + + +class ComPolicyMedMapper(UltmarcTableMapper): + """レイアウト区分028: COM_政策医療 登録処理 """ + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_policy_med + WHERE + policy_med_cd = :policy_med_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_policy_med + ( + policy_med_cd, + field_name, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :policy_med_cd, + :field_name, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE src05.com_policy_med + SET + field_name = :field_name, + update_ymd = :execute_date_str_ymd, + delete_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + policy_med_cd = :policy_med_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + # 削除年月日 ← システム日付 + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_policy_med + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + policy_med_cd = :policy_med_cd + """ + record: ComPolicyMed + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPolicyMed) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 更新の場合 + if self.record.field_name != '': + self.queries.append(self.UPDATE_QUERY) + return + else: + self.queries.append(None) + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py new file mode 100644 index 00000000..ee726ae6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_policy_med.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPolicyMed(UltmarcTable): + """レイアウト区分028: COM_政策医療""" + policy_med_cd: str # 政策医療コード + field_name: str # 分野名称(漢字) + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.policy_med_cd = record[1] + self.field_name = record[5] + self.maint_flag = record[2] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 1c9f8a81..4b5a4aeb 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -12,6 +12,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper ComNurseAssrtMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_pharm_mapper import \ ComPharmMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_policy_med_mapper import \ + ComPolicyMedMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ @@ -82,7 +84,7 @@ COM_TABLE_LIST = { # COM_疾患別リハビリテーション科 "027": NullMapper, # COM_政策医療 - "028": NullMapper, + "028": ComPolicyMedMapper, # COM_医療圏都道府県 "121": NullMapper, # COM_医療圏3次マスタ diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv new file mode 100644 index 00000000..ca4cadce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_delete.csv @@ -0,0 +1,8 @@ +"028","01","A","20141113","20141114","" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","C","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","成育" +"028","06","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","07","A","20141113","20141114","心臓病" +"028","99","C","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv new file mode 100644 index 00000000..dc5032cd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_insert.csv @@ -0,0 +1,7 @@ +"028","01","A","20141113","20141114","がん" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","A","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","成育" +"028","06","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv new file mode 100644 index 00000000..700df5d8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/com_policy_med_update.csv @@ -0,0 +1,7 @@ +"028","01","A","20141113","20141114","" +"028","02","A","20141113","20141114","循環器病" +"028","03","A","20141113","20141114","精神疾患" +"028","04","A","20141113","20141114","神経・筋疾患(筋ジスを含む)" +"028","05","A","20141113","20141114","呼吸器疾患(結核を含む)" +"028","06","A","20141113","20141114","成育" +"028","99","A","20141113","20141114","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv new file mode 100644 index 00000000..6b9e4adf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_delete.csv @@ -0,0 +1,7 @@ +"policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"03","精神疾患","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"04","神経・筋疾患(筋ジスを含む)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"05","呼吸器疾患(結核を含む)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" +"06","成育","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:12:57","clsComPolicyMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv new file mode 100644 index 00000000..8595b154 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/db_com_policy_med_before_update.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"03","精神疾患","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"04","神経・筋疾患(筋ジスを含む)","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"05","成育","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"06","呼吸器疾患(結核を含む)","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" +"99","あああ","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/19 15:06:43","clsComPolicyMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv new file mode 100644 index 00000000..33d4b95f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20171019","20171019","20230425","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"05","成育","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"06","呼吸器疾患(結核を含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" +"07","心臓病","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:21:20","com_policy_med_mapper","2022/10/20 17:36:27","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv new file mode 100644 index 00000000..84587999 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_insert.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","がん","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"02","循環器病","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"03","精神疾患","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"05","成育","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"06","呼吸器疾患(結核を含む)","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2022/10/19 15:06:43","com_policy_med_mapper","2022/10/19 15:06:43","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv new file mode 100644 index 00000000..284e516f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv @@ -0,0 +1,8 @@ +"policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"04","神経・筋疾患(筋ジスを含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"05","呼吸器疾患(結核を含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"06","成育","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかき","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py new file mode 100644 index 00000000..e0729d17 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/test_com_policy_med_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_policy_med_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPolicyMedpMapper: + """ レイアウト区分028: COM_政策医療 """ + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """ テスト実行前後処理 """ + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_政策医療テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_insert.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_政策医療テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_policy_med_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_policy_med', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_update.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_政策医療テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_policy_med_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_policy_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_policy_med_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_policy_med', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_policy_med_mapper.ComPolicyMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_policy_med_mapper.ComPolicyMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_policy_med_delete.csv')) + primary_keys = [f"'{primary_key['policy_med_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_policy_med WHERE policy_med_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From f11ee59248c73ea41f189b51072c3b753e8eaa2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 25 Apr 2023 09:50:28 +0900 Subject: [PATCH 196/962] =?UTF-8?q?feat:=20=E3=82=A4=E3=83=B3=E3=83=87?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=8C=E3=81=9A=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rds_mysql/stored_procedure/src05/v_inst_merge_t_create.sql | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 fb609b8c..6a6f9dd7 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 @@ -40,7 +40,8 @@ BEGIN fcl_name, fcl_kn_name, fmt_addr, - prft_cd + prft_cd, + fcl_type ) SELECT vhmv.v_inst_cd, @@ -48,7 +49,8 @@ BEGIN fmv.fcl_name, fmv.fcl_kn_name, fmv.fmt_addr, - fmv.prft_cd + fmv.prft_cd, + fmv.fcl_type FROM src05.vop_hco_merge_v vhmv, src05.fcl_mst_v fmv @@ -66,7 +68,6 @@ BEGIN 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.fcl_type IN ('A1','A0')) OR fmv.fcl_type BETWEEN '20' AND '29') AND fmv.rec_sts_kbn != '9'; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, From f0f2da94e2cfd3b9eca026e4422c09868e83bcba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 16:19:12 +0900 Subject: [PATCH 197/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/ultmarc_process.py | 2 +- .../concrete/com_sp_field_mapper.py | 146 +++++++++++ .../utmp_tables/tables/com_sp_field.py | 42 +++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_sp_field/__init__.py | 0 .../com_sp_field/com_sp_field_delete.csv | 3 + .../com_sp_field/com_sp_field_insert.csv | 7 + .../com_sp_field/com_sp_field_update.csv | 5 + .../db_com_sp_field_before_delete.csv | 7 + .../db_com_sp_field_before_update.csv | 7 + .../expect_com_sp_field_delete.csv | 5 + .../expect_com_sp_field_insert.csv | 8 + .../expect_com_sp_field_update.csv | 6 + .../com_sp_field/test_com_sp_field_mapper.py | 248 ++++++++++++++++++ 14 files changed, 488 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 4ed7ae03..5f234bf7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -91,7 +91,7 @@ def _import_to_ultmarc_table(dat_file: DatFile): mapper_class.execute_queries() dat_file.count_up_success() except Exception as e: - logger.warning(e) + logger.info(e) record = line.records log_message = ','.join([f'"{r}"' for r in record]) logger.info(f'ERROR_LINE: {log_message}') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py new file mode 100644 index 00000000..52307891 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -0,0 +1,146 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_sp_field import ComSpField + + +class ComSpFieldMapper(UltmarcTableMapper): + """レイアウト区分511: COM_専門分野 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialst_cd = :specialst_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_sp_field + ( + dcf_pcf_dr_cd, + specialst_cd, + specialst_maint_div, + specialst_flg, + specialst_publsh_ymd, + ackn_med_flg, + ackn_med_publsh_ymd, + guide_med_flg, + guide_med_publsh_ymd, + regist_ymd, + delete_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcf_pcf_dr_cd, + :specialst_cd, + :specialst_maint_div, + :specialst_flg, + :specialst_publsh_ymd, + :ackn_med_flg, + :ackn_med_publsh_ymd, + :guide_med_flg, + :guide_med_publsh_ymd, + :execute_date_str_ymd, + NULL, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_sp_field + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialst_cd = :specialst_cd + """ + + # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL + LOGICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + and + specialst_cd = :specialst_cd + """ + record: ComSpField + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSpField) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL + if self.record.maint_flag == 'C' or (self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1'): + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + set_clauses = [] # 設定項目 + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + if len(self.record.specialst_maint_div) > 0: + set_clauses.append('specialst_maint_div = :specialst_maint_div') + + if len(self.record.specialst_flg) > 0: + set_clauses.append('specialst_flg = :specialst_flg') + set_clauses.append('specialst_publsh_ymd = :specialst_publsh_ymd') + if self.record.specialst_flg == '@': + self.query_parameter['specialst_flg'] = '' + self.query_parameter['specialst_publsh_ymd'] = '' + + if len(self.record.ackn_med_flg) > 0: + set_clauses.append('ackn_med_flg = :ackn_med_flg') + set_clauses.append('ackn_med_publsh_ymd = :ackn_med_publsh_ymd') + if self.record.ackn_med_flg == '@': + self.query_parameter['ackn_med_flg'] = '' + self.query_parameter['ackn_med_publsh_ymd'] = '' + + if len(self.record.guide_med_flg) > 0: + set_clauses.append('guide_med_flg = :guide_med_flg') + set_clauses.append('guide_med_publsh_ymd = :guide_med_publsh_ymd') + if self.record.guide_med_flg == '@': + self.query_parameter['guide_med_flg'] = '' + self.query_parameter['guide_med_publsh_ymd'] = '' + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py new file mode 100644 index 00000000..cc761c54 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py @@ -0,0 +1,42 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSpField(UltmarcTable): + """レイアウト区分511: COM_専門分野""" + dcf_pcf_dr_cd: str # DCFPCF医師コード + dcf_dr_id: str # レコードID + dcf_dr_code: str # 個人コード + dcf_dr_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + specialst_cd: str # 専門医コード + specialst_maint_div: str # 予備/専門医メンテ区分 + specialst_flg: str # 専門医フラグ + specialst_publsh_ymd: str # 専門医掲載年月日 + ackn_med_flg: str # 認定医フラグ + ackn_med_publsh_ymd: str # 認定医掲載年月日 + guide_med_flg: str # 指導医フラグ + guide_med_publsh_ymd: str # 指導医掲載年月日 + +# メンテナンス年月日 と 予備/転送年月日 は未使用 + + def __init__(self, record: list[str]): + super().__init__(record) + + self.dcf_dr_id = record[1].strip() + self.dcf_dr_code = record[2].strip() + self.dcf_dr_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.specialst_cd = record[5].strip() + self.specialst_maint_div = record[6].strip() + + self.specialst_flg = record[9].strip() + self.specialst_publsh_ymd = record[10].strip() + + self.ackn_med_flg = record[11].strip() + self.ackn_med_publsh_ymd = record[12].strip() + + self.guide_med_flg = record[13].strip() + self.guide_med_publsh_ymd = record[14].strip() + + # DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備)) + self.dcf_pcf_dr_cd = ''.join([self.dcf_dr_id, self.dcf_dr_code, self.dcf_dr_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 1c9f8a81..26ae3bbe 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -12,6 +12,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper ComNurseAssrtMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_pharm_mapper import \ ComPharmMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sp_field_mapper import \ + ComSpFieldMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ @@ -36,7 +38,7 @@ COM_TABLE_LIST = { # COM_医師勤務先 "502": ComDrWrkplaceMapper, # COM_専門分野 - "511": NullMapper, + "511": ComSpFieldMapper, # COM_都道府県医療機能情報(基本) "132": NullMapper, # COM_都道府県医療機能情報(施設設備) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv new file mode 100644 index 00000000..c6d1489b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv @@ -0,0 +1,3 @@ +"511","01","994301","00","B","0003","1","20161113","20161114","1","20170401","@","","","" +"511","01","995783","00","C","0003","2","20161113","20161114","1","20170221","1","20140810","","" +"511","01","997906","00","B","0032","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv new file mode 100644 index 00000000..b6e91047 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_insert.csv @@ -0,0 +1,7 @@ +"511","01","994301","00","A","0003","2","20141113","20141114","","","1","20140401","","" +"511","01","995783","00","A","0003","2","20141113","20141114","","","1","20140401","","" +"511","01","997682","00","A","0004","2","20141113","20141114","1","20131112","","","","" +"511","01","997906","00","A","0032","2","20141113","20141114","1","20130821","","","1","20130821" +"511","01","999613","00","A","0056","2","20141113","20141114","1","20140706","","","1","20140706" +"511","91","999999","99","B","9999","2","","","1","20220628","1","20230425","1","20230425" +"511","99","999999","99","A","9999","2","","","1","20220628","1","20230425","1","20230425" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv new file mode 100644 index 00000000..b7585d8d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_update.csv @@ -0,0 +1,5 @@ +"511","01","994301","00","B","0003","2","20161113","20161114","1","20170401","@","","","" +"511","01","995783","00","B","0003","2","20161113","20161114","1","20170221","1","20140810","","" +"511","01","997906","00","B","0032","2","20170330","20170401","@","","","","@","" +"511","01","999613","00","B","0056","2","20161113","20161114","1","20180706","1","20170101","1","20180706" +"511","01","999613","00","B","9999","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv new file mode 100644 index 00000000..e88fa5e0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199430100","0003","2","1","20170401","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv new file mode 100644 index 00000000..9167aa40 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199430100","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199578300","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","1","20130821","","","1","20130821","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199961300","0056","2","1","20140706","","","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv new file mode 100644 index 00000000..98e54371 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv @@ -0,0 +1,5 @@ +"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv new file mode 100644 index 00000000..f8720d26 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv @@ -0,0 +1,8 @@ +"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199430100","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199578300","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199768200","0004","2","1","20131112","","","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199790600","0032","2","1","20130821","","","1","20130821","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"0199961300","0056","2","1","20140706","","","1","20140706","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"9199999999","9999","2","1","20220628","1","20230425","1","20230425","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" +"9999999999","9999","2","1","20220628","1","20230425","1","20230425","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv new file mode 100644 index 00000000..73bf0e1b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv @@ -0,0 +1,6 @@ +"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199430100","0003","2","1","20170401","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" +"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py new file mode 100644 index 00000000..986ee7e7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py @@ -0,0 +1,248 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_sp_field_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSpFieldMapper: + """レイアウト区分511: COM_専門分野""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_専門分野テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_insert.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialst_cd = :specialst_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] + # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE alma_cd IN ({','.join(primary_keys)})" + # actual_data_list = self.db.execute_select(actual_select_sql) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_専門分野テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sp_field_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sp_field', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_update.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialst_cd = :specialst_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_update.csv')) + # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] + # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys[0])}) AND specialst_cd IN ({','.join(primary_keys[1])})" + # actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_専門分野テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sp_field_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sp_field', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sp_field_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sp_field', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sp_field_mapper.ComSpFieldMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sp_field_mapper.ComSpFieldMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_delete.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_sp_field + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + AND specialst_cd = :specialst_cd\ + """ + for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_delete.csv')) + # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] + # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE alma_cd IN ({','.join(primary_keys)})" + # actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 8f601405d762196701cc8f52f3069f2fe5cdd132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 16:45:05 +0900 Subject: [PATCH 198/962] =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_sp_field_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 52307891..8e2df6e1 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -71,7 +71,7 @@ class ComSpFieldMapper(UltmarcTableMapper): """ # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL - LOGICAL_DELETE_QUERY = """\ + PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_sp_field WHERE From 4e652db5c8ea6e678edfdb71721683d372ce5c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 16:49:34 +0900 Subject: [PATCH 199/962] =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_sp_field_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 8e2df6e1..5031a7b5 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -92,7 +92,7 @@ class ComSpFieldMapper(UltmarcTableMapper): def make_query(self): # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL if self.record.maint_flag == 'C' or (self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1'): - self.queries.append(self.LOGICAL_DELETE_QUERY) + self.queries.append(self.PHYSICAL_DELETE_QUERY) return # 追加、更新の場合 From 28fa04b9cbd761bc313531924167191b7b555ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 16:52:27 +0900 Subject: [PATCH 200/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_sp_field_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 5031a7b5..38ea954a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -70,7 +70,7 @@ class ComSpFieldMapper(UltmarcTableMapper): specialst_cd = :specialst_cd """ - # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL + # 『修正区分がC(削除)』、もしくは、『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_sp_field @@ -90,7 +90,7 @@ class ComSpFieldMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 修正区分が「C(削除)」 か 修正区分が「B」で専門メンテナンス区分が「1」の場合の物理削除SQL + # 『修正区分がC(削除)』、もしくは、『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'C' or (self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1'): self.queries.append(self.PHYSICAL_DELETE_QUERY) return From fb57750b603ae7a8e932441b6739d063776e7e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Apr 2023 17:05:47 +0900 Subject: [PATCH 201/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_sp_field/com_sp_field_delete.csv | 5 ++++- .../com_sp_field/test_com_sp_field_mapper.py | 12 ------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv index c6d1489b..350bb655 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv @@ -1,3 +1,6 @@ "511","01","994301","00","B","0003","1","20161113","20161114","1","20170401","@","","","" "511","01","995783","00","C","0003","2","20161113","20161114","1","20170221","1","20140810","","" -"511","01","997906","00","B","0032","","","","","","","","","" +"511","01","997906","00","B","0032","2","","","","","","","","" +"511","01","997906","99","B","0032","2","","","","","","","","" +"511","01","994301","99","B","0003","1","","","","","","","","" +"511","01","995783","99","C","0003","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py index 986ee7e7..44798884 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py @@ -84,10 +84,6 @@ class TestComSpFieldMapper: assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) - # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] - # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE alma_cd IN ({','.join(primary_keys)})" - # actual_data_list = self.db.execute_select(actual_select_sql) - # 期待値検査 ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) @@ -155,10 +151,6 @@ class TestComSpFieldMapper: assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) - # expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_update.csv')) - # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] - # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys[0])}) AND specialst_cd IN ({','.join(primary_keys[1])})" - # actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) @@ -229,10 +221,6 @@ class TestComSpFieldMapper: assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) - # expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_delete.csv')) - # primary_keys = [f"'{primary_key['dcf_pcf_dr_cd', 'specialst_cd']}'" for primary_key in expect_data_list] - # actual_select_sql = f"SELECT * FROM src05.com_sp_field WHERE alma_cd IN ({','.join(primary_keys)})" - # actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) From bb00b9d9d42c10614d7e710a9344255b3bd1279f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 25 Apr 2023 17:08:38 +0900 Subject: [PATCH 202/962] =?UTF-8?q?feat:=20=E7=B4=8D=E5=85=A5=E5=85=88?= =?UTF-8?q?=E5=87=A6=E6=96=B9=E5=85=83=E3=83=9E=E3=82=B9=E3=82=BF=E6=B4=97?= =?UTF-8?q?=E6=9B=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create_inst_presc_for_laundering.py | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py new file mode 100644 index 00000000..c154bcdf --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py @@ -0,0 +1,144 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('納入先処方元マスタ洗替') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + logger.debug('納入先処方元マスタの洗替処理開始') + # ult_ident_presc_lauをTruncate + _truncate_ult_ident_presc_lau(db) + # トランザクション開始 + db.begin() + # ult_ident_presc から、ult_ident_presc_lauへInsert + _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db) + # v_inst_merge_tから、ult_ident_presc_lauをUpdate + _update_ult_ident_presc_lau_from_v_inst_merge_t(db) + # inst_merge_tから、ult_ident_presc_lauをUpdate + _update_ult_ident_presc_lau_from_inst_merge_t(db) + # コミット + db.commit() + logger.debug('納入先処方元マスタの洗替処理製造終了') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_ult_ident_presc_lau(db: Database): + try: + db.execute("TRUNCATE TABLE ult_ident_presc_lau") + except Exception as e: + logger.debug("納入先処方元マスタ(洗替後)の全件削除に失敗") + raise e + + logger.debug("納入先処方元マスタ(洗替後)の全件削除に成功") + return + + +def _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db: Database): + try: + elapsed_time = ElapsedTime() + sql = "INSERT INTO ult_ident_presc_lau SELECT *, null FROM ult_ident_presc" + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'処方元マスタから処方元マスタ(洗替後)に全件コピーに成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("処方元マスタから処方元マスタ(洗替後)に全件コピーに失敗") + raise e + + return + + +def _update_ult_ident_presc_lau_from_v_inst_merge_t(db: Database): + # v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする + try: + select_result = db.execute_select( + """ + SELECT + COUNT(v_inst_cd) AS row_count + FROM + internal05.v_inst_merge_t + """ + ) + except Exception as e: + logger.debug("V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗") + raise e + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません') + return + + logger.info(f'V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}') + + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.ult_ident_presc_lau uipl, internal05.v_inst_merge_t vimt + SET + uipl.ult_ident_cd = vimt.v_inst_cd_merge, + uipl.lau_ope_dt = SYSDATE() + WHERE + uipl.ult_ident_cd = vimt.v_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'納入先処方元マスタの納入先コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("納入先処方元マスタの納入先コードを施設コード移行先に更新失敗") + raise e + + return + + +def _update_ult_ident_presc_lau_from_inst_merge_t(db: Database): + # inst_merge_tから、ult_ident_presc_lauをUpdate + try: + select_result = db.execute_select( + """ + SELECT + COUNT(dcf_dsf_inst_cd) AS row_count + FROM + internal05.inst_merge_t + """ + ) + except Exception as e: + logger.debug("施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗") + raise e + + count = [row for row in select_result][0]['row_count'] + if count == 0: + logger.info('施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません') + return + + logger.info(f'施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}') + # inst_merge_tから、ult_ident_presc_lauをUpdate + try: + elapsed_time = ElapsedTime() + update_sql = """ + UPDATE + src05.ult_ident_presc_lau uipl, internal05.inst_merge_t imt + SET + uipl.presc_cd = imt.dup_opp_cd, + uipl.lau_ope_dt = SYSDATE() + WHERE + uipl.presc_cd = imt.dcf_dsf_inst_cd + """ + res = db.execute(update_sql) + logging_sql(logger, update_sql) + logger.info(f'納入先処方元マスタの処方元コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("納入先処方元マスタの処方元コードを施設コード移行先に更新失敗") + raise e + + return From 8b124f26babb69fb82716d6bfcb7e653b6f044d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 26 Apr 2023 11:40:26 +0900 Subject: [PATCH 203/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_sosiety_mapper.py | 97 +++++++ .../utmp_tables/tables/com_dr_sosiety.py | 28 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_dr_sosiety/__init__.py | 0 .../com_dr_sosiety/com_dr_sosiety_delete.csv | 9 + .../com_dr_sosiety/com_dr_sosiety_insert.csv | 10 + .../com_dr_sosiety/com_dr_sosiety_update.csv | 3 + .../db_com_dr_sosiety_before_delete.csv | 11 + .../db_com_dr_sosiety_before_update.csv | 11 + .../expect_com_dr_sosiety_delete.csv | 3 + .../expect_com_dr_sosiety_insert.csv | 10 + .../expect_com_dr_sosiety_update.csv | 12 + .../test_com_dr_sosiety_mapper.py | 242 ++++++++++++++++++ 13 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py new file mode 100644 index 00000000..309362e6 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py @@ -0,0 +1,97 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr_sosiety import ComDrSosiety + + +class ComDrSosietyMapper(UltmarcTableMapper): + """レイアウト区分521: COM_所属学会 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr_sosiety + ( + sosiety_cd, + dcf_pcf_dr_cd, + sosiety_f, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :sosiety_cd, + :dcf_pcf_dr_cd, + :sosiety_f, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_dr_sosiety + SET + sosiety_f = :sosiety_f, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』SQL + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + record: ComDrSosiety + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDrSosiety) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』 + if self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py new file mode 100644 index 00000000..53284e4d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py @@ -0,0 +1,28 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDrSosiety(UltmarcTable): + """レイアウト区分521: COM_所属学会""" + dcf_dr_id: str # レコードID + dcf_dr_code: str # 個人コード + dcf_dr_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + sosiety_cd: str # 学会コード + specialst_maint_div: str # 予備/専門医メンテ区分 + sosiety_f: str # 学会年度 + dcf_pcf_dr_cd: str # DCFPCF医師コード + +# メンテナンス年月日 と 予備/転送年月日 は未使用 + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcf_dr_id = record[1] + self.dcf_dr_code = record[2] + self.dcf_dr_yobi = record[3].strip() + self.maint_flag = record[4] + self.sosiety_cd = record[5] + self.specialst_maint_div = record[6] + self.sosiety_f = record[9] + + # DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備)) + self.dcf_pcf_dr_cd = ''.join([self.dcf_dr_id, self.dcf_dr_code, self.dcf_dr_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index b843c78d..9f45812b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -26,6 +26,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_regn_critic_pass_ma ComRegnCriticPassMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_func_valuation_mapper import \ ComMedFuncValuationMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \ + ComDrSosietyMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -33,7 +35,7 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ COM_TABLE_LIST = { # レコードID固定 # COM_医師学会 - "521": NullMapper, + "521": ComDrSosietyMapper, # COM_施設属性 "111": NullMapper, # COM_臨床研修病院 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv new file mode 100644 index 00000000..4e125d4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_delete.csv @@ -0,0 +1,9 @@ +"521","01","994301","00","B","027","1","20160826","20160903","" +"521","01","995783","00","B","027","1","20160826","20160903","" +"521","01","997682","00","B","027","1","20160826","20160903","" +"521","01","997906","00","B","008","1","20170331","20170408","" +"521","01","997906","00","B","223","1","20170407","20170415","" +"521","01","997906","00","B","116","1","20170407","20170415","" +"521","01","999613","00","B","027","1","20170414","20170422","" +"521","01","999613","00","B","223","1","20170414","20170422","" +"521","01","999999","00","B","999","1","20170414","20170422","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv new file mode 100644 index 00000000..7ef35de9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_insert.csv @@ -0,0 +1,10 @@ +"521","01","994301","00","A","027","2","20141113","20141114","2003" +"521","01","994301","00","A","223","2","20141113","20141114","2002" +"521","01","995783","00","A","027","2","20141113","20141114","2003" +"521","01","997682","00","A","027","2","20141113","20141114","2014" +"521","01","997906","00","A","027","2","20141113","20141114","2003" +"521","01","997906","00","A","116","2","20141113","20141114","2002" +"521","01","997906","00","A","223","2","20141113","20141114","2002" +"521","01","999613","00","A","027","2","20141113","20141114","2003" +"521","01","999613","00","A","223","2","20141113","20141114","2002" +"521","01","999999","99","A","999","2","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv new file mode 100644 index 00000000..b592b065 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/com_dr_sosiety_update.csv @@ -0,0 +1,3 @@ +"521","01","994301","00","B","027","2","20170826","20170903","2016" +"521","01","997906","00","B","008","2","20161113","20161114","2003" +"521","01","999999","99","B","999","2","20161113","20161114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv new file mode 100644 index 00000000..22213e4a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_delete.csv @@ -0,0 +1,11 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2016","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/11 21:20:37","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"008","0199790600","2003","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 14:00:03","clsComDrSosiety","2017/10/11 21:20:37","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv new file mode 100644 index 00000000..0de14d99 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/db_com_dr_sosiety_before_update.csv @@ -0,0 +1,11 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"999","0199999999","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv new file mode 100644 index 00000000..b614477b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_delete.csv @@ -0,0 +1,3 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv new file mode 100644 index 00000000..d4efb0c6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_insert.csv @@ -0,0 +1,10 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"027","0199430100","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199578300","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199768200","2014","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199790600","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"027","0199961300","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"116","0199790600","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"223","0199430100","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"223","0199790600","2002","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" +"999","0199999999","","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/08 17:05:14","com_dr_sosiety_mapper","2023/04/08 17:05:14","com_dr_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv new file mode 100644 index 00000000..a4b0381c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/expect_com_dr_sosiety_update.csv @@ -0,0 +1,12 @@ +"sosiety_cd","dcf_pcf_dr_cd","sosiety_f","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"008","0199790600","2003","20230426","NULL","NULL","NULL","NULL","NULL","2023/04/09 14:00:03","com_dr_sosiety_mapper","2023/04/09 14:00:03","com_dr_sosiety_mapper" +"027","0199430100","2016","20171008","20230426","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2023/04/09 14:00:03","com_dr_sosiety_mapper" +"027","0199578300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199768200","2014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199790600","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"027","0199961300","2003","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"116","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199430100","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199790600","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"223","0199961300","2002","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2017/10/08 20:57:12","clsComDrSosiety" +"999","0199999999","","20171008","20230426","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrSosiety","2023/04/08 20:57:12","com_dr_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py new file mode 100644 index 00000000..d577cfa1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py @@ -0,0 +1,242 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_dr_sosiety_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComDrSosietyMapper: + """レイアウト区分521: COM_所属学会""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_所属学会テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_insert.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_sosiety_cd, param_dcf_pcf_dr_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_所属学会テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_sosiety_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_sosiety', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_update.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_dcf_pcf_dr_cd, param_sosiety_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_所属学会テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_sosiety_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_sosiety_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_sosiety', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_sosiety_mapper.ComDrSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_sosiety_mapper.ComDrSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_delete.csv')) + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] + actual_data_list = [] + dr_sosiety_select_sql = """\ + SELECT * FROM src05.com_dr_sosiety + WHERE + sosiety_cd = :sosiety_cd + AND + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + \ + """ + for param_dcf_pcf_dr_cd, param_sosiety_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): + dr_sosiety_data = self.db.execute_select( + dr_sosiety_select_sql, + {**param_sosiety_cd, **param_dcf_pcf_dr_cd}) + assert len(dr_sosiety_data) == 1, '1件取得できていること' + actual_data_list.append(dr_sosiety_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From b000c55b66fc57bd1d61ff9d8f84107eeae7352c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 26 Apr 2023 13:29:38 +0900 Subject: [PATCH 204/962] =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultmarc/utmp_tables/tables/com_dr.py | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py new file mode 100644 index 00000000..a9d148e3 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py @@ -0,0 +1,142 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComDr(UltmarcTable): + """レイアウト区分501: COM_医師""" + dcfdr_id: str # 個人コード(レコードID) + dcfdr_code: str # 個人コード(個人コード) + dcfd_yobi: str # 個人コード(予備) + maint_flag: str # 修正区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + drdel_code: str # 削除予定理由 + reptdr_id: str # 重複時相手先コード(レコードID) + reptdr_code: str # 重複時相手先コード(個人コード) + reptdr_yobi: str # 重複時相手先コード(予備) + dr_name: str # 医師名(漢字) + dr_name_kana: str # 医師名(カナ) + sexc_ode: str # 性別 + birthday_era: str # 生年月日(元号) + birthday_year: str # 生年月日(年) + birthday_month: str # 生年月日(月) + birthday_day: str # 生年月日(日) + home_town_code: str # 出身都道府県コード + medassoci_code: str # 医師会コード + grad_yearera: str # 卒年_元号 + grad_year: str # 卒年_年 + graduniv_code: str # 出身校コード + graduniv_dept_code: str # 出身校学部識別コード + drda_yera: str # 登録年_元号 + drday_year: str # 登録年_年 + medsbj_code1: str # 診療科目1 + medsbj_code2: str # 診療科目2 + medsbj_code3: str # 診療科目3 + medsbj_code4: str # 診療科目4 + medsbj_code5: str # 診療科目5 + dr_addr_lost_code: str # 住所不明 + pref_code: str # 住所コード(県コード) + city_code: str # 住所コード(市区町村コード) + addr_code1: str # 住所コード(大字・通称コード) + addr_code2: str # 住所コード(字・丁目コード) + dr_zip_code: str # 郵便番号 + dr_addr: str # 自宅住所(漢字) + dr_addr_kana: str # 自宅住所(カナ) + dr_addr_num: str # 住所表示番号 + dr_addr_kanj_cnt1: str # 住所カウント_漢字(県) + dr_addr_kanj_cnt2: str # 住所カウント_漢字(市区町村) + dr_addr_kanj_cnt3: str # 住所カウント_漢字(大字・通称) + dr_addr_kanj_cnt4: str # 住所カウント_漢字(字・丁目) + dr_addr_kana_cnt1: str # 住所カウント_カナ(県) + dr_addr_kana_cnt2: str # 住所カウント_カナ(市区町村) + dr_addr_kana_cnt3: str # 住所カウント_カナ(大字・通称) + dr_addr_kana_cnt4: str # 住所カウント_カナ(字・丁目) + dr_tel: str # 自宅電話番号 + use_stop_flag: str # 利用停止区分 + use_stopc_ode: str # 利用停止理由 + cre_stop_date: str # 利用停止登録年月日 + release_date: str # 利用停止解除年月日 + pract_class_code: str # 開勤区分 + pract_yearera: str # 開業年(元号) + pract_year: str # 開業年(年) + bskregst_flag: str # 一括登録フラグ + + dcf_pcf_dr_cd: str # DCFPCF医師コード + addr_village_cd: str # 住所(町字)コード + addr_cnt_kana: str # 住所カウントカナ + addr_cnt: str # 住所カウント + opp_dup_code: str # 相手先重複コード + + birth_day: str # 生年月日(西暦) + estab_y: str # 開業年(西暦) + grad_y: str # 卒業年(西暦) + drday_y: str # 登録年(西暦) + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfdr_id = record[1] + self.dcfdr_code = record[2] + self.dcfd_yobi = record[3].strip() + self.maint_flag = record[4] + self.maint_date = record[5] + self.trn_date = record[6] + self.drdel_code = record[7].strip() + self.reptdr_id = record[8].strip() + self.reptdr_code = record[9].strip() + self.reptdr_yobi = record[10].strip() + self.dr_name = record[11].strip() + self.dr_name_kana = record[12].strip() + self.sexc_ode = record[13].strip() + self.birthday_era = record[14].strip() + self.birthday_year = record[15].strip() + self.birthday_month = record[16].strip() + self.birthday_day = record[17].strip() + self.home_town_code = record[18].strip() + self.medassoci_code = record[19].strip() + self.grad_yearera = record[20].strip() + self.grad_year = record[21].strip() + self.graduniv_code = record[22].strip() + self.graduniv_dept_code = record[23].strip() + self.drda_yera = record[24].strip() + self.drday_year = record[25].strip() + self.medsbj_code1 = record[26].strip() + self.medsbj_code2 = record[27].strip() + self.medsbj_code3 = record[28].strip() + self.medsbj_code4 = record[29].strip() + self.medsbj_code5 = record[30].strip() + self.dr_addr_lost_code = record[31].strip() + self.pref_code = record[32].strip() + self.city_code = record[33].strip() + self.addr_code1 = record[34].strip() + self.addr_code2 = record[35].strip() + self.dr_zip_code = record[36].strip() + self.dr_addr = record[37].strip() + self.dr_addr_kana = record[38].strip() + self.dr_addr_num = record[39] + self.dr_addr_kanj_cnt1 = record[40] + self.dr_addr_kanj_cnt2 = record[41] + self.dr_addr_kanj_cnt3 = record[42] + self.dr_addr_kanj_cnt4 = record[43] + self.dr_addr_kana_cnt1 = record[44] + self.dr_addr_kana_cnt2 = record[45] + self.dr_addr_kana_cnt3 = record[46] + self.dr_addr_kana_cnt4 = record[47] + self.dr_tel = record[48].strip() + self.use_stop_flag = record[49].strip() + self.use_stopc_ode = record[50].strip() + self.cre_stop_date = record[51].strip() + self.release_date = record[52].strip() + self.pract_class_code = record[53].strip() + self.pract_yearera = record[54].strip() + self.pract_year = record[55].strip() + self.bskregst_flag = record[56].strip() + + # DCFPCF医師コード + self.dcf_pcf_dr_cd = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfd_yobi]) + # 住所(町字)コード + self.addr_village_cd = ''.join([self.pref_code, self.city_code, self.addr_code1, self.addr_code2]) + # 住所カウントカナ + self.addr_cnt_kana = ''.join([self.dr_addr_kana_cnt1, self.dr_addr_kana_cnt2, self.dr_addr_kana_cnt3, self.dr_addr_kana_cnt4]) + # 住所カウント + self.addr_cnt = ''.join([self.dr_addr_kanj_cnt1, self.dr_addr_kanj_cnt2, self.dr_addr_kanj_cnt3, self.dr_addr_kanj_cnt4]) + # 相手先重複コード + self.dcf_pcf_dr_cd = ''.join([self.reptdr_id, self.reptdr_code, self.reptdr_yobi]) From e89241455494834f57c258d85942084796d59d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 26 Apr 2023 13:43:51 +0900 Subject: [PATCH 205/962] =?UTF-8?q?=E5=B0=82=E9=96=80=E5=88=86=E9=87=8E?= =?UTF-8?q?=E3=81=AE=E5=89=8A=E9=99=A4=E5=87=A6=E7=90=86=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_sp_field_mapper.py | 6 +++--- .../com_sp_field/expect_com_sp_field_delete.csv | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 38ea954a..18b4c64f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -70,7 +70,7 @@ class ComSpFieldMapper(UltmarcTableMapper): specialst_cd = :specialst_cd """ - # 『修正区分がC(削除)』、もしくは、『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_sp_field @@ -90,8 +90,8 @@ class ComSpFieldMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がC(削除)』、もしくは、『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 - if self.record.maint_flag == 'C' or (self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1'): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv index 98e54371..20feb37e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv @@ -1,4 +1,5 @@ "dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" "0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" From f1641b273933f935b45679e99a098a9b62770b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 26 Apr 2023 13:57:37 +0900 Subject: [PATCH 206/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/batch/jissekiaraigae.py | 14 -------------- .../laundering/create_inst_merge_for_laundering.py | 4 ++-- .../src/batch/laundering/sales_laundering.py | 7 +++++-- ...laundering.py => ult_ident_presc_laundering.py} | 9 ++------- 4 files changed, 9 insertions(+), 25 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/jissekiaraigae.py rename ecs/jskult-batch-daily/src/batch/laundering/{create_inst_presc_for_laundering.py => ult_ident_presc_laundering.py} (92%) diff --git a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py b/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py deleted file mode 100644 index be7e6384..00000000 --- a/ecs/jskult-batch-daily/src/batch/jissekiaraigae.py +++ /dev/null @@ -1,14 +0,0 @@ -from src.batch.datachange import emp_chg_inst_lau -from src.batch.datachange import create_inst_merge_for_laundering -from src.logging.get_logger import get_logger - -logger = get_logger('実績洗替') - - -def batch_process(): - """実績洗替処理""" - logger.info('Start Jisseki Araigae Batch PGM.') - # 洗替用マスタ作成 - create_inst_merge_for_laundering.batch_process() - # 施設担当者洗替 - emp_chg_inst_lau.batch_process() diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py index f631d460..2c9d7353 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/create_inst_merge_for_laundering.py @@ -5,7 +5,7 @@ from src.logging.get_logger import get_logger logger = get_logger('洗替用マスタ作成') -def batch_process(): +def exec(): db = Database.get_instance() try: @@ -17,7 +17,7 @@ def batch_process(): logger.debug('処理終了') except Exception as e: raise BatchOperationException(e) - finally: + finally: db.disconnect() 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 cb95b702..f6d682b4 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,5 @@ from src.batch.common.batch_context import BatchContext -from src.batch.laundering import emp_chg_inst_laundering +from src.batch.laundering import create_inst_merge_for_laundering, emp_chg_inst_laundering, ult_ident_presc_laundering from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() @@ -14,9 +14,12 @@ def exec(): if batch_context.is_not_business_day: logger.info('営業日ではないため、実績洗替処理をスキップします。') return - + # 洗替用マスタ作成 + create_inst_merge_for_laundering.exec() # 施設担当者洗替 emp_chg_inst_laundering.exec() + # 納入先処方元マスタ洗替 + ult_ident_presc_laundering.exec() # # 並列処理のテスト用コード # import time diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py similarity index 92% rename from ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py rename to ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py index c154bcdf..b7434967 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/create_inst_presc_for_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/ult_ident_presc_laundering.py @@ -16,19 +16,14 @@ def exec(): logger.debug('納入先処方元マスタの洗替処理開始') # ult_ident_presc_lauをTruncate _truncate_ult_ident_presc_lau(db) - # トランザクション開始 - db.begin() # ult_ident_presc から、ult_ident_presc_lauへInsert _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db) # v_inst_merge_tから、ult_ident_presc_lauをUpdate _update_ult_ident_presc_lau_from_v_inst_merge_t(db) # inst_merge_tから、ult_ident_presc_lauをUpdate _update_ult_ident_presc_lau_from_inst_merge_t(db) - # コミット - db.commit() logger.debug('納入先処方元マスタの洗替処理製造終了') except Exception as e: - db.rollback() raise BatchOperationException(e) finally: db.disconnect() @@ -36,7 +31,7 @@ def exec(): def _truncate_ult_ident_presc_lau(db: Database): try: - db.execute("TRUNCATE TABLE ult_ident_presc_lau") + db.execute("TRUNCATE TABLE src05.ult_ident_presc_lau") except Exception as e: logger.debug("納入先処方元マスタ(洗替後)の全件削除に失敗") raise e @@ -48,7 +43,7 @@ def _truncate_ult_ident_presc_lau(db: Database): def _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db: Database): try: elapsed_time = ElapsedTime() - sql = "INSERT INTO ult_ident_presc_lau SELECT *, null FROM ult_ident_presc" + sql = "INSERT INTO src05.ult_ident_presc_lau SELECT *, NULL FROM src05.ult_ident_presc" res = db.execute(sql) logging_sql(logger, sql) logger.info(f'処方元マスタから処方元マスタ(洗替後)に全件コピーに成功, {res.rowcount} 行更新 ({elapsed_time.of})') From ee85f61e1d2d761d1002d2b6b355afd6a9465281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Apr 2023 19:01:19 +0900 Subject: [PATCH 207/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_dr_mapper.py | 536 ++++++++++++++++++ .../ultmarc/utmp_tables/tables/com_dr.py | 10 +- .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_dr/__init__.py | 0 .../table_mapper/com_dr/com_dr_delete.csv | 6 + .../table_mapper/com_dr/com_dr_insert.csv | 6 + .../table_mapper/com_dr/com_dr_update.csv | 7 + .../com_dr/db_com_dr_before_delete.csv | 8 + .../com_dr/db_com_dr_before_update.csv | 9 + .../db_com_dr_trt_course_before_delete.csv | 15 + .../db_com_dr_trt_course_before_insert.csv | 2 + .../db_com_dr_trt_course_before_update.csv | 15 + .../com_dr/expect_com_dr_delete.csv | 7 + .../com_dr/expect_com_dr_insert.csv | 7 + .../expect_com_dr_trt_course_delete.csv | 15 + .../expect_com_dr_trt_course_insert.csv | 25 + .../expect_com_dr_trt_course_update.csv | 14 + .../com_dr/expect_com_dr_update.csv | 9 + .../table_mapper/com_dr/test_com_dr_mapper.py | 327 +++++++++++ 19 files changed, 1020 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py new file mode 100644 index 00000000..f8317533 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py @@ -0,0 +1,536 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_dr import ComDr + + +class ComDrMapper(UltmarcTableMapper): + """レイアウト区分501: COM_医師 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_dr + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_dr + ( + dcf_pcf_dr_cd, + dr_name_kana, + dr_name, + birthday_era, + birthday_year, + birthday_month, + birthday_day, + birthday, + hometown_cd, + estab_era, + estab_year, + estab_y, + home_phone_number, + home_addr_kana, + home_addr, + home_postal_number, + addr_village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + dr_circle_cd, + estab_div_cd, + sex_cd, + delete_sche_reason_cd, + addr_unknown_reason_cd, + alma_cd, + depart_disc_cd, + grad_era, + grad_year, + grad_y, + lump_regist_flg, + opp_dup_cd, + dr_ph_div, + use_stop_div, + use_stop_reason_cd, + use_stop_regist_ymd, + use_stop_cancel_ymd, + drday_era, + drday_year, + drday_y, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcf_pcf_dr_cd, + :dr_name_kana, + :dr_name, + :birthday_era, + :birthday_year, + :birthday_month, + :birthday_day, + :birth_day, + :home_town_code, + :pract_yearera, + :pract_year, + :estab_y, + :dr_tel, + :dr_addr_kana, + :dr_addr, + :dr_zip_code, + :addr_village_cd, + :pref_code, + :city_code, + :dr_addr_num, + :addr_cnt_kana, + :addr_cnt, + :medassoci_code, + :pract_class_code, + :sexc_ode, + :drdel_code, + :dr_addr_lost_code, + :graduniv_code, + :graduniv_dept_code, + :grad_yearera, + :grad_year, + :grad_y, + :bskregst_flag, + :opp_dup_code, + 1, + :use_stop_flag, + :use_stopc_ode, + :cre_stop_date, + :release_date, + :drda_yera, + :drday_year, + :drday_y, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_dr + SET + {update_columns} + dr_ph_div = 1, + abolish_ymd = NULL, + delete_flg = 0, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_dr + SET + abolish_ymd = :maint_date, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # 西暦取得SQL + YEAR_GET_QUERY = """\ + SELECT + year AS year + FROM + src05.com_era + WHERE + era_cd = :era_cd + """ + + # COM_医師診療科目の物理削除SQL + PHYSICAL_DELETE_QUERY_TRT = """\ + DELETE FROM + src05.com_dr_trt_course + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # COM_医師診療科目の登録用SQL + INSERT_QUERY_TRT1 = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + dcf_pcf_dr_cd, + sequence, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :medsbj_code1, + :dcf_pcf_dr_cd, + 1, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + INSERT_QUERY_TRT2 = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + dcf_pcf_dr_cd, + sequence, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :medsbj_code2, + :dcf_pcf_dr_cd, + 2, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + INSERT_QUERY_TRT3 = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + dcf_pcf_dr_cd, + sequence, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :medsbj_code3, + :dcf_pcf_dr_cd, + 3, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + INSERT_QUERY_TRT4 = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + dcf_pcf_dr_cd, + sequence, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :medsbj_code4, + :dcf_pcf_dr_cd, + 4, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + INSERT_QUERY_TRT5 = """\ + INSERT INTO src05.com_dr_trt_course + ( + trt_course_cd, + dcf_pcf_dr_cd, + sequence, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :medsbj_code5, + :dcf_pcf_dr_cd, + 5, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + record: ComDr + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComDr) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.__make_upsert_query() + return + + def __make_upsert_query(self): + # 西暦の取得 + self.__year_get() + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + # COM_医師診療科目 削除登録 + self.__make_delete_insert_trt_query() + return + + # 存在する場合ではUpdate + update_columns = ','.join(self.__make_update_query()) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + self.queries.append(None) + return + else: + # COM_医師診療科目 削除登録 + self.__make_delete_insert_trt_query() + + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + return + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # 削除予定理由 + if len(self.record.drdel_code) > 0: + set_clauses.append('delete_sche_reason_cd = :drdel_code') + if self.record.drdel_code == '@': + self.query_parameter['drdel_code'] = '' + + # 重複時相手先コード + if len(self.record.opp_dup_code) > 0: + set_clauses.append('opp_dup_cd = :opp_dup_code') + if self.record.reptdr_id == '@': + self.query_parameter['opp_dup_code'] = '' + + # 医師名(漢字) + if len(self.record.dr_name) > 0: + set_clauses.append('dr_name = :dr_name') + + # 医師名(カナ) + if len(self.record.dr_name_kana) > 0: + set_clauses.append('dr_name_kana = :dr_name_kana') + + # 性別 + if len(self.record.sexc_ode) > 0: + set_clauses.append('sex_cd = :sexc_ode') + + # 生年月日 + if len(self.record.birthday_era + self.record.birthday_year + self.record.birthday_month + self.record.birthday_day) > 0: + set_clauses.append('birthday_era = :birthday_era') + set_clauses.append('birthday_year = :birthday_year') + set_clauses.append('birthday_month = :birthday_month') + set_clauses.append('birthday_day = :birthday_day') + set_clauses.append('birthday = :birth_day') + if self.record.birthday_era == '@': + self.query_parameter['birthday_era'] = '' + self.query_parameter['birthday_year'] = '' + self.query_parameter['birthday_month'] = '' + self.query_parameter['birthday_day'] = '' + self.query_parameter['birth_day'] = '' + + # 出身都道府県コード + if len(self.record.home_town_code) > 0: + set_clauses.append('hometown_cd = :home_town_code') + + # 医師会コード + if len(self.record.medassoci_code) > 0: + set_clauses.append('dr_circle_cd = :medassoci_code') + + # 卒年 + if len(self.record.grad_yearera + self.record.grad_year) > 0: + set_clauses.append('grad_year = :grad_year') + set_clauses.append('grad_era = :grad_yearera') + set_clauses.append('grad_y = :grad_y') + if self.record.grad_yearera == '@': + self.query_parameter['grad_yearera'] = '' + self.query_parameter['grad_year'] = '' + self.query_parameter['grad_y'] = '' + + # 出身校コード + if len(self.record.graduniv_code) > 0: + set_clauses.append('alma_cd = :graduniv_code') + + # 出身校学部識別コード + if len(self.record.graduniv_dept_code) > 0: + set_clauses.append('depart_disc_cd = :graduniv_dept_code') + + # 登録年 + if len(self.record.drda_yera + self.record.drday_year) > 0: + set_clauses.append('drday_era = :drda_yera') + set_clauses.append('drday_year = :drday_year') + set_clauses.append('drday_y = :drday_y') + if self.record.drda_yera == '@': + self.query_parameter['drda_yera'] = '' + self.query_parameter['drday_year'] = '' + self.query_parameter['drday_y'] = '' + + # 住所不明 + if len(self.record.dr_addr_lost_code) > 0: + set_clauses.append('addr_unknown_reason_cd = :dr_addr_lost_code') + if self.record.dr_addr_lost_code == '@': + self.query_parameter['dr_addr_lost_code'] = '' + + # 住所 + if len(self.record.pref_code + self.record.city_code + self.record.addr_code1 + self.record.addr_code2 + + self.record.dr_zip_code + self.record.dr_addr + self.record.dr_addr_kana + self.record.dr_addr_num + + self.record.dr_addr_kanj_cnt1 + self.record.dr_addr_kanj_cnt2 + self.record.dr_addr_kanj_cnt3 + + self.record.dr_addr_kanj_cnt4 + self.record.dr_addr_kana_cnt1 + self.record.dr_addr_kana_cnt2 + + self.record.dr_addr_kana_cnt3 + self.record.dr_addr_kana_cnt4) > 0: + set_clauses.append('home_addr_kana = :dr_addr_kana') + set_clauses.append('home_addr = :dr_addr') + set_clauses.append('home_postal_number = :dr_zip_code') + set_clauses.append('addr_village_cd = :addr_village_cd') + set_clauses.append('prefc_cd = :pref_code') + set_clauses.append('city_cd = :city_code') + set_clauses.append('addr_display_number = :dr_addr_num') + set_clauses.append('addr_cnt_kana = :addr_cnt_kana') + set_clauses.append('addr_cnt = :addr_cnt') + + # 自宅電話番号 + if len(self.record.dr_tel) > 0: + set_clauses.append('home_phone_number = :dr_tel') + if self.record.dr_tel == '@': + self.query_parameter['dr_tel'] = '' + + # 利用停止区分 + if len(self.record.use_stop_flag) > 0: + set_clauses.append('use_stop_div = :use_stop_flag') + if self.record.use_stop_flag == '@': + self.query_parameter['use_stop_flag'] = '' + + # 利用停止理由 + if len(self.record.use_stopc_ode) > 0: + set_clauses.append('use_stop_reason_cd = :use_stopc_ode') + if self.record.use_stopc_ode == '@': + self.query_parameter['use_stopc_ode'] = '' + + # 利用停止登録年月日 + if len(self.record.cre_stop_date) > 0: + set_clauses.append('use_stop_regist_ymd = :cre_stop_date') + if self.record.cre_stop_date == '@': + self.query_parameter['cre_stop_date'] = '' + + # 利用停止解除年月日 + if len(self.record.release_date) > 0: + set_clauses.append('use_stop_cancel_ymd = :release_date') + if self.record.release_date == '@': + self.query_parameter['release_date'] = '' + + # 開勤区分 + if len(self.record.pract_class_code) > 0: + set_clauses.append('estab_div_cd = :pract_class_code') + + # 開業年 + if len(self.record.pract_yearera + self.record.pract_year) > 0: + set_clauses.append('estab_era = :pract_yearera') + set_clauses.append('estab_year = :pract_year') + set_clauses.append('estab_y = :estab_y') + if self.record.pract_yearera == '@': + self.query_parameter['pract_yearera'] = '' + self.query_parameter['pract_year'] = '' + self.query_parameter['estab_y'] = '' + + # 一括登録フラグ + if len(self.record.bskregst_flag) > 0: + set_clauses.append('lump_regist_flg = :bskregst_flag') + + return set_clauses + + def __make_delete_insert_trt_query(self): + # 削除 + self.queries.append(self.PHYSICAL_DELETE_QUERY_TRT) + + # 登録 + if self.record.medsbj_code1 != '@': + if len(self.record.medsbj_code1) > 0: + self.queries.append(self.INSERT_QUERY_TRT1) + if len(self.record.medsbj_code2) > 0: + self.queries.append(self.INSERT_QUERY_TRT2) + if len(self.record.medsbj_code3) > 0: + self.queries.append(self.INSERT_QUERY_TRT3) + if len(self.record.medsbj_code4) > 0: + self.queries.append(self.INSERT_QUERY_TRT4) + if len(self.record.medsbj_code5) > 0: + self.queries.append(self.INSERT_QUERY_TRT5) + + return + + def __year_get(self): + # 西暦の取得 + + # 生年月日(西暦) + if self.record.birthday_era != "@" and len(self.record.birthday_era) > 0 and len(self.record.birthday_year) > 0: + self.query_parameter['era_cd'] = self.record.birthday_era + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + ans_year = int(record_year[0]['year']) + int(self.record.birthday_year) + self.query_parameter['birth_day'] = ''.join([str(ans_year), self.record.birthday_month, self.record.birthday_day]) + + # 開業年(西暦) + if self.record.pract_yearera != "@" and len(self.record.pract_yearera) > 0 and len(self.record.pract_year) > 0: + self.query_parameter['era_cd'] = self.record.pract_yearera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['estab_y'] = str(int(record_year[0]['year']) + int(self.record.pract_year)) + + # 卒業年(西暦) + if self.record.grad_yearera != "@" and len(self.record.grad_yearera) > 0 and len(self.record.grad_year) > 0: + self.query_parameter['era_cd'] = self.record.grad_yearera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['grad_y'] = str(int(record_year[0]['year']) + int(self.record.grad_year)) + + # 登録年(西暦) + if self.record.drda_yera != "@" and len(self.record.drda_yera) > 0 and len(self.record.drday_year) > 0: + self.query_parameter['era_cd'] = self.record.drda_yera + record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter) + self.query_parameter['drday_y'] = str(int(record_year[0]['year']) + int(self.record.drday_year)) + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py index a9d148e3..e621cb0e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py @@ -71,6 +71,8 @@ class ComDr(UltmarcTable): grad_y: str # 卒業年(西暦) drday_y: str # 登録年(西暦) + era_cd: str # 元号コード + def __init__(self, record: list[str]): super().__init__(record) self.dcfdr_id = record[1] @@ -139,4 +141,10 @@ class ComDr(UltmarcTable): # 住所カウント self.addr_cnt = ''.join([self.dr_addr_kanj_cnt1, self.dr_addr_kanj_cnt2, self.dr_addr_kanj_cnt3, self.dr_addr_kanj_cnt4]) # 相手先重複コード - self.dcf_pcf_dr_cd = ''.join([self.reptdr_id, self.reptdr_code, self.reptdr_yobi]) + self.opp_dup_code = ''.join([self.reptdr_id, self.reptdr_code, self.reptdr_yobi]) + + self.birth_day = '' # 生年月日(西暦) + self.estab_y = '' # 開業年(西暦) + self.grad_y = '' # 卒業年(西暦) + self.drday_y = '' # 登録年(西暦) + self.era_cd = '' # 元号コード diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index b843c78d..c5cc977d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -26,6 +26,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_regn_critic_pass_ma ComRegnCriticPassMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_func_valuation_mapper import \ ComMedFuncValuationMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \ + ComDrMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -39,7 +41,7 @@ COM_TABLE_LIST = { # COM_臨床研修病院 "112": NullMapper, # COM_医師 - "501": NullMapper, + "501": ComDrMapper, # COM_施設 "101": ComInstMapper, # COM_薬局 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv new file mode 100644 index 00000000..6b3b6b3c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_delete.csv @@ -0,0 +1,6 @@ +"501","01","222222","33","C","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","01","994301","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","997906","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","995783","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","999613","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","997682","00","C","20230427","20141129","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv new file mode 100644 index 00000000..cf50c90e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_insert.csv @@ -0,0 +1,6 @@ +"501","01","222222","33","A","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","01","994301","00","A","20141113","20141114","","","","","菅間 正気","カンマ セイキ","1","3","16","01","14","37","37","3","44","011","1","3","44","A01","C01","I01","K01","C04","","14","104","094","000","231-0862","神奈川県横浜市中区山手町126-1 クレスト山手306","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","126-1-306","04","05","03","00","08","10","07","00","045-625-2067","","","","","1","","","" +"501","01","995783","00","A","20141113","20141114","","","","","船越 正信","フナコシ マサノブ","1","3","29","01","06","53","55","3","53","039","1","3","53","A01","L01","E02","C04","L03","7","00","000","000","000","","","","","00","00","00","00","00","00","00","00","","02","A05","20051003","","2","","","" +"501","01","997682","00","A","20141113","20141114","","","","","川崎 三紀子","カワサキ ミキコ","2","3","46","10","03","99","99","4","11","057","1","4","11","A01","A58","","","","","13","119","047","000","173-0001","東京都板橋区本町6-3-301","トウキヨウト イタバシク ホンチヨウ 6-3-301","6-3-301","03","03","02","00","07","07","06","00","03-3579-1698","","","","","2","","","1" +"501","01","997906","00","A","20141113","20141114","","","","","丘 守正","オカ モリマサ","1","3","20","03","11","99","31","3","45","799","1","","","A01","L01","A31","A21","A11","","08","221","095","000","312-0021","茨城県ひたちなか市大字三反田3892-4","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","3892-4","03","06","05","00","08","07","11","00","029-274-7110","","","","","1","4","03","" +"501","01","999613","00","A","20141113","20141114","5","01","481065","00","藤田 茜","フジタ アカネ","2","","","","","99","99","","","799","1","4","23","","","","","","6","00","000","000","000","","","","","00","00","00","00","00","00","00","00","","","","","","9","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv new file mode 100644 index 00000000..afdfb27c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv @@ -0,0 +1,7 @@ +"501","01","222222","33","A","20230425","20230426","7","8","9","10","11","12","1","4","15","06","17","18","19","1","21","022","3","4","25","A26","C27","I28","K29","L30","1","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","045-625-2048","49","50","20200501","20200502","3","4","55","6" +"501","99","999999","99","A","20230425","20230426","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"501","01","994301","00","B","20170911","20170912","","01","998099","00","","","2","","","","","","","","","022","2","","","@","","","","","","13","102","022","002","103-0013","東京都中央区日本橋人形町2-7-10-10","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","2-7-10-10","09","09","09","09","09","09","09","09","045-999-9999","03","B06","20160831","20161125","","","","1" +"501","01","995783","00","B","20170921","20170922","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","4","04","" +"501","01","997682","00","B","20170922","20170923","","","","","横浜 三紀子","ヨコハマ ミキコ","2","4","3","11","12","99","99","3","52","057","1","3","10","A01","A58","","","","","13","119","047","000","173-0001","東京都板橋区本町6-3-301","トウキヨウト イタバシク ホンチヨウ 6-3-301","6-3-301","03","03","02","00","07","07","06","00","03-3579-1698","","","","","2","","","1" +"501","01","997906","00","B","20170911","20170912","","","","","","","","@","","","","","","@","","","","","","U91","U92","U93","U94","U95","5","","","","","","","","","","","","","","","","","@","","","","","","@","","" +"501","01","999613","00","B","20170901","20170902","@","","","","","","","4","2","09","22","37","11","","","","","@","","","","","","","@","01","002","033","444","555-6666","神奈川県鎌倉市玉縄2-8-30","カナガワケン カマクラシ タマナワ 2-8-30","2-8-30","00","00","00","00","00","00","00","00","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv new file mode 100644 index 00000000..f6baf695 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv @@ -0,0 +1,8 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2−7−10−10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","NULL","NULL","NULL","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2−8−30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1","","","NULL","","0148106500","1","","","","","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv new file mode 100644 index 00000000..ccb0cb0a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv @@ -0,0 +1,9 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaaa" +"9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-625-2067","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","神奈川県横浜市中区山手町126−1 クレスト山手306","231-0862","14104094000","14","104","126-1-306","08100700","04050300","37","1","1","","","011","1","3","44","1969","","NULL","1","","","","","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","","","NULL","","","","","00000000000","00","000","","00000000","00000000","55","2","1","","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199768200","カワサキ ミキコ","川崎 三紀子","3","46","10","03","19711003","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","4","11","1999","1","NULL","1","","","","","4","11","1999","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"0199961300","フジタ アカネ","藤田 茜","","","","","NULL","99","","","NULL","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","NULL","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv new file mode 100644 index 00000000..cf12270f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_delete.csv @@ -0,0 +1,15 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L03","0199578300","5","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L01","0199578300","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"E02","0199578300","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"C04","0199578300","4","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"A58","0199768200","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"A01","0199768200","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U91","0199790600","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U92","0199790600","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U93","0199790600","3","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U94","0199790600","4","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U95","0199790600","5","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv new file mode 100644 index 00000000..f2497d92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_insert.csv @@ -0,0 +1,2 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv new file mode 100644 index 00000000..a9f320d5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv @@ -0,0 +1,15 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"U91","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U92","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U93","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U94","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U95","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv new file mode 100644 index 00000000..94734929 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_delete.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","20230425","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2−7−10−10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","NULL","NULL","NULL","","NULL","1","","","","","","","NULL","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2−8−30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1","","","NULL","","0148106500","1","","","","","NULL","NULL","NULL","NULL","20230427","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv new file mode 100644 index 00000000..bc0d5932 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_insert.csv @@ -0,0 +1,7 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","","045-625-2067","カナガワケン ヨコハマシ ナカク ヤマテチヨウ 126-1 クレストヤマテ 306","神奈川県横浜市中区山手町126-1 クレスト山手306","231-0862","14104094000","14","104","126-1-306","08100700","04050300","37","1","1","","","011","1","3","44","1969","","","1","","","","","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","","","","","","","","00000000000","00","000","","00000000","00000000","55","2","1","","7","039","1","3","53","1978","","","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199768200","カワサキ ミキコ","川崎 三紀子","3","46","10","03","19711003","99","","","","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","4","11","1999","1","","1","","","","","4","11","1999","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892-4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","","","","","","99","","","","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv new file mode 100644 index 00000000..900ee683 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_delete.csv @@ -0,0 +1,15 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","0199578300","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"A01","0199768200","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A58","0199768200","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"C04","0199578300","4","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"E02","0199578300","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L03","0199578300","5","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"L01","0199578300","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"U91","0199790600","1","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U92","0199790600","2","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U93","0199790600","3","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U94","0199790600","4","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" +"U95","0199790600","5","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/11 21:20:37","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv new file mode 100644 index 00000000..06ef8f21 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv @@ -0,0 +1,25 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0199430100","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A01","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A11","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A21","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"A31","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C01","0199430100","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C04","0199430100","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"C27","0122222233","2","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"I01","0199430100","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"I28","0122222233","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"K01","0199430100","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"K29","0122222233","4","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L01","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" +"L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" + + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv new file mode 100644 index 00000000..b62bbbca --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv @@ -0,0 +1,14 @@ +"trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"C27","0122222233","2","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"I28","0122222233","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"K29","0122222233","4","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"U91","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U92","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U93","0199790600","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U94","0199790600","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"U95","0199790600","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv new file mode 100644 index 00000000..0101a49a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv @@ -0,0 +1,9 @@ +"dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2-7-10-10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","0199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","","","","","","99","","","","","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","","","","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2-8-30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","","","799","1","","","NULL","","0148106500","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py new file mode 100644 index 00000000..b9a5b703 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -0,0 +1,327 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_dr_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComDrMapper: + """レイアウト区分501: COM_医師""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医師テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_insert.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(医師) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_insert.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_insert.csv')) + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医師テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(医師) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_update.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_update.csv')) + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医師テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(医師) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(医師診察科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_dr_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_dr_mapper.ComDrMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_dr_mapper.ComDrMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_delete.csv')) + primary_keys = [f"'{primary_key['dcf_pcf_dr_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_dr WHERE dcf_pcf_dr_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(医師診察科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_delete.csv')) + primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_dr_trt_course + WHERE + trt_course_cd = :trt_course_cd + AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\ + """ + for param_course_cd, param_dcf_pcf_dr_cd in zip(primary_keys_course_cd, primary_keys_dcf_pcf_dr_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_course_cd, **param_dcf_pcf_dr_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['sequence', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 9ba4eda8a32afa1e1c275032d56cb22bc3f4544c Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 25 Apr 2023 12:37:08 +0900 Subject: [PATCH 208/962] =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=BE?= =?UTF-8?q?=E3=81=A7=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 3 + ecs/jskult-batch-daily/src/aws/s3.py | 27 ++- .../src/batch/common/batch_context.py | 9 + .../common/calendar_wholestocksaler_file.py | 32 ++++ .../src/batch/vjsk/vjsk_importer.py | 143 +++++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 166 ++++++++++++++++++ ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 + .../src/system_var/environment.py | 3 + 8 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py create mode 100644 ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py create mode 100644 ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 95aef7fe..d95322fb 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -11,3 +11,6 @@ ULTMARC_BACKUP_FOLDER=ultmarc JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt +JSKULT_DATA_BUCKET=********************** +JSKULT_DATA_FOLDER_RECV=********************** diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 2ac3efe6..2aebff4b 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -1,3 +1,4 @@ +import io import os.path as path import tempfile @@ -16,7 +17,8 @@ class S3Client: return [] contents = response['Contents'] # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする - objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')] + objects = [{'filename': content['Key'], 'size': content['Size']} + for content in contents if not content['Key'].endswith('/')] return objects def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None: @@ -89,6 +91,16 @@ class ConfigBucket(S3Bucket): f.seek(0) return temporary_file_path + def download_wholesaler_stock_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME) + holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, holiday_list_key, f) + f.seek(0) + return temporary_file_path + class JskUltBackupBucket(S3Bucket): _bucket_name = environment.JSKULT_BACKUP_BUCKET @@ -96,3 +108,16 @@ class JskUltBackupBucket(S3Bucket): class UltmarcBackupBucket(JskUltBackupBucket): _folder = environment.ULTMARC_BACKUP_FOLDER + + +class VjskBucket(S3Bucket): + # TODO:V実消化バケットから見たり取ってきたりする実装をやる + _bucket_name = environment.JSKULT_DATA_BUCKET + _recv_folder = environment.JSKULT_DATA_FOLDER_RECV + + def get_file_list(self): + return self._s3_client.list_objects(self._bucket_name, self._recv_folder) + + # def download_data_file(self, data_filename: str): + # temporary_dir = tempfile.mkdtemp() + # temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._folder}/", "")}') diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_context.py b/ecs/jskult-batch-daily/src/batch/common/batch_context.py index 3b3ac157..b493ecca 100644 --- a/ecs/jskult-batch-daily/src/batch/common/batch_context.py +++ b/ecs/jskult-batch-daily/src/batch/common/batch_context.py @@ -3,6 +3,7 @@ class BatchContext: __syor_date: str # 処理日(yyyy/mm/dd形式) __is_not_business_day: bool # 日次バッチ起動日フラグ __is_ultmarc_imported: bool # アルトマーク取込実施済フラグ + __is_import_target_vjsk_stockslipdata: bool # 卸在庫データ取込対象フラグ def __init__(self) -> None: self.__is_not_business_day = False @@ -37,3 +38,11 @@ class BatchContext: @is_ultmarc_imported.setter def is_ultmarc_imported(self, flag: bool): self.__is_ultmarc_imported = flag + + @property + def is_import_target_vjsk_stockslipdata(self): + return self.__is_import_target_vjsk_stockslipdata + + @is_import_target_vjsk_stockslipdata.setter + def is_import_target_vjsk_stockslipdata(self, flag: bool): + self.__is_import_target_vjsk_stockslipdata = flag diff --git a/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py b/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py new file mode 100644 index 00000000..ba687514 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py @@ -0,0 +1,32 @@ +from src.system_var import constants + + +class CalendarWholwSalerStockFile: + """V実消化卸在庫データ連携日ファイル""" + + __calendar_file_lines: list[str] + + def __init__(self, calendar_file_path): + with open(calendar_file_path) as f: + self.__calendar_file_lines: list[str] = f.readlines() + + def compare_date(self, date_str: str) -> bool: + """与えられた日付がV実消化卸在庫データ連携日ファイル内に含まれているかどうか + V実消化卸在庫データ連携日ファイル内の日付はyyyy/mm/ddで書かれている前提 + コメント(#)が含まれている行は無視される + + Args: + date_str (str): yyyy/mm/dd文字列 + + Returns: + bool: 含まれていればTrue + """ + for calendar_date in self.__calendar_file_lines: + # コメント行が含まれている場合はスキップ + if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: + continue + + if date_str in calendar_date: + return True + + return False diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py new file mode 100644 index 00000000..4c2cb0ee --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -0,0 +1,143 @@ +from src.aws.s3 import ConfigBucket, VjskBucket +from src.batch.common.batch_context import BatchContext +from src.batch.common.calendar_wholestocksaler_file import \ + CalendarWholwSalerStockFile +from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +# from src.batch.datachange import emp_chg_inst_lau + +logger = get_logger('V実消化データ取込') +batch_context = BatchContext.get_instance() +vjsk_recv_bucket = VjskBucket() +vjsk_mapper = VjskRecvFileMapper() + + +def _check_if_file_exists(src_list: list, key: str) -> bool: + pref = vjsk_mapper.get_file_prefix(key) + suff = vjsk_mapper.get_file_suffix(key) + for idx, elem in enumerate(src_list): + buf = elem.get("filename") + filename = buf[buf.rfind("/") + 1:] + if filename.startswith(pref) and filename.endswith(suff): + return True + return False + + +def _check_received_files(): + """V実消化連携データ存在確認処理""" + logger.debug('V実消化連携データ存在確認処理:開始') + + # 実消化&アルトマーク V実消化データ受領バケットにあるファイル一覧を取得 + received_files = vjsk_recv_bucket.get_file_list() + logger.debug(f'ファイル一覧{received_files}') + + # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) + if batch_context.is_import_target_vjsk_stockslipdata: + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_STOCK_SLIP_DATA): + raise BatchOperationException(f'卸在庫データファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 卸販売データ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_SLIP_DATA): + raise BatchOperationException(f'卸販売データファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 卸組織変換マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_ORG_CNV_MST): + raise BatchOperationException(f'卸組織変換マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 施設統合マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_VOP_HCO_MERGE): + raise BatchOperationException(f'施設統合マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 卸マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_WHS_MST): + raise BatchOperationException(f'卸マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 卸ホールディングスマスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_HLD_MST): + raise BatchOperationException(f'卸ホールディングスマスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 施設マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_FCL_MST): + raise BatchOperationException(f'施設マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 メーカー卸組織展開表 + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_MKR_ORG_HORIZON): + raise BatchOperationException(f'メーカー卸組織展開表ファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 取引区分マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_TRAN_KBN_MST): + raise BatchOperationException(f'取引区分マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 製品マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_PHM_PRD_MST): + raise BatchOperationException(f'製品マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 製品価格マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_PHM_PRICE_MST): + raise BatchOperationException(f'製品価格マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 卸得意先情報マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST): + raise BatchOperationException(f'卸得意先情報マスタファイルがありません ファイル一覧:{received_files}') + + # ファイル存在確認 MDBコード変換マスタ + if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): + raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_files}') + + logger.debug('V実消化連携データ存在確認処理:終了') + + return True + + +def _import_file_to_db(): + logger.debug('V実消化取込処理:開始') + + # diff_upsertに変わるやつを呼び出す + # emp_chg_inst_lau.batch_process() みたいに + + logger.debug('V実消化取込処理:終了') + + +def _determine_today_is_stockslipdata_target(): + try: + # 設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日が該当していればTrueを返却する + today = batch_context.syor_date + + holiday_list_file_path = ConfigBucket().download_wholesaler_stock_list() + targetdays = CalendarWholwSalerStockFile(holiday_list_file_path) + ret = targetdays.compare_date(today) + except Exception as e: + logger.error(f'{e}') + raise e + return ret + + +def exec(): + """V実消化データ取込""" + logger.info('Start Jitsusyouka Torikomi PGM.') + + # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる + logger.debug('卸在庫データ取込対象日であるかを判定') + batch_context.is_import_target_vjsk_stockslipdata = _determine_today_is_stockslipdata_target() + logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') + if batch_context.is_import_target_vjsk_stockslipdata: + logger.info('卸在庫データ取込対象日です') + + # V実消化データファイル受領チェック + logger.debug('V実消化データファイル受領チェック:開始') + try: + _check_received_files() + except BatchOperationException as e: + logger.error('受領したV実消化データファイルに欠落があります') + raise e + logger.debug('V実消化データファイル受領チェック:終了') + + # データベース取込 + logger.debug('V実消化データ取込:開始') + try: + _import_file_to_db() + except Exception as e: + logger.error(f'データベース登録失敗 {e}') + logger.debug('V実消化データ取込:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py new file mode 100644 index 00000000..6a997c9f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -0,0 +1,166 @@ +class VjskRecvFileMapper: + CONDKEY_SLIP_DATA = "SLIP_DATA" # 販売実績データ + CONDKEY_HLD_MST = "HLD_MST" # V卸ホールディングスマスタ + CONDKEY_WHS_MST = "WHS_MST" # V卸マスタ + CONDKEY_MKR_ORG_HORIZON = "MKR_ORG_HORIZON" # Vメーカー卸組織展開表 + CONDKEY_ORG_CNV_MST = "ORG_CNV_MST" # V卸組織変換マスタ + CONDKEY_TRAN_KBN_MST = "TRAN_KBN_MST" # V取引区分マスタ + CONDKEY_FCL_MST = "FCL_MST" # V施設マスタ + CONDKEY_PHM_PRD_MST = "PHM_PRD_MST" # V製品マスタ + CONDKEY_PHM_PRICE_MST = "PHM_PRICE_MST" # V製品価格マスタ + CONDKEY_VOP_HCO_MERGE = "VOP_HCO_MERGE" # V施設統合マスタ + CONDKEY_WHS_CUSTOMER_MST = "WHS_CUSTOMER_MST" # V卸得意先情報マスタ + CONDKEY_MDB_CONV_MST = "MDB_CONV_MST" # MDBコード変換表 + CONDKEY_STOCK_SLIP_DATA = "STOCK_SLIP_DATA" # 卸在庫データ + CONDKEY_BIO_SLIP_DATA = "BIO_SLIP_DATA" # 生物由来データ + CONDKEY_LOT_NUM_MS = "LOT_NUM_MS" # ロットマスタデータ + + _KEY_FILE_PREFIX = "file_prefix" + _KEY_FILE_SUFFIX = "file_suffix" + _KEY_ORG_TABLE = "org_table" + _KEY_SRC_TABLE = "src_table" + _VJSK_INTERFACE_MAPPING = { + # 販売実績データ + CONDKEY_SLIP_DATA: { + _KEY_FILE_PREFIX: "slip_data_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.sales", + _KEY_SRC_TABLE: "src05.sales" + }, + + # V卸ホールディングスマスタ + CONDKEY_HLD_MST: { + _KEY_FILE_PREFIX: "hld_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.hld_mst_v", + _KEY_SRC_TABLE: "src05.hld_mst_v" + }, + + # V卸マスタ + CONDKEY_WHS_MST: { + _KEY_FILE_PREFIX: "whs_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.whs_mst_v", + _KEY_SRC_TABLE: "src05.whs_mst_v" + }, + + # Vメーカー卸組織展開表 + CONDKEY_MKR_ORG_HORIZON: { + _KEY_FILE_PREFIX: "mkr_org_horizon_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", + _KEY_SRC_TABLE: "src05.mkr_org_horizon_v" + }, + + # V卸組織変換マスタ + CONDKEY_ORG_CNV_MST: { + _KEY_FILE_PREFIX: "org_cnv_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.org_cnv_mst_v", + _KEY_SRC_TABLE: "src05.org_cnv_mst_v" + }, + + # V取引区分マスタ + CONDKEY_TRAN_KBN_MST: { + _KEY_FILE_PREFIX: "tran_kbn_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", + _KEY_SRC_TABLE: "src05.tran_kbn_mst_v" + }, + + # V施設マスタ + CONDKEY_FCL_MST: { + _KEY_FILE_PREFIX: "fcl_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.fcl_mst_v", + _KEY_SRC_TABLE: "src05.fcl_mst_v" + }, + + # V製品マスタ + CONDKEY_PHM_PRD_MST: { + _KEY_FILE_PREFIX: "phm_prd_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.phm_prd_mst_v", + _KEY_SRC_TABLE: "src05.phm_prd_mst_v" + }, + + # V製品価格マスタ + CONDKEY_PHM_PRICE_MST: { + _KEY_FILE_PREFIX: "phm_price_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.phm_price_mst_v", + _KEY_SRC_TABLE: "src05.phm_price_mst_v" + }, + + # V施設統合マスタ + CONDKEY_VOP_HCO_MERGE: { + _KEY_FILE_PREFIX: "vop_hco_merge_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.vop_hco_merge_v", + _KEY_SRC_TABLE: "src05.vop_hco_merge_v" + }, + + # V卸得意先情報マスタ + CONDKEY_WHS_CUSTOMER_MST: { + _KEY_FILE_PREFIX: "whs_customer_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.whs_customer_mst_v", + _KEY_SRC_TABLE: "src05.whs_customer_mst_v" + }, + + # MDBコード変換表 + CONDKEY_MDB_CONV_MST: { + _KEY_FILE_PREFIX: "mdb_conv_mst_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.mdb_conv_mst_v", + _KEY_SRC_TABLE: "src05.mdb_conv_mst_v" + }, + + # 卸在庫データ + CONDKEY_STOCK_SLIP_DATA: { + _KEY_FILE_PREFIX: "stock_slip_data_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.whole_stock", + _KEY_SRC_TABLE: "src05.whole_stock" + }, + + # 生物由来データ + CONDKEY_BIO_SLIP_DATA: { + _KEY_FILE_PREFIX: "bio_slip_data_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.bio_sales", + _KEY_SRC_TABLE: "src05.bio_sales" + }, + + # ロットマスタデータ + CONDKEY_LOT_NUM_MS: { + _KEY_FILE_PREFIX: "lot_num_ms_", + _KEY_FILE_SUFFIX: ".tsv", + _KEY_ORG_TABLE: "org05.lot_num_mst", + _KEY_SRC_TABLE: "src05.lot_num_mst" + }, + } + + def get_file_prefix(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_FILE_PREFIX) + return ret + + def get_file_suffix(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_FILE_SUFFIX) + return ret + + def get_org_table(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_ORG_TABLE) + return ret + + def get_src_table(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_SRC_TABLE) + return ret diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 370f2179..dc7146b7 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -9,6 +9,7 @@ from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile from src.batch.laundering import create_dcf_inst_merge, create_mst_inst from src.batch.ultmarc import ultmarc_process +from src.batch.vjsk import vjsk_importer from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants @@ -84,6 +85,7 @@ def exec(): logger.info('日次処理(V実消化)') try: logger.info('V実消化取込:起動') + vjsk_importer.exec() logger.info('V実消化取込:終了') except BatchOperationException as e: logger.exception(f'V実消化取込処理エラー(異常終了){e}') diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index b1730224..6a2fca0b 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -15,6 +15,9 @@ ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME'] +JSKULT_DATA_BUCKET = os.environ['JSKULT_DATA_BUCKET'] +JSKULT_DATA_FOLDER_RECV = os.environ['JSKULT_DATA_FOLDER_RECV'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 1db06f8dd27acc3691e289329764cbb33444ffa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 28 Apr 2023 17:56:06 +0900 Subject: [PATCH 209/962] =?UTF-8?q?feat:=20=E3=83=A1=E3=83=AB=E3=82=AF?= =?UTF-8?q?=E6=96=BD=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90?= =?UTF-8?q?(=E4=BB=AE=E5=AE=9F=E8=A3=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/laundering/mst_inst_laundering.py | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py new file mode 100644 index 00000000..d05a1e60 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -0,0 +1,218 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('メルク施設マスタ作成') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + logger.debug('メルク施設マスタ作成処理開始') + # mst_instをTruncate + _truncate_mst_inst(db) + # fcl_mst_vから、mst_instへInsert + _insert_mst_inst_from_fcl_mst_v(db) + # com_instから、mst_instへInsert + _insert_mst_inst_from_com_inst(db) + logger.debug('メルク施設マスタ作成処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_mst_inst(db: Database): + try: + db.execute("TRUNCATE TABLE src05.mst_inst") + except Exception as e: + logger.debug("メルク施設マスタの全件削除に失敗") + raise e + + logger.debug("メルク施設マスタの全件削除に成功") + return + + +def _insert_mst_inst_from_fcl_mst_v(db: Database): + # fcl_mst_vから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + delete_date, + v_inst_cd, + create_date, + update_date + ) + SELECT + fmv1.v_inst_cd, + CASE + WHEN fmv1.fcl_type IN ('A1','A0') THEN '3' + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' + END AS inst_clas_cd, + fmv1.fcl_name, + fmv1.fcl_abb_name, + fmv1.prft_cd, + RIGHT(fmv1.admin_kbn,3), + mp.prefc_name, + LEFT(mc.city_name,40), + CASE + WHEN fmv1.fcl_type IN ('A1','A0') THEN fmv1.fmt_addr + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) + END AS address, + fmv1.postal_cd, + fmv1.tel_num, + LEFT(fmv1.closed_dt, 10), + fmv1.v_inst_cd, + fmv1.ins_dt, + fmv1.upd_dt + FROM + src05.fcl_mst_v fmv1 + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) fmv2 + ON fmv1.v_inst_cd = fmv2.v_inst_cd + AND fmv1.sub_num = fmv2.sno + LEFT OUTER JOIN src05.mst_prefc AS mp + ON fmv1.prft_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON LEFT(fmv1.admin_kbn,2) = mc.prefc_cd + AND RIGHT(fmv1.admin_kbn,3) = mc.city_cd + WHERE + ((fmv1.fcl_type IN ('A1','A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') + AND fmv1.rec_sts_kbn != '9' + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'V施設マスタからメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("V施設マスタからメルク施設マスタに登録失敗") + raise e + + return + + +def _insert_mst_inst_from_com_inst(db: Database): + # com_instから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + SET SESSION optimizer_switch = 'derived_merge=off'; + INSERT INTO + src05.mst_inst + SELECT + ci.dcf_dsf_inst_cd, + '1', + ci.form_inst_name_kanji, + ci.inst_name_kanji, + ci.prefc_cd, + ci.city_cd, + mp.prefc_name, + LEFT(mc.city_name, 40), + ci.inst_addr, + ci.postal_number, + ci.inst_phone_number, + ci.bed_num, + ci.manage_cd, + LEFT(cm.manage_name, 40), + ci.abolish_ymd, + ci.inst_div_cd, + LEFT(cid.inst_div_name, 40), + mcmv.hco_vid_v, + ci.create_user, + ci.regist_date, + ci.update_user, + ci.update_date + FROM + src05.com_inst AS ci + LEFT OUTER JOIN src05.mst_prefc AS mp + ON ci.prefc_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON ci.prefc_cd = mc.prefc_cd + AND ci.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON ci.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON ci.inst_div_cd = cid.inst_div_cd + LEFT OUTER JOIN ( + SELECT + mcmv4.* + FROM ( + SELECT + mcmv1.* + FROM + mdb_cnv_mst_v AS mcmv1 + INNER JOIN ( + SELECT + mcmv2.hco_vid_v, + MAX(mcmv2.sub_num) AS sno + FROM + mdb_cnv_mst_v mcmv2 + WHERE + mcmv2.rec_sts_kbn != '9' + AND src05.get_syor_date() >= mcmv2.start_date + GROUP BY + mcmv2.hco_vid_v + ) AS mcmv3 + ON mcmv1.hco_vid_v = mcmv3.hco_vid_v + AND mcmv1.sub_num = mcmv3.sno + ) mcmv4 + INNER JOIN ( + SELECT + MIN(mcmv8.hco_vid_v) AS hvv, + mcmv8.mdb_cd + FROM ( + SELECT + mcmv5.* + FROM + mdb_cnv_mst_v AS mcmv5 + INNER JOIN ( + SELECT + mcmv6.hco_vid_v, + MAX(mcmv6.SUB_NUM) AS SNO + FROM + mdb_cnv_mst_v AS mcmv6 + WHERE + mcmv6.rec_sts_kbn != '9' + AND src05.get_syor_date() >= mcmv6.start_date + GROUP BY + mcmv6.hco_vid_v) AS mcmv7 + ON mcmv5.hco_vid_v = mcmv7.hco_vid_v + AND mcmv5.sub_num = mcmv7.sno) AS mcmv8 + GROUP BY mcmv8.mdb_cd) AS mcmv9 + ON mcmv4.mdb_cd = mcmv9.mdb_cd + AND mcmv4.hco_vid_v = mcmv9.hvv + ) AS mcmv + ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'COM施設からメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("COM施設からメルク施設マスタに登録失敗") + raise e + + return From 1fd6633bc838c9a626c2daa76a565ebe468b3a5b Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 28 Apr 2023 19:51:59 +0900 Subject: [PATCH 210/962] =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E3=81=8B=E3=82=89DB=E7=99=BB?= =?UTF-8?q?=E9=8C=B2=E3=81=AE=E5=AE=9F=E8=A3=85(=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E3=81=AF=E6=9C=AA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 17 +++-- .../src/batch/vjsk/vjsk_data_load_manager.py | 56 +++++++++++++++++ .../src/batch/vjsk/vjsk_importer.py | 63 +++++++++++++++++-- .../src/batch/vjsk/vjsk_recv_file_manager.py | 60 ++++++++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 9 +++ 5 files changed, 196 insertions(+), 9 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py create mode 100644 ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 2aebff4b..79c80db9 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -115,9 +115,16 @@ class VjskBucket(S3Bucket): _bucket_name = environment.JSKULT_DATA_BUCKET _recv_folder = environment.JSKULT_DATA_FOLDER_RECV - def get_file_list(self): - return self._s3_client.list_objects(self._bucket_name, self._recv_folder) + _s3_file_list = None - # def download_data_file(self, data_filename: str): - # temporary_dir = tempfile.mkdtemp() - # temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._folder}/", "")}') + def get_s3_file_list(self): + self._s3_file_list = self._s3_client.list_objects(self._bucket_name, self._recv_folder) + return self._s3_file_list + + def download_data_file(self, data_filename: str): + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._folder}/", "")}') + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, data_filename, f) + f.seek(0) + return temporary_file_path diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py new file mode 100644 index 00000000..a412c3c7 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -0,0 +1,56 @@ +from src.batch.vjsk.vjsk_recv_file_manager import (VjskDatFile, + VjskRecvFileManager) +from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper +from src.db.database import Database +from src.logging.get_logger import get_logger + +logger = get_logger('V実消化データ取込(DB登録)') +mapper = VjskRecvFileMapper() + + +class JjskDataLoadManager: + def _import_to_db(dat_file: VjskDatFile, condkey: str): + db = Database.get_instance() + table_name_org = mapper.get_org_table(condkey) + table_name_src = mapper.get_org_table(condkey) + + try: + db.connect() # TODO:接続オプション local_infile = True が必要? + db.begin() + + # orgをtruncate + f"TRUNCATE TABLE {table_name_org};" + + # orgにload ※warningは1148エラーになるらしい + sql = f"LOAD DATA LOCAL INFILE {dat_file} INTO TABLE {table_name_org} FIELDS TERMINATED BY '\t' ENCLOSED BY ""'"" IGNORE 1 LINES;" + cnt = db.execute(sql) + logger.info(f'tsvデータをorgテーブルにLOAD : 件数({cnt})') + + # org→srcにinsert select + # TODO: INTO句とSELECT句はmapperに持たせてcondkeyで引っ張ってくるようにしたい + f"INSERT INTO {table_name_src} SELECT * FROM {table_name_org};" + + db.commit() + except Exception as e: # TODO:DB例外だけキャッチしたい + db.rollback() + logger.error(e) + raise e + finally: + db.disconnect() + return + + def Load(self, target: dict): + # target : {"condkey": key, "src_file_path":local_file_path} + + # データファイルオープン + dat_file = VjskRecvFileManager.file_open(target["local_file_path"]) + + # TODO: tsvファイルをload投入用のDMLに加工(システム日時つけたり、エンコードをUTF-8に変換したり) + # TODO: ファイルオンコード判定の参考 https://zenn.dev/takedato/articles/c3a491546f8c58 + # TODO: エンコード変換の参考 https://dev.classmethod.jp/articles/python-encoding/ + dat_file = dat_file + + # データベース登録 + self._import_to_db(dat_file, target["condkey"]) + + return diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 4c2cb0ee..839058ab 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -2,6 +2,7 @@ from src.aws.s3 import ConfigBucket, VjskBucket from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_wholestocksaler_file import \ CalendarWholwSalerStockFile +from src.batch.vjsk.vjsk_data_load_manager import JjskDataLoadManager from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -30,7 +31,7 @@ def _check_received_files(): logger.debug('V実消化連携データ存在確認処理:開始') # 実消化&アルトマーク V実消化データ受領バケットにあるファイル一覧を取得 - received_files = vjsk_recv_bucket.get_file_list() + received_files = vjsk_recv_bucket.get_s3_file_list() logger.debug(f'ファイル一覧{received_files}') # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) @@ -94,15 +95,67 @@ def _check_received_files(): def _import_file_to_db(): logger.debug('V実消化取込処理:開始') - # diff_upsertに変わるやつを呼び出す - # emp_chg_inst_lau.batch_process() みたいに + # 実消化&アルトマーク V実消化データ受領バケットにあるファイルパス一覧を取得 + received_s3_files = vjsk_recv_bucket.get_s3_file_list() + + # ファイルパス一覧にマッピング情報を参照するためのキーを持たせて辞書可する + target_dict = {} + for s3_file_path in received_s3_files: + local_file_path = vjsk_recv_bucket.download_data_file(s3_file_path) + key = vjsk_mapper.get_condkey_by_s3_file_path(local_file_path) + if key is not None: + target_dict[key] = {"condkey": key, "src_file_path": local_file_path} + logger.debug(f'S3ファイルパス辞書{target_dict}') + + # TODO: diff_upsertに変わるやつを呼び出す + # TODO: emp_chg_inst_lau.batch_process() みたいに + + # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) + if batch_context.is_import_target_vjsk_stockslipdata: + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) + + # # # ファイル存在確認 卸販売データ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) + + # # # ファイル存在確認 卸組織変換マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) + + # # # ファイル存在確認 施設統合マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) + + # # # ファイル存在確認 卸マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) + + # # # ファイル存在確認 卸ホールディングスマスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) + + # # # ファイル存在確認 施設マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) + + # # # ファイル存在確認 メーカー卸組織展開表 + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) + + # # # ファイル存在確認 取引区分マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) + + # # # ファイル存在確認 製品マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) + + # # # ファイル存在確認 製品価格マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) + + # # # ファイル存在確認 卸得意先情報マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) + + # # # ファイル存在確認 MDBコード変換マスタ + # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) logger.debug('V実消化取込処理:終了') def _determine_today_is_stockslipdata_target(): + """設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日が該当していればTrueを返却する""" try: - # 設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日が該当していればTrueを返却する today = batch_context.syor_date holiday_list_file_path = ConfigBucket().download_wholesaler_stock_list() @@ -128,7 +181,9 @@ def exec(): # V実消化データファイル受領チェック logger.debug('V実消化データファイル受領チェック:開始') try: + # S3バケット上でV実消化データファイルの存在チェックをする _check_received_files() + except BatchOperationException as e: logger.error('受領したV実消化データファイルに欠落があります') raise e diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py new file mode 100644 index 00000000..5a0dd54f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py @@ -0,0 +1,60 @@ +import csv +from io import TextIOWrapper + + +class VjskRecvFileManager: + layout_class: str + records: list[str] + + def __init__(self, dat_line: list[str]) -> None: + self.layout_class = dat_line[0] + self.records = dat_line + + +class VjskDatFile: + """V実消化データファイル""" + + lines: list[VjskRecvFileManager] + success_count: int = 0 + error_count: int = 0 + total_count: int = 0 + __i: int = 0 + + def __iter__(self): + return self + + def __next__(self) -> VjskRecvFileManager: + if self.__i == len(self.lines): + raise StopIteration() + line = self.lines[self.__i] + self.__i += 1 + return line + + def __init__(self, file: TextIOWrapper) -> None: + reader = csv.reader(file) + csv_rows = [VjskRecvFileManager(row) for row in reader] + + self.lines = csv_rows + self.total_count = len(csv_rows) + + def count_up_success(self): + self.success_count += 1 + + def count_up_error(self): + self.error_count += 1 + + @classmethod + def file_open(cls, local_file_path: str): + """V実消化データファイルを読み込み、新しいインスタンスを作成する + + Args: + local_file_path (str): ローカルのファイルパス + + Returns: + VjskDatFile: このクラスのインスタンス + """ + # cp932(Shift-JIS Windows拡張)でファイルを読み込む + file = open(local_file_path, encoding='cp932') + instance = cls(file) + file.close() + return instance diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 6a997c9f..d89f5063 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -164,3 +164,12 @@ class VjskRecvFileMapper: if condkey in self._VJSK_INTERFACE_MAPPING: ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_SRC_TABLE) return ret + + def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: + ret = None + filename = s3_file_path[s3_file_path.rfind("/") + 1:] + for element in self._VJSK_INTERFACE_MAPPING: + if filename.startswith(element.get(self._KEY_FILE_PREFIX)) and filename.endswith(element.get(self._KEY_FILE_SUFFIX)): + ret = element + break + return ret From f09f54ed6f62c705544d64382a37d54959b667d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 1 May 2023 09:04:38 +0900 Subject: [PATCH 211/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv | 1 + .../table_mapper/com_dr/db_com_dr_before_update.csv | 1 + .../utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv | 2 +- .../utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv index afdfb27c..1fb79e85 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv @@ -5,3 +5,4 @@ "501","01","997682","00","B","20170922","20170923","","","","","横浜 三紀子","ヨコハマ ミキコ","2","4","3","11","12","99","99","3","52","057","1","3","10","A01","A58","","","","","13","119","047","000","173-0001","東京都板橋区本町6-3-301","トウキヨウト イタバシク ホンチヨウ 6-3-301","6-3-301","03","03","02","00","07","07","06","00","03-3579-1698","","","","","2","","","1" "501","01","997906","00","B","20170911","20170912","","","","","","","","@","","","","","","@","","","","","","U91","U92","U93","U94","U95","5","","","","","","","","","","","","","","","","","@","","","","","","@","","" "501","01","999613","00","B","20170901","20170902","@","","","","","","","4","2","09","22","37","11","","","","","@","","","","","","","@","01","002","033","444","555-6666","神奈川県鎌倉市玉縄2-8-30","カナガワケン カマクラシ タマナワ 2-8-30","2-8-30","00","00","00","00","00","00","00","00","","","","","","","","","" +"501","99","999999","90","B","20230425","20230426","@","@","9","10","11","12","1","@","15","06","17","18","19","@","21","022","3","@","25","@","C27","I28","K29","L30","@","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","@","@","@","@","@","3","@","55","6" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv index ccb0cb0a..0a6ea96a 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv @@ -6,4 +6,5 @@ "0199768200","カワサキ ミキコ","川崎 三紀子","3","46","10","03","19711003","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","4","11","1999","1","NULL","1","","","","","4","11","1999","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "0199961300","フジタ アカネ","藤田 茜","","","","","NULL","99","","","NULL","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","NULL","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" +"9999999990","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv index 0101a49a..882e4c9e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv @@ -5,5 +5,5 @@ "0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" "0199790600","オカ モリマサ","丘 守正","","","","","","99","","","","","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","","","","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" "0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2-8-30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","","","799","1","","","NULL","","0148106500","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"9999999990","12","11","","","","","","18","","","","","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","","","022","3","","","","6","","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" "9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" - diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py index b9a5b703..9872cd6b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -28,13 +28,13 @@ class TestComDrMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From 547bf6df956b640f1de6c0cefeb3bac2028edc60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 1 May 2023 13:15:27 +0900 Subject: [PATCH 212/962] =?UTF-8?q?feat:=20=E5=AE=9F=E8=A3=85=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/laundering/mst_inst_laundering.py | 218 ------------------ 1 file changed, 218 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py deleted file mode 100644 index d05a1e60..00000000 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ /dev/null @@ -1,218 +0,0 @@ -from src.batch.batch_functions import logging_sql -from src.batch.common.batch_context import BatchContext -from src.db.database import Database -from src.error.exceptions import BatchOperationException -from src.logging.get_logger import get_logger -from src.time.elapsed_time import ElapsedTime - -logger = get_logger('メルク施設マスタ作成') -batch_context = BatchContext.get_instance() - - -def exec(): - db = Database.get_instance() - try: - db.connect() - logger.debug('メルク施設マスタ作成処理開始') - # mst_instをTruncate - _truncate_mst_inst(db) - # fcl_mst_vから、mst_instへInsert - _insert_mst_inst_from_fcl_mst_v(db) - # com_instから、mst_instへInsert - _insert_mst_inst_from_com_inst(db) - logger.debug('メルク施設マスタ作成処理終了') - except Exception as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - -def _truncate_mst_inst(db: Database): - try: - db.execute("TRUNCATE TABLE src05.mst_inst") - except Exception as e: - logger.debug("メルク施設マスタの全件削除に失敗") - raise e - - logger.debug("メルク施設マスタの全件削除に成功") - return - - -def _insert_mst_inst_from_fcl_mst_v(db: Database): - # fcl_mst_vから、mst_instへInsert - try: - elapsed_time = ElapsedTime() - sql = """ - INSERT INTO - src05.mst_inst ( - inst_cd, - inst_clas_cd, - inst_name_form, - inst_name, - pref_cd, - city_cd, - pref_name, - city_name, - address, - postal_cd, - tel_num, - delete_date, - v_inst_cd, - create_date, - update_date - ) - SELECT - fmv1.v_inst_cd, - CASE - WHEN fmv1.fcl_type IN ('A1','A0') THEN '3' - WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' - END AS inst_clas_cd, - fmv1.fcl_name, - fmv1.fcl_abb_name, - fmv1.prft_cd, - RIGHT(fmv1.admin_kbn,3), - mp.prefc_name, - LEFT(mc.city_name,40), - CASE - WHEN fmv1.fcl_type IN ('A1','A0') THEN fmv1.fmt_addr - WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) - END AS address, - fmv1.postal_cd, - fmv1.tel_num, - LEFT(fmv1.closed_dt, 10), - fmv1.v_inst_cd, - fmv1.ins_dt, - fmv1.upd_dt - FROM - src05.fcl_mst_v fmv1 - INNER JOIN ( - SELECT - v_inst_cd, - MAX(sub_num) AS sno - FROM - src05.fcl_mst_v - GROUP BY - v_inst_cd - ) fmv2 - ON fmv1.v_inst_cd = fmv2.v_inst_cd - AND fmv1.sub_num = fmv2.sno - LEFT OUTER JOIN src05.mst_prefc AS mp - ON fmv1.prft_cd = mp.prefc_cd - LEFT OUTER JOIN src05.mst_city AS mc - ON LEFT(fmv1.admin_kbn,2) = mc.prefc_cd - AND RIGHT(fmv1.admin_kbn,3) = mc.city_cd - WHERE - ((fmv1.fcl_type IN ('A1','A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') - AND fmv1.rec_sts_kbn != '9' - """ - res = db.execute(sql) - logging_sql(logger, sql) - logger.info(f'V施設マスタからメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') - except Exception as e: - logger.debug("V施設マスタからメルク施設マスタに登録失敗") - raise e - - return - - -def _insert_mst_inst_from_com_inst(db: Database): - # com_instから、mst_instへInsert - try: - elapsed_time = ElapsedTime() - sql = """ - SET SESSION optimizer_switch = 'derived_merge=off'; - INSERT INTO - src05.mst_inst - SELECT - ci.dcf_dsf_inst_cd, - '1', - ci.form_inst_name_kanji, - ci.inst_name_kanji, - ci.prefc_cd, - ci.city_cd, - mp.prefc_name, - LEFT(mc.city_name, 40), - ci.inst_addr, - ci.postal_number, - ci.inst_phone_number, - ci.bed_num, - ci.manage_cd, - LEFT(cm.manage_name, 40), - ci.abolish_ymd, - ci.inst_div_cd, - LEFT(cid.inst_div_name, 40), - mcmv.hco_vid_v, - ci.create_user, - ci.regist_date, - ci.update_user, - ci.update_date - FROM - src05.com_inst AS ci - LEFT OUTER JOIN src05.mst_prefc AS mp - ON ci.prefc_cd = mp.prefc_cd - LEFT OUTER JOIN src05.mst_city AS mc - ON ci.prefc_cd = mc.prefc_cd - AND ci.city_cd = mc.city_cd - LEFT OUTER JOIN src05.com_manage AS cm - ON ci.manage_cd = cm.manage_cd - LEFT OUTER JOIN src05.com_inst_div AS cid - ON ci.inst_div_cd = cid.inst_div_cd - LEFT OUTER JOIN ( - SELECT - mcmv4.* - FROM ( - SELECT - mcmv1.* - FROM - mdb_cnv_mst_v AS mcmv1 - INNER JOIN ( - SELECT - mcmv2.hco_vid_v, - MAX(mcmv2.sub_num) AS sno - FROM - mdb_cnv_mst_v mcmv2 - WHERE - mcmv2.rec_sts_kbn != '9' - AND src05.get_syor_date() >= mcmv2.start_date - GROUP BY - mcmv2.hco_vid_v - ) AS mcmv3 - ON mcmv1.hco_vid_v = mcmv3.hco_vid_v - AND mcmv1.sub_num = mcmv3.sno - ) mcmv4 - INNER JOIN ( - SELECT - MIN(mcmv8.hco_vid_v) AS hvv, - mcmv8.mdb_cd - FROM ( - SELECT - mcmv5.* - FROM - mdb_cnv_mst_v AS mcmv5 - INNER JOIN ( - SELECT - mcmv6.hco_vid_v, - MAX(mcmv6.SUB_NUM) AS SNO - FROM - mdb_cnv_mst_v AS mcmv6 - WHERE - mcmv6.rec_sts_kbn != '9' - AND src05.get_syor_date() >= mcmv6.start_date - GROUP BY - mcmv6.hco_vid_v) AS mcmv7 - ON mcmv5.hco_vid_v = mcmv7.hco_vid_v - AND mcmv5.sub_num = mcmv7.sno) AS mcmv8 - GROUP BY mcmv8.mdb_cd) AS mcmv9 - ON mcmv4.mdb_cd = mcmv9.mdb_cd - AND mcmv4.hco_vid_v = mcmv9.hvv - ) AS mcmv - ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd - """ - res = db.execute(sql) - logging_sql(logger, sql) - logger.info(f'COM施設からメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') - except Exception as e: - logger.debug("COM施設からメルク施設マスタに登録失敗") - raise e - - return From 67a22eab6017ea37bd185719cadf9299c0bacfa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 1 May 2023 13:17:42 +0900 Subject: [PATCH 213/962] =?UTF-8?q?feat:=20=E5=AE=9F=E8=A3=85=E6=B8=88?= =?UTF-8?q?=E3=81=BF=E3=82=BD=E3=83=BC=E3=82=B9=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laundering/{create_mst_inst.py => mst_inst_laundering.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ecs/jskult-batch-daily/src/batch/laundering/{create_mst_inst.py => mst_inst_laundering.py} (100%) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py similarity index 100% rename from ecs/jskult-batch-daily/src/batch/laundering/create_mst_inst.py rename to ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py From e84b1eee3b6f064680c3381d3597f65b41518ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 1 May 2023 13:20:06 +0900 Subject: [PATCH 214/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E5=89=8D=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/laundering/mst_inst_laundering.py | 251 +++++++++++++++++- ecs/jskult-batch-daily/src/jobctrl_daily.py | 4 +- 2 files changed, 252 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 6b499a71..931aea37 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.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('メルク施設マスタ作成') @@ -13,4 +17,249 @@ def exec(): logger.info('営業日ではない、かつ、アルトマーク取込が行われていないため、メルク施設マスタ作成処理をスキップします。') return - pass + db = Database.get_instance() + try: + db.connect() + logger.debug('メルク施設マスタ作成処理開始') + # mst_instをTruncate + _truncate_mst_inst(db) + # fcl_mst_vから、mst_instへInsert + _insert_mst_inst_from_fcl_mst_v(db) + # オプティマイザのderived_mergeフラグをoffにする + _set_optimizer_derived_merge_off(db) + # com_instから、mst_instへInsert + _insert_mst_inst_from_com_inst(db) + logger.debug('メルク施設マスタ作成処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _truncate_mst_inst(db: Database): + try: + db.execute("TRUNCATE TABLE src05.mst_inst") + except Exception as e: + logger.debug("メルク施設マスタの全件削除に失敗") + raise e + + logger.debug("メルク施設マスタの全件削除に成功") + return + + +def _insert_mst_inst_from_fcl_mst_v(db: Database): + # fcl_mst_vから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + delete_date, + v_inst_cd, + create_date, + update_date + ) + SELECT + fmv1.v_inst_cd, + CASE + WHEN fmv1.fcl_type IN ('A1','A0') THEN '3' + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' + END AS inst_clas_cd, + fmv1.fcl_name, + fmv1.fcl_abb_name, + fmv1.prft_cd, + RIGHT(fmv1.admin_kbn,3), + mp.prefc_name, + LEFT(mc.city_name,40), + CASE + WHEN fmv1.fcl_type IN ('A1','A0') THEN RIGHT(fmv1.fmt_addr, 200) + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) + END AS address, + fmv1.postal_cd, + fmv1.tel_num, + LEFT(fmv1.closed_dt, 10), + fmv1.v_inst_cd, + fmv1.ins_dt, + fmv1.upd_dt + FROM + src05.fcl_mst_v AS fmv1 + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) fmv2 + ON fmv1.v_inst_cd = fmv2.v_inst_cd + AND fmv1.sub_num = fmv2.sno + LEFT OUTER JOIN src05.mst_prefc AS mp + ON fmv1.prft_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON LEFT(fmv1.admin_kbn,2) = mc.prefc_cd + AND RIGHT(fmv1.admin_kbn,3) = mc.city_cd + WHERE + ((fmv1.fcl_type IN ('A1','A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') + AND fmv1.rec_sts_kbn != '9' + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'V施設マスタからメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("V施設マスタからメルク施設マスタに登録失敗") + raise e + + return + + +def _set_optimizer_derived_merge_off(db: Database): + # オプティマイザのderived_mergeフラグをoffにする + try: + sql = """ + SET SESSION optimizer_switch = 'derived_merge=off' + """ + db.execute(sql) + except Exception as e: + logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") + raise e + + +def _insert_mst_inst_from_com_inst(db: Database): + # com_instから、mst_instへInsert + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + bed_num, + manage_cd, + manage_name, + delete_date, + inst_div_cd, + inst_div_name, + v_inst_cd, + creater, + create_date, + updater, + update_date + ) + SELECT + ci.dcf_dsf_inst_cd, + '1', + ci.form_inst_name_kanji, + ci.inst_name_kanji, + ci.prefc_cd, + ci.city_cd, + mp.prefc_name, + LEFT(mc.city_name, 40), + ci.inst_addr, + ci.postal_number, + ci.inst_phone_number, + ci.bed_num, + ci.manage_cd, + LEFT(cm.manage_name, 40), + ci.abolish_ymd, + ci.inst_div_cd, + LEFT(cid.inst_div_name, 40), + mcmv.hco_vid_v, + ci.create_user, + ci.regist_date, + ci.update_user, + ci.update_date + FROM + src05.com_inst AS ci + LEFT OUTER JOIN src05.mst_prefc AS mp + ON ci.prefc_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON ci.prefc_cd = mc.prefc_cd + AND ci.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON ci.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON ci.inst_div_cd = cid.inst_div_cd + LEFT OUTER JOIN ( + SELECT + mcmv4.* + FROM ( + SELECT + mcmv1.* + FROM + src05.mdb_cnv_mst_v AS mcmv1 + INNER JOIN ( + SELECT + mcmv2.hco_vid_v, + MAX(mcmv2.sub_num) AS sno + FROM + src05.mdb_cnv_mst_v mcmv2 + WHERE + mcmv2.rec_sts_kbn != '9' + AND src05.get_syor_date() >= mcmv2.start_date + GROUP BY + mcmv2.hco_vid_v + ) AS mcmv3 + ON mcmv1.hco_vid_v = mcmv3.hco_vid_v + AND mcmv1.sub_num = mcmv3.sno + ) mcmv4 + INNER JOIN ( + SELECT + MIN(mcmv8.hco_vid_v) AS hvv, + mcmv8.mdb_cd + FROM ( + SELECT + mcmv5.* + FROM + src05.mdb_cnv_mst_v AS mcmv5 + INNER JOIN ( + SELECT + mcmv6.hco_vid_v, + MAX(mcmv6.SUB_NUM) AS sno + FROM + src05.mdb_cnv_mst_v AS mcmv6 + WHERE + mcmv6.rec_sts_kbn != '9' + AND src05.get_syor_date() >= mcmv6.start_date + GROUP BY + mcmv6.hco_vid_v + ) AS mcmv7 + ON mcmv5.hco_vid_v = mcmv7.hco_vid_v + AND mcmv5.sub_num = mcmv7.sno + ) AS mcmv8 + GROUP BY + mcmv8.mdb_cd + ) AS mcmv9 + ON mcmv4.mdb_cd = mcmv9.mdb_cd + AND mcmv4.hco_vid_v = mcmv9.hvv + ) AS mcmv + ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'COM施設からメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug("COM施設からメルク施設マスタに登録失敗") + raise e + + return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 370f2179..1a82f226 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,7 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.laundering import create_dcf_inst_merge, create_mst_inst +from src.batch.laundering import create_dcf_inst_merge, mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -91,7 +91,7 @@ def exec(): try: logger.info('メルク施設マスタ作成:起動') - create_mst_inst.exec() + mst_inst_laundering.exec() logger.info('メルク施設マスタ作成:終了') except BatchOperationException as e: logger.exception(f'メルク施設マスタ作成 エラー(異常終了){e}') From 1a13839e7236bc8734c3de0236fe1c185cf3f138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 1 May 2023 13:55:14 +0900 Subject: [PATCH 215/962] =?UTF-8?q?feat:=20=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 931aea37..3c870328 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -83,7 +83,7 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): mp.prefc_name, LEFT(mc.city_name,40), CASE - WHEN fmv1.fcl_type IN ('A1','A0') THEN RIGHT(fmv1.fmt_addr, 200) + WHEN fmv1.fcl_type IN ('A1','A0') THEN LEFT(fmv1.fmt_addr, 200) WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) END AS address, fmv1.postal_cd, From 054040cdfc96eca8a6ed484c5502a85aafed319d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 1 May 2023 16:30:43 +0900 Subject: [PATCH 216/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E4=BD=9C=E6=A5=AD=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_inst_mapper.py | 536 +++++++++++++++++- .../ultmarc/utmp_tables/tables/com_inst.py | 200 +++++++ 2 files changed, 734 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index 6a34c446..e989677d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -1,9 +1,541 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst +import datetime class ComInstMapper(UltmarcTableMapper): - """COM_施設 登録処理: TODO""" + """レイアウト区分101: COM_施設 登録処理: TODO""" + + # レコード存在確認SQL(COM_施設) + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設) + INSERT_INST_QUERY = """\ + INSERT INTO src05.com_inst + ( + dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + rltd_univ_prnt_cd, + bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + ward_abolish_flg, + inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + hp_assrt_cd, + dup_opp_cd, + insp_item_micrb, + insp_item_serum, + insp_item_blood, + insp_item_patho, + insp_item_paras, + insp_item_biochem, + insp_item_ri, + re_exam_cd, + prmit_bed_num_other, + prmit_bed_num_mental, + prmit_bed_num_tuber, + prmit_bed_num_infection, + prmit_bed_num_sum, + prmit_bed_num_gen, + prmit_bed_num_rcup, + prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + dcfdsf_inst_code, + hp_class_code, + hp_addr_lost_code, + hp_name_kana, + hp_ryaku_name_kana, + hp_name, + hp_ryaku_name, + univ_prnt_code, + bed_num, + close_flag, + open_flag, + close_year_month, + open_year_month, + close_flag2, + inst_repre_code, + president_kana, + president, + tel_nothing_flag, + uncheck_flag, + hp_tel, + hp_addr_kana, + hp_addr, + hp_zip_code, + village_code, + pref_code, + city_code, + hp_addr_number, + addr_cnt_kana, + addr_cnt, + mgt_class_code, + hpdel_code, + hp_kind_code, + dup_opp_code, + inspect_code1, + inspect_code2, + inspect_code3, + inspect_code4, + inspect_code5, + inspect_code6, + inspect_code7, + reexam_flagc, + bed_num_gen, + bed_num_psy, + bed_num_tub, + bed_num_epi, + bed_num_sum, + bed_num_gen2, + bed_num_rest, + bed_class_maint_date, + 1, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL(COM_施設) + UPDATE_INST_QUERY = """\ + UPDATE + src05.com_inst + SET + {update_columns} + abolish_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcfdsf_inst_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_inst + SET + abolish_ymd = :maint_date, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設診療科目) + INSERT_INST_TRT_QUERY = """\ + INSERT INTO src05.com_inst_trt_course + ( + dcf_dsf_inst_cd, + trt_course_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :insert_trt_course_cd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ削除用SQL(COM_施設診療科目) + PHYSICAL_DELETE_TRT_QUERY = """\ + DELETE FROM + src05.com_inst_trt_course + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # レコード存在確認SQL(COM_特養医務室) + RECORD_EXISTS_SPCARE_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_spcare_med_office_dat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ更新用SQL(COM_特養医務室) + UPDATE_SSPCARE_QUERY = """\ + UPDATE + src05.com_spcare_med_office_dat + SET + dcf_prnt_inst_cd = :dcf_prnt_inst_code, + update_ymd = :execute_date_str_ymd, + delete_ymd = :delete_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_chld_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_特養医務室) + INSERT_INST_SSPCARE_QUERY = """\ + INSERT INTO src05.com_spcare_med_office_dat + ( + dcf_chld_inst_cd, + dcf_prnt_inst_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :dcf_prnt_inst_code, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + record: ComInst + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInst) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - self.queries.append(None) + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_INST_QUERY) + + # 存在する場合はUpdate(施設) + self.__make_update_query() + + # 施設診療科目の削除挿入 + self.__make_delete_insert_trt_query + + # 特養医務室の追加、更新 + self.__make_upsert_spcare_query + + return + + def __make_update_query(self): + # 存在する場合はUpdate(施設) + set_clauses = [] # 設定項目 + + # 施設区分コード + if len(self.record.hp_class_code) > 0: + set_clauses.append('inst_div_cd = :hp_class_code') + + # 正式施設名(カナ) + if len(self.record.hp_name_kana) > 0: + set_clauses.append('form_inst_name_kana = :hp_name_kana') + + # 略式施設名(カナ) + if len(self.record.hp_name_kana) > 0: + set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') + + # 正式施設名(漢字) + if len(self.record.hp_name) > 0: + set_clauses.append('form_inst_name_kanji = :hp_name') + + # 略式施設名(漢字) + if len(self.record.hp_ryaku_name_kana) > 0: + set_clauses.append('inst_name_kanji = :hp_ryaku_name_kana') + + # 施設住所カナ + if len(self.record.hp_addr_kana) > 0: + set_clauses.append('inst_addr_kana = :hp_addr_kana') + + # 施設住所 + if len(self.record.hp_addr) > 0: + set_clauses.append('inst_addr = :hp_addr') + + # 郵便番号 + if len(self.record.hp_zip_code) > 0: + set_clauses.append('postal_number = :hp_zip_code') + +# <<<<< 住所関連不明 >>>>>> + # 町字コード + if len(self.record.village_code) > 0: + set_clauses.append('village_cd = :village_code') + + # 都道府県コード + if len(self.record.pref_code) > 0: + set_clauses.append('prefc_cd = :pref_code') + + # 市区町村コード + if len(self.record.city_code) > 0: + set_clauses.append('city_cd = :city_code') + + # 住所カウント + if len(self.record.pref_code) > 0: + set_clauses.append('addr_cnt_kana = :addr_cnt_kana') + set_clauses.append('addr_cnt = :addr_cnt') + + # 住所表示番号@いるの? + if len(self.record.hp_addr_number) > 0: + set_clauses.append('addr_display_number = :hp_addr_number') + + # 経営体コード@いるの? + if len(self.record.mgt_class_code) > 0: + set_clauses.append('manage_cd = :mgt_class_code') + +# <<<<< 住所関連不明 >>>>>> + + # 病院種別 + if len(self.record.hp_kind_code) > 0: + set_clauses.append('hp_assrt_cd = :hp_kind_code') + + # 再審査コード + if len(self.record.reexam_flag) > 0: + set_clauses.append('re_exam_cd = :reexam_flag') + + # 未確認フラグ + if len(self.record.uncheck_flag) > 0: + set_clauses.append('unconf_flg = :uncheck_flag') + if self.record.uncheck_flag == '@': + self.query_parameter['uncheck_flag'] = '' + + # 削除予定理由コード + if len(self.record.hpdel_code) > 0: + set_clauses.append('delete_sche_reason_cd = :hpdel_code') + if self.record.hpdel_code == '@': + self.query_parameter['hpdel_code'] = '' + + # 重複時相手先コード + if len(self.record.dup_opp_code) > 0: + set_clauses.append('dup_opp_cd = :dup_opp_code') + if self.record.dup_opp_code == '@': + self.query_parameter['dup_opp_code'] = '' + + # 住所不明理由コード + if len(self.record.hp_addr_lost_code) > 0: + set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') + if self.record.hp_addr_lost_code == '@': + self.query_parameter['hp_addr_lost_code'] = '' + + # 電話番号なしフラグ + if len(self.record.tel_nothing_flag) > 0: + set_clauses.append('phone_number_non_flg = :tel_nothing_flag') + if self.record.tel_nothing_flag == '@': + self.query_parameter['tel_nothing_flag'] = '' + + # 電話番号 + if len(self.record.hp_tel) > 0: + set_clauses.append('inst_phone_number = :hp_tel') + if self.record.hp_tel == '@': + self.query_parameter['hp_tel'] = '' + + # 施設代表者コード + if len(self.record.inst_repre_code) > 0: + set_clauses.append('inst_repre_cd = :inst_repre_code') + if self.record.inst_repre_code == '@': + self.query_parameter['inst_repre_code'] = '' + + # 代表者(カナ) + if len(self.record.president_kana) > 0: + set_clauses.append('inst_repre_kana = :president_kana') + if self.record.president_kana == '@': + self.query_parameter['president_kana'] = '' + + # 代表者(漢字) ※「@」が大文字 + if len(self.record.president) > 0: + set_clauses.append('inst_repre = :president') + if self.record.president == '@': + self.query_parameter['president'] = '' + + # 開業予定フラグ・開業予定年月 + if len(self.record.open_flag + self.record.open_year_month) > 0: + set_clauses.append('estab_sche_flg = :open_flag') + set_clauses.append('estab_sche_ym = :open_year_month') + if self.record.open_flag == '@': + self.query_parameter['open_flag'] = '' + self.query_parameter['open_year_month'] = '' + + # 休院フラグ・休院開始年月 + if len(self.record.close_flag + self.record.close_year_month) > 0: + set_clauses.append('close_flg = :close_flag') + set_clauses.append('close_start_ym = :close_year_month') + if self.record.close_flag == '@': + self.query_parameter['close_flag'] = '' + self.query_parameter['close_year_month'] = '' + + # 関連大学親コード + if len(self.record.univ_prnt_code) > 0: + set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code') + if self.record.univ_prnt_code == '@': + self.query_parameter['univ_prnt_code'] = '' + + # 病棟閉鎖フラグ + if len(self.record.close_flag2) > 0: + set_clauses.append('ward_abolish_flg = :close_flag2') + if self.record.close_flag2 == '@': + self.query_parameter['close_flag2'] = '' + + # 病床数(定員) + if len(self.record.bed_num) > 0: + set_clauses.append('bed_num = :bed_num') + if self.record.bed_num == '@': + self.query_parameter['bed_num'] = '' + + # 許可病床メンテ日付 + if len(self.record.bed_class_maint_date) > 0: + set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date') + if self.record.bed_class_maint_date == '@': + self.query_parameter['bed_class_maint_date'] = '' + + # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) + # <<<<< 後で書き直そう >>>>>>>>> + if len(self.record.bed_num_sum + self.record.bed_num_psy + self.record.bed_num_tub + self.record.bed_num_epi + + self.record.bed_num_gen + self.record.bed_num_gen2 + self.record.bed_num_rest) > 0: + set_clauses.append('prmit_bed_num_sum = :bed_num_sum') + set_clauses.append('prmit_bed_num_mental = :bed_num_psy') + set_clauses.append('prmit_bed_num_tuber = :bed_num_tub') + set_clauses.append('prmit_bed_num_infection = :bed_num_epi') + set_clauses.append('prmit_bed_num_other = :bed_num_gen') + set_clauses.append('prmit_bed_num_gen = :bed_num_gen2') + set_clauses.append('prmit_bed_num_rcup = :bed_num_rest') + if self.record.bed_num_sum == '@': + self.query_parameter['bed_num_sum'] = '' + self.query_parameter['bed_num_psy'] = '' + self.query_parameter['bed_num_tub'] = '' + self.query_parameter['bed_num_epi'] = '' + self.query_parameter['bed_num_gen'] = '' + self.query_parameter['bed_num_gen2'] = '' + self.query_parameter['bed_num_rest'] = '' + + # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) + # <<<<< 後で書き直そう >>>>>>>>> + if len(self.record.inspect_code1 + self.record.inspect_code2 + self.record.inspect_code3 + self.record.inspect_code4 + + self.record.inspect_code5 + self.record.inspect_code6 + self.record.inspect_code7) > 0: + set_clauses.append('insp_item_micrb = :inspect_code1') + set_clauses.append('insp_item_serum = :inspect_code2') + set_clauses.append('insp_item_blood = :inspect_code3') + set_clauses.append('insp_item_patho = :inspect_code4') + set_clauses.append('insp_item_paras = :inspect_code5') + set_clauses.append('insp_item_biochem = :inspect_code6') + set_clauses.append('insp_item_ri = :inspect_code7') + if self.record.inspect_code1 == '@': + self.query_parameter['inspect_code1'] = '' + self.query_parameter['inspect_code2'] = '' + self.query_parameter['inspect_code3'] = '' + self.query_parameter['inspect_code4'] = '' + self.query_parameter['inspect_code5'] = '' + self.query_parameter['inspect_code6'] = '' + self.query_parameter['inspect_code7'] = '' + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合は更新処理は行わない + if len(update_columns) == 0: + return + else: + update_columns += ',' + update_query = self.UPDATE_INST_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + + return + + def __make_delete_insert_trt_query(self): + # 施設診療科目の削除挿入 + delins_flg = False + for i in range(0, 60): + if len(self.record.medsbj_code[i]) > 0: + delins_flg = True + break + + if not delins_flg: + return + + # 削除 + self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY) + + if len(self.record.medsbj_code[0]) != "@": + for i in range(0, 60): + if len(self.record.medsbj_code[i]) > 0: + self.query_parameter['insert_trt_course_cd'] = self.record.medsbj_code[i] + self.queries.append(self.INSERT_INST_TRT_QUERY) + return + + def __make_upsert_spcare_query(self): + # 特養医務室の追加、更新 + if (self.record.dcf_prnt_inst_code == "00" or len(self.record.dcf_prnt_inst_code) == 0): + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_SPCARE_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_INST_SSPCARE_QUERY) + return + + # 存在する場合はUpdate + if self.record.dcf_prnt_inst_code == "@": + self.query_parameter['dcf_prnt_inst_code'] = '' + self.query_parameter['delete_ymd'] = datetime.datetime.now().strftime('%Y%m%d') + else: + self.query_parameter['delete_ymd'] = '' + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py new file mode 100644 index 00000000..4838f9ee --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -0,0 +1,200 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInst(UltmarcTable): + """レイアウト区分101: COM_施設""" + dcfhp_id: str # 施設コード(レコードID) + dcfhp_code: str # 施設コード(施設コード) + dcfh_yobi: str # 施設コード(予備) + maint_flag: str # 修正区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + uncheck_flag: str # 未確認フラグ + hpdel_code: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_code: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + pref_code: str # 住所コード(県コード) + city_code: str # 住所コード(市区町村コード) + addr_code1: str # 住所コード(大字・通称コード) + addr_code2: str # 住所コード(字・丁目コード) + hp_zip_code: str # 郵便番号 + hp_addr: str # 住所(漢字) + hp_addr_kana: str # 住所(カナ) + hp_addr_number: str # 住所表示番号 + dr_addr_kanji1: str # 住所カウント_漢字(県) + dr_addr_kanji2: str # 住所カウント_漢字(市区町村) + dr_addr_kanji3: str # 住所カウント_漢字(大字・通称) + dr_addr_kanji4: str # 住所カウント_漢字(字・丁目) + dr_addr_kana1: str # 住所カウント_カナ(県) + dr_addr_kana2: str # 住所カウント_カナ(市区町村) + dr_addr_kana3: str # 住所カウント_カナ(大字・通称) + dr_addr_kana4: str # 住所カウント_カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + hp_tel: str # 電話番号 + mgt_class_code: str # 経営体 + hp_class_code: str # 施設区分 + president_id: str # 代表者コード(レコードID) + president_code: str # 代表者コード(個人コード) + president_yobi: str # 代表者コード(予備) + president: str # 代表者(漢字) + president_kana: str # 代表者(カナ) + open_flag: str # 開業予定フラグ + open_year_month: str # 開業予定年月 + close_flag: str # 休院フラグ + close_year_month: str # 休院開始年月 + medsbj_code = [] # 診療科目1~60 + hp_kind_code: str # 病院種別 + reexam_flag: str # 再審査区分 + assoc_parrent_id: str # 関連大学親コード(レコードID) + assoc_parrent_code: str # 関連大学親コード(施設コード) + assoc_parrent_yobi: str # 関連大学親コード(予備) + close_flag2: str # 病棟閉鎖フラグ + bed_num: str # 病床数(定員) + bed_class_maint_date: str # 許可病床メンテ日付 + bed_num_sum: str # 許可病床数_合計 + bed_num_psy: str # 許可病床数_精神 + bed_num_tub: str # 許可病床数_結核 + bed_num_epi: str # 許可病床数_感染症 + bed_num_gen: str # 許可病床数_その他 + bed_num_gen2: str # 許可病床数_一般病床 + bed_num_rest: str # 許可病床数_療養病床 + inspect_code1: str # 検査項目_微生物 + inspect_code2: str # 検査項目_血清 + inspect_code3: str # 検査項目_血液 + inspect_code4: str # 検査項目_病理 + inspect_code5: str # 検査項目_寄生虫 + inspect_code6: str # 検査項目_生化 + inspect_code7: str # 検査項目_RI + dcfhp_92id: str # 特養医務室コード(レコードID) + dcfhp_92code: str # 特養医務室コード(施設コード) + dcfhp_92yobi: str # 特養医務室コード(予備) + + dcfdsf_inst_code: str # DCFDSF施設コード + univ_prnt_code: str # 関連大学親コード + inst_repre_code: str # 施設代表者コード + village_code: str # 町字コード + addr_cnt_kana: str # 住所カウントカナ + addr_cnt: str # 住所カウント + dup_opp_code: str # 重複時相手先コード + dcf_prnt_inst_code: str # DCF親施設コード + + delete_ymd: str # 削除年月日(COM_特養医務室データ) + insert_trt_course_cd: str # 診療科目コード(COM_施設診療科目) + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfh_yobi = record[3].strip() + self.maint_flag = record[4] + self.maint_date = record[5] + self.trn_date = record[6] + self.uncheck_flag = record[7].strip() + self.hpdel_code = record[8].strip() + self.duphp_id = record[9] + self.duphp_code = record[10].strip() + self.duphp_yobi = record[11].strip() + self.hp_name = record[12].strip() + self.hp_name_kana = record[13].strip() + self.hp_ryaku_name = record[14].strip() + self.hp_ryaku_name_kana = record[15].strip() + self.hp_addr_lost_code = record[16].strip() + self.pref_code = record[17].strip() + self.city_code = record[18].strip() + self.addr_code1 = record[19].strip() + self.addr_code2 = record[20].strip() + self.hp_zip_code = record[21].strip() + self.hp_addr = record[22] + self.hp_addr_kana = record[23] + self.hp_addr_number = record[24] + self.dr_addr_kanji1 = record[25].strip() + self.dr_addr_kanji2 = record[26].strip() + self.dr_addr_kanji3 = record[27].strip() + self.dr_addr_kanji4 = record[28].strip() + self.dr_addr_kana1 = record[29].strip() + self.dr_addr_kana2 = record[30].strip() + self.dr_addr_kana3 = record[31].strip() + self.dr_addr_kana4 = record[32].strip() + self.tel_nothing_flag = record[33].strip() + self.hp_tel = record[34].strip() + self.mgt_class_code = record[35].strip() + self.hp_class_code = record[36].strip() + self.president_id = record[37] + self.president_code = record[38].strip() + self.president_yobi = record[39] + self.president = record[40].strip() + self.president_kana = record[41].strip() + self.open_flag = record[42].strip() + self.open_year_month = record[43].strip() + self.close_flag = record[44].strip() + self.close_year_month = record[45].strip() + + # 診療科目1~60 + num = 46 + for i in range(0, 60): + self.medsbj_code[i] = record[num] + num += 1 + + self.hp_kind_code = record[106].strip() + self.reexam_flag = record[107].strip() + self.assoc_parrent_id = record[108].strip() + self.assoc_parrent_code = record[109].strip() + self.assoc_parrent_yobi = record[110].strip() + self.close_flag2 = record[111].strip() + self.bed_num = record[112].strip() + self.bed_class_maint_date = record[113].strip() + self.bed_num_sum = record[114].strip() + self.bed_num_psy = record[115].strip() + self.bed_num_tub = record[116].strip() + self.bed_num_epi = record[117].strip() + self.bed_num_gen = record[118].strip() + self.bed_num_gen2 = record[119].strip() + self.bed_num_rest = record[120].strip() + self.inspect_code1 = record[121].strip() + self.inspect_code2 = record[122].strip() + self.inspect_code3 = record[123].strip() + self.inspect_code4 = record[124].strip() + self.inspect_code5 = record[125].strip() + self.inspect_code6 = record[126].strip() + self.inspect_code7 = record[127].strip() + self.dcfhp_92id = record[128].strip() + self.dcfhp_92code = record[129].strip() + self.dcfhp_92yobi = record[130].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi + # 関連大学親コード + self.univ_prnt_code = self.assoc_parrent_id + self.assoc_parrent_code + self.assoc_parrent_yobi + # 施設代表者コード + self.inst_repre_code = self.president_id + self.president_code + self.president_yobi + # 町字コード + self.village_code = self.pref_code + self.city_code + self.addr_code1 + self.addr_code2 + # 住所カウントカナ + self.addr_cnt_kana = self.dr_addr_kana1 + self.dr_addr_kana2 + self.dr_addr_kana3 + self.dr_addr_kana4 + # 住所カウント + self.addr_cnt = self.dr_addr_kanji1 + self.dr_addr_kanji2 + self.dr_addr_kanji3 + self.dr_addr_kanji4 + # 重複時相手先コード + self.dup_opp_code = self.duphp_id + self.duphp_code + self.duphp_yobi + # DCF親施設コード + self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi + + # 住所カウント_漢字の0埋め + self.dr_addr_kanji1.zfill(2) + self.dr_addr_kanji2.zfill(2) + self.dr_addr_kanji3.zfill(2) + self.dr_addr_kanji4.zfill(2) + + # 住所カウント_カナの0埋め + self.dr_addr_kana1.zfill(2) + self.dr_addr_kana2.zfill(2) + self.dr_addr_kana3.zfill(2) + self.dr_addr_kana4.zfill(2) + + self.delete_ymd = '' + self.insert_trt_course_cd = '' From 68c6ea576a5b3b0a9174b4de02b0d114802edde9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 1 May 2023 16:41:47 +0900 Subject: [PATCH 217/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E4=BD=9C=E6=A5=AD=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_inst_mapper.py | 536 +++++++++++++++++- .../ultmarc/utmp_tables/tables/com_inst.py | 200 +++++++ 2 files changed, 734 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index 6a34c446..e989677d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -1,9 +1,541 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst +import datetime class ComInstMapper(UltmarcTableMapper): - """COM_施設 登録処理: TODO""" + """レイアウト区分101: COM_施設 登録処理: TODO""" + + # レコード存在確認SQL(COM_施設) + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設) + INSERT_INST_QUERY = """\ + INSERT INTO src05.com_inst + ( + dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + rltd_univ_prnt_cd, + bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + ward_abolish_flg, + inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + hp_assrt_cd, + dup_opp_cd, + insp_item_micrb, + insp_item_serum, + insp_item_blood, + insp_item_patho, + insp_item_paras, + insp_item_biochem, + insp_item_ri, + re_exam_cd, + prmit_bed_num_other, + prmit_bed_num_mental, + prmit_bed_num_tuber, + prmit_bed_num_infection, + prmit_bed_num_sum, + prmit_bed_num_gen, + prmit_bed_num_rcup, + prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + dcfdsf_inst_code, + hp_class_code, + hp_addr_lost_code, + hp_name_kana, + hp_ryaku_name_kana, + hp_name, + hp_ryaku_name, + univ_prnt_code, + bed_num, + close_flag, + open_flag, + close_year_month, + open_year_month, + close_flag2, + inst_repre_code, + president_kana, + president, + tel_nothing_flag, + uncheck_flag, + hp_tel, + hp_addr_kana, + hp_addr, + hp_zip_code, + village_code, + pref_code, + city_code, + hp_addr_number, + addr_cnt_kana, + addr_cnt, + mgt_class_code, + hpdel_code, + hp_kind_code, + dup_opp_code, + inspect_code1, + inspect_code2, + inspect_code3, + inspect_code4, + inspect_code5, + inspect_code6, + inspect_code7, + reexam_flagc, + bed_num_gen, + bed_num_psy, + bed_num_tub, + bed_num_epi, + bed_num_sum, + bed_num_gen2, + bed_num_rest, + bed_class_maint_date, + 1, + NULL, + 0, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL(COM_施設) + UPDATE_INST_QUERY = """\ + UPDATE + src05.com_inst + SET + {update_columns} + abolish_ymd = NULL, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_pcf_dr_cd = :dcfdsf_inst_code + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_inst + SET + abolish_ymd = :maint_date, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_施設診療科目) + INSERT_INST_TRT_QUERY = """\ + INSERT INTO src05.com_inst_trt_course + ( + dcf_dsf_inst_cd, + trt_course_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :insert_trt_course_cd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ削除用SQL(COM_施設診療科目) + PHYSICAL_DELETE_TRT_QUERY = """\ + DELETE FROM + src05.com_inst_trt_course + WHERE + dcf_pcf_dr_cd = :dcf_pcf_dr_cd + """ + + # レコード存在確認SQL(COM_特養医務室) + RECORD_EXISTS_SPCARE_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_spcare_med_office_dat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # データ更新用SQL(COM_特養医務室) + UPDATE_SSPCARE_QUERY = """\ + UPDATE + src05.com_spcare_med_office_dat + SET + dcf_prnt_inst_cd = :dcf_prnt_inst_code, + update_ymd = :execute_date_str_ymd, + delete_ymd = :delete_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_chld_inst_cd = :dcfdsf_inst_code + """ + + # データ登録用SQL(COM_特養医務室) + INSERT_INST_SSPCARE_QUERY = """\ + INSERT INTO src05.com_spcare_med_office_dat + ( + dcf_chld_inst_cd, + dcf_prnt_inst_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :dcf_prnt_inst_code, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + record: ComInst + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInst) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - self.queries.append(None) + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_INST_QUERY) + + # 存在する場合はUpdate(施設) + self.__make_update_query() + + # 施設診療科目の削除挿入 + self.__make_delete_insert_trt_query + + # 特養医務室の追加、更新 + self.__make_upsert_spcare_query + + return + + def __make_update_query(self): + # 存在する場合はUpdate(施設) + set_clauses = [] # 設定項目 + + # 施設区分コード + if len(self.record.hp_class_code) > 0: + set_clauses.append('inst_div_cd = :hp_class_code') + + # 正式施設名(カナ) + if len(self.record.hp_name_kana) > 0: + set_clauses.append('form_inst_name_kana = :hp_name_kana') + + # 略式施設名(カナ) + if len(self.record.hp_name_kana) > 0: + set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') + + # 正式施設名(漢字) + if len(self.record.hp_name) > 0: + set_clauses.append('form_inst_name_kanji = :hp_name') + + # 略式施設名(漢字) + if len(self.record.hp_ryaku_name_kana) > 0: + set_clauses.append('inst_name_kanji = :hp_ryaku_name_kana') + + # 施設住所カナ + if len(self.record.hp_addr_kana) > 0: + set_clauses.append('inst_addr_kana = :hp_addr_kana') + + # 施設住所 + if len(self.record.hp_addr) > 0: + set_clauses.append('inst_addr = :hp_addr') + + # 郵便番号 + if len(self.record.hp_zip_code) > 0: + set_clauses.append('postal_number = :hp_zip_code') + +# <<<<< 住所関連不明 >>>>>> + # 町字コード + if len(self.record.village_code) > 0: + set_clauses.append('village_cd = :village_code') + + # 都道府県コード + if len(self.record.pref_code) > 0: + set_clauses.append('prefc_cd = :pref_code') + + # 市区町村コード + if len(self.record.city_code) > 0: + set_clauses.append('city_cd = :city_code') + + # 住所カウント + if len(self.record.pref_code) > 0: + set_clauses.append('addr_cnt_kana = :addr_cnt_kana') + set_clauses.append('addr_cnt = :addr_cnt') + + # 住所表示番号@いるの? + if len(self.record.hp_addr_number) > 0: + set_clauses.append('addr_display_number = :hp_addr_number') + + # 経営体コード@いるの? + if len(self.record.mgt_class_code) > 0: + set_clauses.append('manage_cd = :mgt_class_code') + +# <<<<< 住所関連不明 >>>>>> + + # 病院種別 + if len(self.record.hp_kind_code) > 0: + set_clauses.append('hp_assrt_cd = :hp_kind_code') + + # 再審査コード + if len(self.record.reexam_flag) > 0: + set_clauses.append('re_exam_cd = :reexam_flag') + + # 未確認フラグ + if len(self.record.uncheck_flag) > 0: + set_clauses.append('unconf_flg = :uncheck_flag') + if self.record.uncheck_flag == '@': + self.query_parameter['uncheck_flag'] = '' + + # 削除予定理由コード + if len(self.record.hpdel_code) > 0: + set_clauses.append('delete_sche_reason_cd = :hpdel_code') + if self.record.hpdel_code == '@': + self.query_parameter['hpdel_code'] = '' + + # 重複時相手先コード + if len(self.record.dup_opp_code) > 0: + set_clauses.append('dup_opp_cd = :dup_opp_code') + if self.record.dup_opp_code == '@': + self.query_parameter['dup_opp_code'] = '' + + # 住所不明理由コード + if len(self.record.hp_addr_lost_code) > 0: + set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') + if self.record.hp_addr_lost_code == '@': + self.query_parameter['hp_addr_lost_code'] = '' + + # 電話番号なしフラグ + if len(self.record.tel_nothing_flag) > 0: + set_clauses.append('phone_number_non_flg = :tel_nothing_flag') + if self.record.tel_nothing_flag == '@': + self.query_parameter['tel_nothing_flag'] = '' + + # 電話番号 + if len(self.record.hp_tel) > 0: + set_clauses.append('inst_phone_number = :hp_tel') + if self.record.hp_tel == '@': + self.query_parameter['hp_tel'] = '' + + # 施設代表者コード + if len(self.record.inst_repre_code) > 0: + set_clauses.append('inst_repre_cd = :inst_repre_code') + if self.record.inst_repre_code == '@': + self.query_parameter['inst_repre_code'] = '' + + # 代表者(カナ) + if len(self.record.president_kana) > 0: + set_clauses.append('inst_repre_kana = :president_kana') + if self.record.president_kana == '@': + self.query_parameter['president_kana'] = '' + + # 代表者(漢字) ※「@」が大文字 + if len(self.record.president) > 0: + set_clauses.append('inst_repre = :president') + if self.record.president == '@': + self.query_parameter['president'] = '' + + # 開業予定フラグ・開業予定年月 + if len(self.record.open_flag + self.record.open_year_month) > 0: + set_clauses.append('estab_sche_flg = :open_flag') + set_clauses.append('estab_sche_ym = :open_year_month') + if self.record.open_flag == '@': + self.query_parameter['open_flag'] = '' + self.query_parameter['open_year_month'] = '' + + # 休院フラグ・休院開始年月 + if len(self.record.close_flag + self.record.close_year_month) > 0: + set_clauses.append('close_flg = :close_flag') + set_clauses.append('close_start_ym = :close_year_month') + if self.record.close_flag == '@': + self.query_parameter['close_flag'] = '' + self.query_parameter['close_year_month'] = '' + + # 関連大学親コード + if len(self.record.univ_prnt_code) > 0: + set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code') + if self.record.univ_prnt_code == '@': + self.query_parameter['univ_prnt_code'] = '' + + # 病棟閉鎖フラグ + if len(self.record.close_flag2) > 0: + set_clauses.append('ward_abolish_flg = :close_flag2') + if self.record.close_flag2 == '@': + self.query_parameter['close_flag2'] = '' + + # 病床数(定員) + if len(self.record.bed_num) > 0: + set_clauses.append('bed_num = :bed_num') + if self.record.bed_num == '@': + self.query_parameter['bed_num'] = '' + + # 許可病床メンテ日付 + if len(self.record.bed_class_maint_date) > 0: + set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date') + if self.record.bed_class_maint_date == '@': + self.query_parameter['bed_class_maint_date'] = '' + + # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) + # <<<<< 後で書き直そう >>>>>>>>> + if len(self.record.bed_num_sum + self.record.bed_num_psy + self.record.bed_num_tub + self.record.bed_num_epi + + self.record.bed_num_gen + self.record.bed_num_gen2 + self.record.bed_num_rest) > 0: + set_clauses.append('prmit_bed_num_sum = :bed_num_sum') + set_clauses.append('prmit_bed_num_mental = :bed_num_psy') + set_clauses.append('prmit_bed_num_tuber = :bed_num_tub') + set_clauses.append('prmit_bed_num_infection = :bed_num_epi') + set_clauses.append('prmit_bed_num_other = :bed_num_gen') + set_clauses.append('prmit_bed_num_gen = :bed_num_gen2') + set_clauses.append('prmit_bed_num_rcup = :bed_num_rest') + if self.record.bed_num_sum == '@': + self.query_parameter['bed_num_sum'] = '' + self.query_parameter['bed_num_psy'] = '' + self.query_parameter['bed_num_tub'] = '' + self.query_parameter['bed_num_epi'] = '' + self.query_parameter['bed_num_gen'] = '' + self.query_parameter['bed_num_gen2'] = '' + self.query_parameter['bed_num_rest'] = '' + + # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) + # <<<<< 後で書き直そう >>>>>>>>> + if len(self.record.inspect_code1 + self.record.inspect_code2 + self.record.inspect_code3 + self.record.inspect_code4 + + self.record.inspect_code5 + self.record.inspect_code6 + self.record.inspect_code7) > 0: + set_clauses.append('insp_item_micrb = :inspect_code1') + set_clauses.append('insp_item_serum = :inspect_code2') + set_clauses.append('insp_item_blood = :inspect_code3') + set_clauses.append('insp_item_patho = :inspect_code4') + set_clauses.append('insp_item_paras = :inspect_code5') + set_clauses.append('insp_item_biochem = :inspect_code6') + set_clauses.append('insp_item_ri = :inspect_code7') + if self.record.inspect_code1 == '@': + self.query_parameter['inspect_code1'] = '' + self.query_parameter['inspect_code2'] = '' + self.query_parameter['inspect_code3'] = '' + self.query_parameter['inspect_code4'] = '' + self.query_parameter['inspect_code5'] = '' + self.query_parameter['inspect_code6'] = '' + self.query_parameter['inspect_code7'] = '' + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合は更新処理は行わない + if len(update_columns) == 0: + return + else: + update_columns += ',' + update_query = self.UPDATE_INST_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + + return + + def __make_delete_insert_trt_query(self): + # 施設診療科目の削除挿入 + delins_flg = False + for i in range(0, 60): + if len(self.record.medsbj_code[i]) > 0: + delins_flg = True + break + + if not delins_flg: + return + + # 削除 + self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY) + + if len(self.record.medsbj_code[0]) != "@": + for i in range(0, 60): + if len(self.record.medsbj_code[i]) > 0: + self.query_parameter['insert_trt_course_cd'] = self.record.medsbj_code[i] + self.queries.append(self.INSERT_INST_TRT_QUERY) + return + + def __make_upsert_spcare_query(self): + # 特養医務室の追加、更新 + if (self.record.dcf_prnt_inst_code == "00" or len(self.record.dcf_prnt_inst_code) == 0): + return + + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_SPCARE_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_INST_SSPCARE_QUERY) + return + + # 存在する場合はUpdate + if self.record.dcf_prnt_inst_code == "@": + self.query_parameter['dcf_prnt_inst_code'] = '' + self.query_parameter['delete_ymd'] = datetime.datetime.now().strftime('%Y%m%d') + else: + self.query_parameter['delete_ymd'] = '' + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py new file mode 100644 index 00000000..4838f9ee --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -0,0 +1,200 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInst(UltmarcTable): + """レイアウト区分101: COM_施設""" + dcfhp_id: str # 施設コード(レコードID) + dcfhp_code: str # 施設コード(施設コード) + dcfh_yobi: str # 施設コード(予備) + maint_flag: str # 修正区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + uncheck_flag: str # 未確認フラグ + hpdel_code: str # 削除予定理由 + duphp_id: str # 重複時相手先コード(レコードID) + duphp_code: str # 重複時相手先コード(施設コード) + duphp_yobi: str # 重複時相手先コード(予備) + hp_name: str # 正式施設名(漢字) + hp_name_kana: str # 正式施設名(カナ) + hp_ryaku_name: str # 略式施設名(漢字) + hp_ryaku_name_kana: str # 略式施設名(カナ) + hp_addr_lost_code: str # 住所不明 + pref_code: str # 住所コード(県コード) + city_code: str # 住所コード(市区町村コード) + addr_code1: str # 住所コード(大字・通称コード) + addr_code2: str # 住所コード(字・丁目コード) + hp_zip_code: str # 郵便番号 + hp_addr: str # 住所(漢字) + hp_addr_kana: str # 住所(カナ) + hp_addr_number: str # 住所表示番号 + dr_addr_kanji1: str # 住所カウント_漢字(県) + dr_addr_kanji2: str # 住所カウント_漢字(市区町村) + dr_addr_kanji3: str # 住所カウント_漢字(大字・通称) + dr_addr_kanji4: str # 住所カウント_漢字(字・丁目) + dr_addr_kana1: str # 住所カウント_カナ(県) + dr_addr_kana2: str # 住所カウント_カナ(市区町村) + dr_addr_kana3: str # 住所カウント_カナ(大字・通称) + dr_addr_kana4: str # 住所カウント_カナ(字・丁目) + tel_nothing_flag: str # 電話番号なしフラグ + hp_tel: str # 電話番号 + mgt_class_code: str # 経営体 + hp_class_code: str # 施設区分 + president_id: str # 代表者コード(レコードID) + president_code: str # 代表者コード(個人コード) + president_yobi: str # 代表者コード(予備) + president: str # 代表者(漢字) + president_kana: str # 代表者(カナ) + open_flag: str # 開業予定フラグ + open_year_month: str # 開業予定年月 + close_flag: str # 休院フラグ + close_year_month: str # 休院開始年月 + medsbj_code = [] # 診療科目1~60 + hp_kind_code: str # 病院種別 + reexam_flag: str # 再審査区分 + assoc_parrent_id: str # 関連大学親コード(レコードID) + assoc_parrent_code: str # 関連大学親コード(施設コード) + assoc_parrent_yobi: str # 関連大学親コード(予備) + close_flag2: str # 病棟閉鎖フラグ + bed_num: str # 病床数(定員) + bed_class_maint_date: str # 許可病床メンテ日付 + bed_num_sum: str # 許可病床数_合計 + bed_num_psy: str # 許可病床数_精神 + bed_num_tub: str # 許可病床数_結核 + bed_num_epi: str # 許可病床数_感染症 + bed_num_gen: str # 許可病床数_その他 + bed_num_gen2: str # 許可病床数_一般病床 + bed_num_rest: str # 許可病床数_療養病床 + inspect_code1: str # 検査項目_微生物 + inspect_code2: str # 検査項目_血清 + inspect_code3: str # 検査項目_血液 + inspect_code4: str # 検査項目_病理 + inspect_code5: str # 検査項目_寄生虫 + inspect_code6: str # 検査項目_生化 + inspect_code7: str # 検査項目_RI + dcfhp_92id: str # 特養医務室コード(レコードID) + dcfhp_92code: str # 特養医務室コード(施設コード) + dcfhp_92yobi: str # 特養医務室コード(予備) + + dcfdsf_inst_code: str # DCFDSF施設コード + univ_prnt_code: str # 関連大学親コード + inst_repre_code: str # 施設代表者コード + village_code: str # 町字コード + addr_cnt_kana: str # 住所カウントカナ + addr_cnt: str # 住所カウント + dup_opp_code: str # 重複時相手先コード + dcf_prnt_inst_code: str # DCF親施設コード + + delete_ymd: str # 削除年月日(COM_特養医務室データ) + insert_trt_course_cd: str # 診療科目コード(COM_施設診療科目) + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfh_yobi = record[3].strip() + self.maint_flag = record[4] + self.maint_date = record[5] + self.trn_date = record[6] + self.uncheck_flag = record[7].strip() + self.hpdel_code = record[8].strip() + self.duphp_id = record[9] + self.duphp_code = record[10].strip() + self.duphp_yobi = record[11].strip() + self.hp_name = record[12].strip() + self.hp_name_kana = record[13].strip() + self.hp_ryaku_name = record[14].strip() + self.hp_ryaku_name_kana = record[15].strip() + self.hp_addr_lost_code = record[16].strip() + self.pref_code = record[17].strip() + self.city_code = record[18].strip() + self.addr_code1 = record[19].strip() + self.addr_code2 = record[20].strip() + self.hp_zip_code = record[21].strip() + self.hp_addr = record[22] + self.hp_addr_kana = record[23] + self.hp_addr_number = record[24] + self.dr_addr_kanji1 = record[25].strip() + self.dr_addr_kanji2 = record[26].strip() + self.dr_addr_kanji3 = record[27].strip() + self.dr_addr_kanji4 = record[28].strip() + self.dr_addr_kana1 = record[29].strip() + self.dr_addr_kana2 = record[30].strip() + self.dr_addr_kana3 = record[31].strip() + self.dr_addr_kana4 = record[32].strip() + self.tel_nothing_flag = record[33].strip() + self.hp_tel = record[34].strip() + self.mgt_class_code = record[35].strip() + self.hp_class_code = record[36].strip() + self.president_id = record[37] + self.president_code = record[38].strip() + self.president_yobi = record[39] + self.president = record[40].strip() + self.president_kana = record[41].strip() + self.open_flag = record[42].strip() + self.open_year_month = record[43].strip() + self.close_flag = record[44].strip() + self.close_year_month = record[45].strip() + + # 診療科目1~60 + num = 46 + for i in range(0, 60): + self.medsbj_code[i] = record[num] + num += 1 + + self.hp_kind_code = record[106].strip() + self.reexam_flag = record[107].strip() + self.assoc_parrent_id = record[108].strip() + self.assoc_parrent_code = record[109].strip() + self.assoc_parrent_yobi = record[110].strip() + self.close_flag2 = record[111].strip() + self.bed_num = record[112].strip() + self.bed_class_maint_date = record[113].strip() + self.bed_num_sum = record[114].strip() + self.bed_num_psy = record[115].strip() + self.bed_num_tub = record[116].strip() + self.bed_num_epi = record[117].strip() + self.bed_num_gen = record[118].strip() + self.bed_num_gen2 = record[119].strip() + self.bed_num_rest = record[120].strip() + self.inspect_code1 = record[121].strip() + self.inspect_code2 = record[122].strip() + self.inspect_code3 = record[123].strip() + self.inspect_code4 = record[124].strip() + self.inspect_code5 = record[125].strip() + self.inspect_code6 = record[126].strip() + self.inspect_code7 = record[127].strip() + self.dcfhp_92id = record[128].strip() + self.dcfhp_92code = record[129].strip() + self.dcfhp_92yobi = record[130].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi + # 関連大学親コード + self.univ_prnt_code = self.assoc_parrent_id + self.assoc_parrent_code + self.assoc_parrent_yobi + # 施設代表者コード + self.inst_repre_code = self.president_id + self.president_code + self.president_yobi + # 町字コード + self.village_code = self.pref_code + self.city_code + self.addr_code1 + self.addr_code2 + # 住所カウントカナ + self.addr_cnt_kana = self.dr_addr_kana1 + self.dr_addr_kana2 + self.dr_addr_kana3 + self.dr_addr_kana4 + # 住所カウント + self.addr_cnt = self.dr_addr_kanji1 + self.dr_addr_kanji2 + self.dr_addr_kanji3 + self.dr_addr_kanji4 + # 重複時相手先コード + self.dup_opp_code = self.duphp_id + self.duphp_code + self.duphp_yobi + # DCF親施設コード + self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi + + # 住所カウント_漢字の0埋め + self.dr_addr_kanji1.zfill(2) + self.dr_addr_kanji2.zfill(2) + self.dr_addr_kanji3.zfill(2) + self.dr_addr_kanji4.zfill(2) + + # 住所カウント_カナの0埋め + self.dr_addr_kana1.zfill(2) + self.dr_addr_kana2.zfill(2) + self.dr_addr_kana3.zfill(2) + self.dr_addr_kana4.zfill(2) + + self.delete_ymd = '' + self.insert_trt_course_cd = '' From e7b19b4982bf41a30f8f4bdbfda56c6a739b90e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 2 May 2023 09:53:05 +0900 Subject: [PATCH 218/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_dr_mapper.py | 141 +++--------------- .../ultmarc/utmp_tables/tables/com_dr.py | 33 ++++ .../com_dr/db_com_dr_before_delete.csv | 1 - .../com_dr/db_com_dr_before_update.csv | 1 - .../table_mapper/com_dr/db_com_era_before.csv | 6 + .../expect_com_dr_trt_course_insert.csv | 2 - .../table_mapper/com_dr/test_com_dr_mapper.py | 41 ++++- 7 files changed, 99 insertions(+), 126 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py index f8317533..8eb248ad 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py @@ -166,12 +166,12 @@ class ComDrMapper(UltmarcTableMapper): """ # COM_医師診療科目の登録用SQL - INSERT_QUERY_TRT1 = """\ + INSERT_QUERY_TRT = """\ INSERT INTO src05.com_dr_trt_course ( trt_course_cd, - dcf_pcf_dr_cd, sequence, + dcf_pcf_dr_cd, regist_ymd, sys_regist_date, regist_prgm_id, @@ -179,105 +179,9 @@ class ComDrMapper(UltmarcTableMapper): update_prgm_id ) VALUES ( - :medsbj_code1, + {trt_course_code}, + {trt_sequence}, :dcf_pcf_dr_cd, - 1, - :execute_date_str_ymd, - :execute_datetime, - :program_name, - :execute_datetime, - :program_name - ) - """ - - INSERT_QUERY_TRT2 = """\ - INSERT INTO src05.com_dr_trt_course - ( - trt_course_cd, - dcf_pcf_dr_cd, - sequence, - regist_ymd, - sys_regist_date, - regist_prgm_id, - sys_update_date, - update_prgm_id - ) - VALUES ( - :medsbj_code2, - :dcf_pcf_dr_cd, - 2, - :execute_date_str_ymd, - :execute_datetime, - :program_name, - :execute_datetime, - :program_name - ) - """ - - INSERT_QUERY_TRT3 = """\ - INSERT INTO src05.com_dr_trt_course - ( - trt_course_cd, - dcf_pcf_dr_cd, - sequence, - regist_ymd, - sys_regist_date, - regist_prgm_id, - sys_update_date, - update_prgm_id - ) - VALUES ( - :medsbj_code3, - :dcf_pcf_dr_cd, - 3, - :execute_date_str_ymd, - :execute_datetime, - :program_name, - :execute_datetime, - :program_name - ) - """ - - INSERT_QUERY_TRT4 = """\ - INSERT INTO src05.com_dr_trt_course - ( - trt_course_cd, - dcf_pcf_dr_cd, - sequence, - regist_ymd, - sys_regist_date, - regist_prgm_id, - sys_update_date, - update_prgm_id - ) - VALUES ( - :medsbj_code4, - :dcf_pcf_dr_cd, - 4, - :execute_date_str_ymd, - :execute_datetime, - :program_name, - :execute_datetime, - :program_name - ) - """ - - INSERT_QUERY_TRT5 = """\ - INSERT INTO src05.com_dr_trt_course - ( - trt_course_cd, - dcf_pcf_dr_cd, - sequence, - regist_ymd, - sys_regist_date, - regist_prgm_id, - sys_update_date, - update_prgm_id - ) - VALUES ( - :medsbj_code5, - :dcf_pcf_dr_cd, - 5, :execute_date_str_ymd, :execute_datetime, :program_name, @@ -308,7 +212,7 @@ class ComDrMapper(UltmarcTableMapper): def __make_upsert_query(self): # 西暦の取得 - self.__year_get() + self.__set_era() # レコードの存在確認 record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) @@ -421,11 +325,8 @@ class ComDrMapper(UltmarcTableMapper): self.query_parameter['dr_addr_lost_code'] = '' # 住所 - if len(self.record.pref_code + self.record.city_code + self.record.addr_code1 + self.record.addr_code2 + - self.record.dr_zip_code + self.record.dr_addr + self.record.dr_addr_kana + self.record.dr_addr_num + - self.record.dr_addr_kanj_cnt1 + self.record.dr_addr_kanj_cnt2 + self.record.dr_addr_kanj_cnt3 + - self.record.dr_addr_kanj_cnt4 + self.record.dr_addr_kana_cnt1 + self.record.dr_addr_kana_cnt2 + - self.record.dr_addr_kana_cnt3 + self.record.dr_addr_kana_cnt4) > 0: + # 集合項目のいずれかに入力がある場合に更新 + if sum(len(item) for item in self.record.address_aggregation_items) > 0: set_clauses.append('home_addr_kana = :dr_addr_kana') set_clauses.append('home_addr = :dr_addr') set_clauses.append('home_postal_number = :dr_zip_code') @@ -487,25 +388,29 @@ class ComDrMapper(UltmarcTableMapper): return set_clauses def __make_delete_insert_trt_query(self): + # 診療科目(集合項目)のいずれかに入力がある場合 + if sum(len(item) for item in self.record.medsbj_code_items) == 0: + return + # 削除 self.queries.append(self.PHYSICAL_DELETE_QUERY_TRT) + # @マークの場合は、登録しない + if self.record.medsbj_code1 == '@': + return + # 登録 - if self.record.medsbj_code1 != '@': - if len(self.record.medsbj_code1) > 0: - self.queries.append(self.INSERT_QUERY_TRT1) - if len(self.record.medsbj_code2) > 0: - self.queries.append(self.INSERT_QUERY_TRT2) - if len(self.record.medsbj_code3) > 0: - self.queries.append(self.INSERT_QUERY_TRT3) - if len(self.record.medsbj_code4) > 0: - self.queries.append(self.INSERT_QUERY_TRT4) - if len(self.record.medsbj_code5) > 0: - self.queries.append(self.INSERT_QUERY_TRT5) + for num, m_code in enumerate(self.record.medsbj_code_items, start=1): + if len(m_code) > 0: + insert_trt_query = self.INSERT_QUERY_TRT.format( + trt_course_code=f':medsbj_code{num}', + trt_sequence=num + ) + self.queries.append(insert_trt_query) return - def __year_get(self): + def __set_era(self): # 西暦の取得 # 生年月日(西暦) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py index e621cb0e..13842737 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py @@ -73,6 +73,12 @@ class ComDr(UltmarcTable): era_cd: str # 元号コード + # 住所(集合項目) + address_aggregation_items: list + + # 診療科目(集合項目) + medsbj_code_items: list + def __init__(self, record: list[str]): super().__init__(record) self.dcfdr_id = record[1] @@ -148,3 +154,30 @@ class ComDr(UltmarcTable): self.grad_y = '' # 卒業年(西暦) self.drday_y = '' # 登録年(西暦) self.era_cd = '' # 元号コード + + # 住所(集合項目) + self.address_aggregation_items = [ + self.pref_code, + self.city_code, + self.addr_code1, + self.addr_code2, + self.dr_zip_code, + self.dr_addr_kana, + self.dr_addr_num, + self.dr_addr_kanj_cnt1, + self.dr_addr_kanj_cnt2, + self.dr_addr_kanj_cnt3, + self.dr_addr_kanj_cnt4, + self.dr_addr_kana_cnt1, + self.dr_addr_kana_cnt2, + self.dr_addr_kana_cnt3, + self.dr_addr_kana_cnt4 + ] + + # 診療科目(集合項目) + self.medsbj_code_items = [ + self.medsbj_code1, + self.medsbj_code2, + self.medsbj_code3, + self.medsbj_code4, + self.medsbj_code5] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv index f6baf695..6afe1981 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_delete.csv @@ -5,4 +5,3 @@ "0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6−3−301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" "0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","NULL","NULL","NULL","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" "0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2−8−30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1","","","NULL","","0148106500","1","","","","","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/11 21:20:37","clsComDrInfo" - diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv index 0a6ea96a..9b043d87 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv @@ -7,4 +7,3 @@ "0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "0199961300","フジタ アカネ","藤田 茜","","","","","NULL","99","","","NULL","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","NULL","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "9999999990","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" - diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv new file mode 100644 index 00000000..c11243ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_era_before.csv @@ -0,0 +1,6 @@ +era_cd","era_name","year","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","明治","1867","2014/10/24 11:29:55","INIT ","2014/10/24 11:29:55","INIT ","2014/10/24 11:29:55","INIT","2014/10/24 11:29:55","INIT" +"2","大正","1911","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT","2014/10/24 11:29:56","INIT" +"3","昭和","1925","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT ","2014/10/24 11:29:56","INIT","2014/10/24 11:29:56","INIT" +"4","平成","1988","2014/10/24 11:29:57","INIT ","2014/10/24 11:29:57","INIT ","2014/10/24 11:29:57","INIT","2014/10/24 11:29:57","INIT" +"5","令和","2018","2019/05/07 10:27:29","dwh_supp","2019/05/07 10:27:29","dwh_supp","2019/05/07 10:27:29","dwh_support","2019/05/07 10:27:29","dwh_support" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv index 06ef8f21..eb819263 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_insert.csv @@ -21,5 +21,3 @@ "L01","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" "L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 16:16:43","com_dr_mapper","2017/10/08 16:16:43","com_dr_mapper" "L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" - - diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py index 9872cd6b..dd533e17 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -28,13 +28,13 @@ class TestComDrMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): @@ -58,9 +58,11 @@ class TestComDrMapper: self.db.execute(delete_sql, delete_parameter) delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) # テストデータをDBに登録 # DBデータを読み込む(医師診察科目) - test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_insert.csv')) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_insert.csv')) for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_dr_trt_course', @@ -68,6 +70,15 @@ class TestComDrMapper: test_data.values() ) self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) # Act for line_number, line in enumerate(test_dat_file, start=1): @@ -147,6 +158,8 @@ class TestComDrMapper: self.db.execute(delete_sql, delete_parameter) delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) # テストデータをDBに登録 # DBデータを読み込む(医師) test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_update.csv')) @@ -158,7 +171,7 @@ class TestComDrMapper: ) self.db.execute(insert_sql, insert_parameter) # DBデータを読み込む(医師診察科目) - test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_update.csv')) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_trt_course_before_update.csv')) for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( 'src05.com_dr_trt_course', @@ -166,6 +179,15 @@ class TestComDrMapper: test_data.values() ) self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) # Act for line_number, line in enumerate(test_dat_file, start=1): @@ -247,6 +269,8 @@ class TestComDrMapper: self.db.execute(delete_sql, delete_parameter) delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_trt_course', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_era', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) # テストデータをDBに登録 # DBデータを読み込む(医師) test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_before_delete.csv')) @@ -266,6 +290,15 @@ class TestComDrMapper: test_data.values() ) self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(年号) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_era_before.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_era', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) # Act for line_number, line in enumerate(test_dat_file, start=1): From 091837fe68a4fa570f0eefe92f1a196d496c5126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 2 May 2023 13:22:37 +0900 Subject: [PATCH 219/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/laundering/mst_inst_laundering.py | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 3c870328..51a56697 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -25,8 +25,6 @@ def exec(): _truncate_mst_inst(db) # fcl_mst_vから、mst_instへInsert _insert_mst_inst_from_fcl_mst_v(db) - # オプティマイザのderived_mergeフラグをoffにする - _set_optimizer_derived_merge_off(db) # com_instから、mst_instへInsert _insert_mst_inst_from_com_inst(db) logger.debug('メルク施設マスタ作成処理終了') @@ -73,17 +71,17 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): SELECT fmv1.v_inst_cd, CASE - WHEN fmv1.fcl_type IN ('A1','A0') THEN '3' + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN '3' WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' END AS inst_clas_cd, fmv1.fcl_name, fmv1.fcl_abb_name, fmv1.prft_cd, - RIGHT(fmv1.admin_kbn,3), + RIGHT(fmv1.admin_kbn, 3), mp.prefc_name, - LEFT(mc.city_name,40), + LEFT(mc.city_name, 40), CASE - WHEN fmv1.fcl_type IN ('A1','A0') THEN LEFT(fmv1.fmt_addr, 200) + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN LEFT(fmv1.fmt_addr, 200) WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) END AS address, fmv1.postal_cd, @@ -108,10 +106,10 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): LEFT OUTER JOIN src05.mst_prefc AS mp ON fmv1.prft_cd = mp.prefc_cd LEFT OUTER JOIN src05.mst_city AS mc - ON LEFT(fmv1.admin_kbn,2) = mc.prefc_cd - AND RIGHT(fmv1.admin_kbn,3) = mc.city_cd + ON LEFT(fmv1.admin_kbn, 2) = mc.prefc_cd + AND RIGHT(fmv1.admin_kbn, 3) = mc.city_cd WHERE - ((fmv1.fcl_type IN ('A1','A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') + ((fmv1.fcl_type IN ('A1', 'A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') AND fmv1.rec_sts_kbn != '9' """ res = db.execute(sql) @@ -124,19 +122,18 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): return -def _set_optimizer_derived_merge_off(db: Database): +def _insert_mst_inst_from_com_inst(db: Database): # オプティマイザのderived_mergeフラグをoffにする try: sql = """ SET SESSION optimizer_switch = 'derived_merge=off' """ db.execute(sql) + logger.info("オプティマイザのderived_mergeフラグ = Off") except Exception as e: logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") raise e - -def _insert_mst_inst_from_com_inst(db: Database): # com_instから、mst_instへInsert try: elapsed_time = ElapsedTime() @@ -200,7 +197,7 @@ def _insert_mst_inst_from_com_inst(db: Database): ON ci.manage_cd = cm.manage_cd LEFT OUTER JOIN src05.com_inst_div AS cid ON ci.inst_div_cd = cid.inst_div_cd - LEFT OUTER JOIN ( + LEFT OUTER JOIN ( -- MDBコード変換表を使用してV施設コードを取得するためのテーブル結合 SELECT mcmv4.* FROM ( @@ -211,21 +208,21 @@ def _insert_mst_inst_from_com_inst(db: Database): INNER JOIN ( SELECT mcmv2.hco_vid_v, - MAX(mcmv2.sub_num) AS sno + MAX(mcmv2.sub_num) AS sno -- MDBコード変換データの枝番MAX FROM src05.mdb_cnv_mst_v mcmv2 WHERE - mcmv2.rec_sts_kbn != '9' + mcmv2.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 AND src05.get_syor_date() >= mcmv2.start_date GROUP BY mcmv2.hco_vid_v ) AS mcmv3 ON mcmv1.hco_vid_v = mcmv3.hco_vid_v AND mcmv1.sub_num = mcmv3.sno - ) mcmv4 + ) AS mcmv4 INNER JOIN ( SELECT - MIN(mcmv8.hco_vid_v) AS hvv, + MIN(mcmv8.hco_vid_v) AS hvv, -- 1つのMDBコードに対し、複数のV施設コードが割り当てられている場合、最小のV施設コードを選択する mcmv8.mdb_cd FROM ( SELECT @@ -235,11 +232,11 @@ def _insert_mst_inst_from_com_inst(db: Database): INNER JOIN ( SELECT mcmv6.hco_vid_v, - MAX(mcmv6.SUB_NUM) AS sno + MAX(mcmv6.sub_num) AS sno -- MDBコード変換データの枝番MAX FROM src05.mdb_cnv_mst_v AS mcmv6 WHERE - mcmv6.rec_sts_kbn != '9' + mcmv6.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 AND src05.get_syor_date() >= mcmv6.start_date GROUP BY mcmv6.hco_vid_v From a92191adb1993343d85e4362099f5dc0c96480f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 2 May 2023 14:02:13 +0900 Subject: [PATCH 220/962] =?UTF-8?q?=E4=BD=9C=E6=A5=AD=E4=B8=AD=EF=BC=88?= =?UTF-8?q?=E4=B8=80=E6=99=82=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_inst_mapper.py | 175 ++++---- .../ultmarc/utmp_tables/tables/com_inst.py | 33 +- .../table_mapper/com_inst/__init__.py | 0 .../table_mapper/com_inst/com_inst_delete.csv | 0 .../table_mapper/com_inst/com_inst_insert.csv | 1 + .../table_mapper/com_inst/com_inst_update.csv | 0 .../com_inst/db_com_inst_before_delete.csv | 0 .../com_inst/db_com_inst_before_update.csv | 0 .../com_inst/expect_com_inst_delete.csv | 0 .../com_inst/expect_com_inst_insert.csv | 2 + .../com_inst/expect_com_inst_update.csv | 0 .../com_inst/expect_com_spcare_insert.csv | 2 + .../com_inst/expect_com_trt_insert.csv | 61 +++ .../com_inst/test_com_inst_mapper.py | 391 ++++++++++++++++++ 14 files changed, 564 insertions(+), 101 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index e989677d..a839eff6 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -1,7 +1,6 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst -import datetime class ComInstMapper(UltmarcTableMapper): @@ -79,55 +78,55 @@ class ComInstMapper(UltmarcTableMapper): update_prgm_id ) VALUES ( - dcfdsf_inst_code, - hp_class_code, - hp_addr_lost_code, - hp_name_kana, - hp_ryaku_name_kana, - hp_name, - hp_ryaku_name, - univ_prnt_code, - bed_num, - close_flag, - open_flag, - close_year_month, - open_year_month, - close_flag2, - inst_repre_code, - president_kana, - president, - tel_nothing_flag, - uncheck_flag, - hp_tel, - hp_addr_kana, - hp_addr, - hp_zip_code, - village_code, - pref_code, - city_code, - hp_addr_number, - addr_cnt_kana, - addr_cnt, - mgt_class_code, - hpdel_code, - hp_kind_code, - dup_opp_code, - inspect_code1, - inspect_code2, - inspect_code3, - inspect_code4, - inspect_code5, - inspect_code6, - inspect_code7, - reexam_flagc, - bed_num_gen, - bed_num_psy, - bed_num_tub, - bed_num_epi, - bed_num_sum, - bed_num_gen2, - bed_num_rest, - bed_class_maint_date, + :dcfdsf_inst_code, + :hp_class_code, + :hp_addr_lost_code, + :hp_name_kana, + :hp_ryaku_name_kana, + :hp_name, + :hp_ryaku_name, + :univ_prnt_code, + :bed_num, + :close_flag, + :open_flag, + :close_year_month, + :open_year_month, + :close_flag2, + :inst_repre_code, + :president_kana, + :president, + :tel_nothing_flag, + :uncheck_flag, + :hp_tel, + :hp_addr_kana, + :hp_addr, + :hp_zip_code, + :village_code, + :pref_code, + :city_code, + :hp_addr_number, + :addr_cnt_kana, + :addr_cnt, + :mgt_class_code, + :hpdel_code, + :hp_kind_code, + :dup_opp_code, + :inspect_code1, + :inspect_code2, + :inspect_code3, + :inspect_code4, + :inspect_code5, + :inspect_code6, + :inspect_code7, + :reexam_flag, + :bed_num_gen, + :bed_num_psy, + :bed_num_tub, + :bed_num_epi, + :bed_num_sum, + :bed_num_gen2, + :bed_num_rest, + :bed_class_maint_date, 1, NULL, 0, @@ -177,7 +176,7 @@ class ComInstMapper(UltmarcTableMapper): ) VALUES ( :dcfdsf_inst_code, - :insert_trt_course_cd, + {trt_course_cd}, :execute_date_str_ymd, :execute_datetime, :program_name, @@ -205,13 +204,13 @@ class ComInstMapper(UltmarcTableMapper): """ # データ更新用SQL(COM_特養医務室) - UPDATE_SSPCARE_QUERY = """\ + UPDATE_SPCARE_QUERY = """\ UPDATE src05.com_spcare_med_office_dat SET dcf_prnt_inst_cd = :dcf_prnt_inst_code, update_ymd = :execute_date_str_ymd, - delete_ymd = :delete_ymd, + delete_ymd = :execute_date_str_ymd, sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE @@ -219,7 +218,7 @@ class ComInstMapper(UltmarcTableMapper): """ # データ登録用SQL(COM_特養医務室) - INSERT_INST_SSPCARE_QUERY = """\ + INSERT_SPCARE_QUERY = """\ INSERT INTO src05.com_spcare_med_office_dat ( dcf_chld_inst_cd, @@ -258,23 +257,23 @@ class ComInstMapper(UltmarcTableMapper): return # 追加、更新の場合 - self.queries.append(self.__make_upsert_query()) + self.__make_upsert_query() return def __make_upsert_query(self): - # レコードの存在確認 + # レコードの存在確認(施設) record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) - # 存在しない場合はInsert if record_count[0]['count_num'] == 0: + # 存在しない場合はInsert self.queries.append(self.INSERT_INST_QUERY) - - # 存在する場合はUpdate(施設) - self.__make_update_query() + else: + # 存在する場合はUpdate(施設) + self.__make_update_query() # 施設診療科目の削除挿入 self.__make_delete_insert_trt_query - # 特養医務室の追加、更新 + # 特養医務室の追加更新 self.__make_upsert_spcare_query return @@ -315,17 +314,10 @@ class ComInstMapper(UltmarcTableMapper): if len(self.record.hp_zip_code) > 0: set_clauses.append('postal_number = :hp_zip_code') -# <<<<< 住所関連不明 >>>>>> - # 町字コード - if len(self.record.village_code) > 0: + # 町字コード・都道府県コード・市区町村コード + if len(self.record.village_code + self.record.pref_code + self.record.city_code) > 0: set_clauses.append('village_cd = :village_code') - - # 都道府県コード - if len(self.record.pref_code) > 0: set_clauses.append('prefc_cd = :pref_code') - - # 市区町村コード - if len(self.record.city_code) > 0: set_clauses.append('city_cd = :city_code') # 住所カウント @@ -333,16 +325,14 @@ class ComInstMapper(UltmarcTableMapper): set_clauses.append('addr_cnt_kana = :addr_cnt_kana') set_clauses.append('addr_cnt = :addr_cnt') - # 住所表示番号@いるの? + # 住所表示番号 if len(self.record.hp_addr_number) > 0: set_clauses.append('addr_display_number = :hp_addr_number') - # 経営体コード@いるの? + # 経営体コード if len(self.record.mgt_class_code) > 0: set_clauses.append('manage_cd = :mgt_class_code') -# <<<<< 住所関連不明 >>>>>> - # 病院種別 if len(self.record.hp_kind_code) > 0: set_clauses.append('hp_assrt_cd = :hp_kind_code') @@ -446,9 +436,7 @@ class ComInstMapper(UltmarcTableMapper): self.query_parameter['bed_class_maint_date'] = '' # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) - # <<<<< 後で書き直そう >>>>>>>>> - if len(self.record.bed_num_sum + self.record.bed_num_psy + self.record.bed_num_tub + self.record.bed_num_epi + - self.record.bed_num_gen + self.record.bed_num_gen2 + self.record.bed_num_rest) > 0: + if sum(len(item) for item in self.record.prmit_bed) > 0: set_clauses.append('prmit_bed_num_sum = :bed_num_sum') set_clauses.append('prmit_bed_num_mental = :bed_num_psy') set_clauses.append('prmit_bed_num_tuber = :bed_num_tub') @@ -466,9 +454,7 @@ class ComInstMapper(UltmarcTableMapper): self.query_parameter['bed_num_rest'] = '' # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) - # <<<<< 後で書き直そう >>>>>>>>> - if len(self.record.inspect_code1 + self.record.inspect_code2 + self.record.inspect_code3 + self.record.inspect_code4 + - self.record.inspect_code5 + self.record.inspect_code6 + self.record.inspect_code7) > 0: + if sum(len(item) for item in self.record.insp_item) > 0: set_clauses.append('insp_item_micrb = :inspect_code1') set_clauses.append('insp_item_serum = :inspect_code2') set_clauses.append('insp_item_blood = :inspect_code3') @@ -500,23 +486,23 @@ class ComInstMapper(UltmarcTableMapper): def __make_delete_insert_trt_query(self): # 施設診療科目の削除挿入 - delins_flg = False - for i in range(0, 60): - if len(self.record.medsbj_code[i]) > 0: - delins_flg = True - break - - if not delins_flg: + if sum(len(item) for item in self.record.medsbj_code) == 0: return # 削除 self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY) - if len(self.record.medsbj_code[0]) != "@": - for i in range(0, 60): - if len(self.record.medsbj_code[i]) > 0: - self.query_parameter['insert_trt_course_cd'] = self.record.medsbj_code[i] - self.queries.append(self.INSERT_INST_TRT_QUERY) + if len(self.record.medsbj_code[0]) == "@": + return + + # 診療科目1~60 + for medsbj_code in self.record.medsbj_code: + if len(medsbj_code) > 0: + insert_query = self.INSERT_INST_TRT_QUERY.format( + trt_course_cd=medsbj_code + ) + self.queries.append(insert_query) + return def __make_upsert_spcare_query(self): @@ -528,14 +514,15 @@ class ComInstMapper(UltmarcTableMapper): record_count = self.db.execute_select(self.RECORD_EXISTS_SPCARE_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: - self.queries.append(self.INSERT_INST_SSPCARE_QUERY) + self.queries.append(self.INSERT_SPCARE_QUERY) return # 存在する場合はUpdate if self.record.dcf_prnt_inst_code == "@": self.query_parameter['dcf_prnt_inst_code'] = '' - self.query_parameter['delete_ymd'] = datetime.datetime.now().strftime('%Y%m%d') else: self.query_parameter['delete_ymd'] = '' + self.queries.append(self.UPDATE_SPCARE_QUERY) + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py index 4838f9ee..34fc826d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -48,7 +48,7 @@ class ComInst(UltmarcTable): open_year_month: str # 開業予定年月 close_flag: str # 休院フラグ close_year_month: str # 休院開始年月 - medsbj_code = [] # 診療科目1~60 + medsbj_code: list # 診療科目1~60 hp_kind_code: str # 病院種別 reexam_flag: str # 再審査区分 assoc_parrent_id: str # 関連大学親コード(レコードID) @@ -84,8 +84,8 @@ class ComInst(UltmarcTable): dup_opp_code: str # 重複時相手先コード dcf_prnt_inst_code: str # DCF親施設コード - delete_ymd: str # 削除年月日(COM_特養医務室データ) - insert_trt_course_cd: str # 診療科目コード(COM_施設診療科目) + prmit_bed: list # 許可ベッド(集合項目) + insp_item: list # 検査項目(集合項目) def __init__(self, record: list[str]): super().__init__(record) @@ -135,10 +135,10 @@ class ComInst(UltmarcTable): self.close_flag = record[44].strip() self.close_year_month = record[45].strip() - # 診療科目1~60 + # 診療科目1~60(csvカラム番号 46 ~ 105) num = 46 for i in range(0, 60): - self.medsbj_code[i] = record[num] + self.medsbj_code = [record[num]] num += 1 self.hp_kind_code = record[106].strip() @@ -196,5 +196,24 @@ class ComInst(UltmarcTable): self.dr_addr_kana3.zfill(2) self.dr_addr_kana4.zfill(2) - self.delete_ymd = '' - self.insert_trt_course_cd = '' + # 許可ベッド(集合項目) + self.prmit_bed = [ + self.bed_num_sum, + self.bed_num_psy, + self.bed_num_tub, + self.bed_num_epi, + self.bed_num_gen, + self.bed_num_gen2, + self.bed_num_rest + ] + + # 検査項目(集合項目) + self.insp_item = [ + self.inspect_code1, + self.inspect_code2, + self.inspect_code3, + self.inspect_code4, + self.inspect_code5, + self.inspect_code6, + self.inspect_code7 + ] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv new file mode 100644 index 00000000..5fed0c67 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv @@ -0,0 +1 @@ +"101","22","33333","44","A","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv new file mode 100644 index 00000000..88bf2163 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv @@ -0,0 +1,2 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv new file mode 100644 index 00000000..db6f2bd4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv @@ -0,0 +1,2 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"293031","20230427NULLNULL","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv new file mode 100644 index 00000000..133e9b9f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv @@ -0,0 +1,61 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py new file mode 100644 index 00000000..3dd1f2bb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -0,0 +1,391 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstMapper: + """レイアウト区分101: COM_施設""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup', + 'regist_ymd', + 'sys_regist_date', + 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_insert.csv')) + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_施設テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(施設) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(施設診療科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(特養医務室) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_spcare_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_spcare_med_office_dat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_update.csv')) + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_施設テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む(施設) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(施設診療科目) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + # DBデータを読み込む(特養医務室) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_spcare_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_spcare_med_office_dat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む(施設) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(施設診療科目) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_inst_trt_course + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND trt_course_cd = :trt_course_cd\ + """ + for primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_trt_course_cd): + sp_trt_data = self.db.execute_select( + sp_field_select_sql, + {**primary_keys_dcf_dsf_inst_cd, **primary_keys_trt_course_cd}) + assert len(sp_trt_data) == 1, '1件取得できていること' + actual_data_list.append(sp_trt_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + # 期待値ファイルを読み込む(特養医務室データ) + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_delete.csv')) + primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From e8d6d0ca1387b97b061a49d2ab56a80783f22a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 2 May 2023 14:03:35 +0900 Subject: [PATCH 221/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 51a56697..bbaa5fd0 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -129,7 +129,7 @@ def _insert_mst_inst_from_com_inst(db: Database): SET SESSION optimizer_switch = 'derived_merge=off' """ db.execute(sql) - logger.info("オプティマイザのderived_mergeフラグ = Off") + logger.debug("オプティマイザのderived_mergeフラグ = Off") except Exception as e: logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") raise e From 61815cebe452131c04e7ef58df28b2345dcb399f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 8 May 2023 14:52:48 +0900 Subject: [PATCH 222/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E5=AE=8C?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_dr_mapper.py | 12 +- .../table_mapper/concrete/com_inst_mapper.py | 63 ++++----- .../ultmarc/utmp_tables/tables/com_dr.py | 4 +- .../ultmarc/utmp_tables/tables/com_inst.py | 38 ++++-- .../table_mapper/com_dr/com_dr_update.csv | 1 + .../com_dr/db_com_dr_before_update.csv | 1 + .../db_com_dr_trt_course_before_update.csv | 1 + .../expect_com_dr_trt_course_update.csv | 3 + .../table_mapper/com_dr/test_com_dr_mapper.py | 22 +-- .../table_mapper/com_inst/com_inst_delete.csv | 5 + .../table_mapper/com_inst/com_inst_insert.csv | 8 +- .../table_mapper/com_inst/com_inst_update.csv | 10 ++ .../com_inst/db_com_inst_before_delete.csv | 8 ++ .../com_inst/db_com_inst_before_update.csv | 11 ++ .../com_inst/db_com_spcare_before_delete.csv | 4 + .../com_inst/db_com_spcare_before_update.csv | 5 + .../com_inst/db_com_trt_before_delete.csv | 66 +++++++++ .../com_inst/db_com_trt_before_update.csv | 48 +++++++ .../com_inst/expect_com_inst_delete.csv | 8 ++ .../com_inst/expect_com_inst_insert.csv | 8 +- .../com_inst/expect_com_inst_update.csv | 11 ++ .../com_inst/expect_com_spcare_delete.csv | 4 + .../com_inst/expect_com_spcare_insert.csv | 3 +- .../com_inst/expect_com_spcare_update.csv | 7 + .../com_inst/expect_com_trt_delete.csv | 66 +++++++++ .../com_inst/expect_com_trt_insert.csv | 58 +++++++- .../com_inst/expect_com_trt_update.csv | 66 +++++++++ .../com_inst/test_com_inst_mapper.py | 129 ++++++++++++++---- 28 files changed, 574 insertions(+), 96 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py index 8eb248ad..ac2bd53a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py @@ -94,7 +94,7 @@ class ComDrMapper(UltmarcTableMapper): :addr_cnt, :medassoci_code, :pract_class_code, - :sexc_ode, + :sex_code, :drdel_code, :dr_addr_lost_code, :graduniv_code, @@ -224,15 +224,15 @@ class ComDrMapper(UltmarcTableMapper): return # 存在する場合ではUpdate + # COM_医師診療科目 削除登録 + self.__make_delete_insert_trt_query() + update_columns = ','.join(self.__make_update_query()) # 何も更新項目が無い場合はNoneとする(更新処理は行わない) if len(update_columns) == 0: self.queries.append(None) return else: - # COM_医師診療科目 削除登録 - self.__make_delete_insert_trt_query() - # 末尾にカンマを付けてSET句を完成させる update_columns += ',' update_query = self.UPDATE_QUERY.format( @@ -265,8 +265,8 @@ class ComDrMapper(UltmarcTableMapper): set_clauses.append('dr_name_kana = :dr_name_kana') # 性別 - if len(self.record.sexc_ode) > 0: - set_clauses.append('sex_cd = :sexc_ode') + if len(self.record.sex_code) > 0: + set_clauses.append('sex_cd = :sex_code') # 生年月日 if len(self.record.birthday_era + self.record.birthday_year + self.record.birthday_month + self.record.birthday_day) > 0: diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index 69f83ad4..901d2b9b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -147,7 +147,7 @@ class ComInstMapper(UltmarcTableMapper): sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE - dcf_pcf_dr_cd = :dcfdsf_inst_code + dcf_dsf_inst_cd = :dcfdsf_inst_code """ # 修正区分が「C(削除)」の場合の更新SQL @@ -190,7 +190,7 @@ class ComInstMapper(UltmarcTableMapper): DELETE FROM src05.com_inst_trt_course WHERE - dcf_pcf_dr_cd = :dcf_pcf_dr_cd + dcf_dsf_inst_cd = :dcfdsf_inst_code """ # レコード存在確認SQL(COM_特養医務室) @@ -200,7 +200,7 @@ class ComInstMapper(UltmarcTableMapper): FROM src05.com_spcare_med_office_dat WHERE - dcf_dsf_inst_cd = :dcfdsf_inst_code + dcf_chld_inst_cd = :dcfdsf_inst_code """ # データ更新用SQL(COM_特養医務室) @@ -208,11 +208,11 @@ class ComInstMapper(UltmarcTableMapper): UPDATE src05.com_spcare_med_office_dat SET - dcf_prnt_inst_cd = : dcf_prnt_inst_code, - update_ymd = : execute_date_str_ymd, - delete_ymd = : execute_date_str_ymd, - sys_update_date = : execute_datetime, - update_prgm_id = : program_name + dcf_prnt_inst_cd = :dcf_prnt_inst_code, + update_ymd = :execute_date_str_ymd, + delete_ymd = :delete_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name WHERE dcf_chld_inst_cd = :dcfdsf_inst_code """ @@ -271,10 +271,10 @@ class ComInstMapper(UltmarcTableMapper): self.__make_update_query() # 施設診療科目の削除挿入 - self.__make_delete_insert_trt_query + self.__make_delete_insert_trt_query() # 特養医務室の追加更新 - self.__make_upsert_spcare_query + self.__make_upsert_spcare_query() return @@ -291,7 +291,7 @@ class ComInstMapper(UltmarcTableMapper): set_clauses.append('form_inst_name_kana = :hp_name_kana') # 略式施設名(カナ) - if len(self.record.hp_name_kana) > 0: + if len(self.record.hp_ryaku_name_kana) > 0: set_clauses.append('inst_name_kana = :hp_ryaku_name_kana') # 正式施設名(漢字) @@ -299,8 +299,8 @@ class ComInstMapper(UltmarcTableMapper): set_clauses.append('form_inst_name_kanji = :hp_name') # 略式施設名(漢字) - if len(self.record.hp_ryaku_name_kana) > 0: - set_clauses.append('inst_name_kanji = :hp_ryaku_name_kana') + if len(self.record.hp_ryaku_name) > 0: + set_clauses.append('inst_name_kanji = :hp_ryaku_name') # 施設住所カナ if len(self.record.hp_addr_kana) > 0: @@ -356,7 +356,7 @@ class ComInstMapper(UltmarcTableMapper): # 重複時相手先コード if len(self.record.dup_opp_code) > 0: set_clauses.append('dup_opp_cd = :dup_opp_code') - if self.record.dup_opp_code == '@': + if self.record.duphp_id == '@': self.query_parameter['dup_opp_code'] = '' # 住所不明理由コード @@ -380,7 +380,7 @@ class ComInstMapper(UltmarcTableMapper): # 施設代表者コード if len(self.record.inst_repre_code) > 0: set_clauses.append('inst_repre_cd = :inst_repre_code') - if self.record.inst_repre_code == '@': + if self.record.president_id == '@': self.query_parameter['inst_repre_code'] = '' # 代表者(カナ) @@ -414,7 +414,7 @@ class ComInstMapper(UltmarcTableMapper): # 関連大学親コード if len(self.record.univ_prnt_code) > 0: set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code') - if self.record.univ_prnt_code == '@': + if self.record.assoc_parrent_id == '@': self.query_parameter['univ_prnt_code'] = '' # 病棟閉鎖フラグ @@ -424,10 +424,10 @@ class ComInstMapper(UltmarcTableMapper): self.query_parameter['close_flag2'] = '' # 病床数(定員) - if len(self.record.bed_num) > 0: + if self.record.bed_num is not None: set_clauses.append('bed_num = :bed_num') if self.record.bed_num == '@': - self.query_parameter['bed_num'] = '' + self.query_parameter['bed_num'] = None # 許可病床メンテ日付 if len(self.record.bed_class_maint_date) > 0: @@ -436,7 +436,7 @@ class ComInstMapper(UltmarcTableMapper): self.query_parameter['bed_class_maint_date'] = '' # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) - if sum(len(item) for item in self.record.prmit_bed) > 0: + if not self.record.prmit_bed.count(None) == len(self.record.prmit_bed): set_clauses.append('prmit_bed_num_sum = :bed_num_sum') set_clauses.append('prmit_bed_num_mental = :bed_num_psy') set_clauses.append('prmit_bed_num_tuber = :bed_num_tub') @@ -445,13 +445,13 @@ class ComInstMapper(UltmarcTableMapper): set_clauses.append('prmit_bed_num_gen = :bed_num_gen2') set_clauses.append('prmit_bed_num_rcup = :bed_num_rest') if self.record.bed_num_sum == '@': - self.query_parameter['bed_num_sum'] = '' - self.query_parameter['bed_num_psy'] = '' - self.query_parameter['bed_num_tub'] = '' - self.query_parameter['bed_num_epi'] = '' - self.query_parameter['bed_num_gen'] = '' - self.query_parameter['bed_num_gen2'] = '' - self.query_parameter['bed_num_rest'] = '' + self.query_parameter['bed_num_sum'] = None + self.query_parameter['bed_num_psy'] = None + self.query_parameter['bed_num_tub'] = None + self.query_parameter['bed_num_epi'] = None + self.query_parameter['bed_num_gen'] = None + self.query_parameter['bed_num_gen2'] = None + self.query_parameter['bed_num_rest'] = None # 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI) if sum(len(item) for item in self.record.insp_item) > 0: @@ -474,6 +474,7 @@ class ComInstMapper(UltmarcTableMapper): update_columns = ','.join(set_clauses) # 何も更新項目が無い場合は更新処理は行わない if len(update_columns) == 0: + self.queries.append(None) return else: update_columns += ',' @@ -492,17 +493,16 @@ class ComInstMapper(UltmarcTableMapper): # 削除 self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY) - if len(self.record.medsbj_code[0]) == "@": + if self.record.medsbj_code[0] == "@": return # 診療科目1~60 for medsbj_code in self.record.medsbj_code: if len(medsbj_code) > 0: insert_query = self.INSERT_INST_TRT_QUERY.format( - trt_course_cd=medsbj_code + trt_course_cd="'" + medsbj_code + "'" ) self.queries.append(insert_query) - return def __make_upsert_spcare_query(self): @@ -518,10 +518,11 @@ class ComInstMapper(UltmarcTableMapper): return # 存在する場合はUpdate - if self.record.dcf_prnt_inst_code == "@": + if self.record.dcfhp_92id == "@": self.query_parameter['dcf_prnt_inst_code'] = '' + self.query_parameter['delete_ymd'] = self.query_parameter['execute_date_str_ymd'] else: - self.query_parameter['delete_ymd'] = '' + self.query_parameter['delete_ymd'] = None self.queries.append(self.UPDATE_SPCARE_QUERY) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py index 13842737..0377774a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr.py @@ -15,7 +15,7 @@ class ComDr(UltmarcTable): reptdr_yobi: str # 重複時相手先コード(予備) dr_name: str # 医師名(漢字) dr_name_kana: str # 医師名(カナ) - sexc_ode: str # 性別 + sex_code: str # 性別 birthday_era: str # 生年月日(元号) birthday_year: str # 生年月日(年) birthday_month: str # 生年月日(月) @@ -93,7 +93,7 @@ class ComDr(UltmarcTable): self.reptdr_yobi = record[10].strip() self.dr_name = record[11].strip() self.dr_name_kana = record[12].strip() - self.sexc_ode = record[13].strip() + self.sex_code = record[13].strip() self.birthday_era = record[14].strip() self.birthday_year = record[15].strip() self.birthday_month = record[16].strip() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py index 34fc826d..954afa88 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -137,8 +137,9 @@ class ComInst(UltmarcTable): # 診療科目1~60(csvカラム番号 46 ~ 105) num = 46 + self.medsbj_code = [] for i in range(0, 60): - self.medsbj_code = [record[num]] + self.medsbj_code.append(str(record[num])) num += 1 self.hp_kind_code = record[106].strip() @@ -156,6 +157,17 @@ class ComInst(UltmarcTable): self.bed_num_gen = record[118].strip() self.bed_num_gen2 = record[119].strip() self.bed_num_rest = record[120].strip() + + # smallint対策 + self.bed_num = self.bed_num if len(self.bed_num) > 0 else None + self.bed_num_sum = self.bed_num_sum if len(self.bed_num_sum) > 0 else None + self.bed_num_psy = self.bed_num_psy if len(self.bed_num_psy) > 0 else None + self.bed_num_tub = self.bed_num_tub if len(self.bed_num_tub) > 0 else None + self.bed_num_epi = self.bed_num_epi if len(self.bed_num_epi) > 0 else None + self.bed_num_gen = self.bed_num_gen if len(self.bed_num_gen) > 0 else None + self.bed_num_gen2 = self.bed_num_gen2 if len(self.bed_num_gen2) > 0 else None + self.bed_num_rest = self.bed_num_rest if len(self.bed_num_rest) > 0 else None + self.inspect_code1 = record[121].strip() self.inspect_code2 = record[122].strip() self.inspect_code3 = record[123].strip() @@ -167,6 +179,18 @@ class ComInst(UltmarcTable): self.dcfhp_92code = record[129].strip() self.dcfhp_92yobi = record[130].strip() + # 住所カウント_漢字の0埋め + self.dr_addr_kanji1 = self.dr_addr_kanji1.zfill(2) + self.dr_addr_kanji2 = self.dr_addr_kanji2.zfill(2) + self.dr_addr_kanji3 = self.dr_addr_kanji3.zfill(2) + self.dr_addr_kanji4 = self.dr_addr_kanji4.zfill(2) + + # 住所カウント_カナの0埋め + self.dr_addr_kana1 = self.dr_addr_kana1.zfill(2) + self.dr_addr_kana2 = self.dr_addr_kana2.zfill(2) + self.dr_addr_kana3 = self.dr_addr_kana3.zfill(2) + self.dr_addr_kana4 = self.dr_addr_kana4.zfill(2) + # DCFDSF施設コード self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi # 関連大学親コード @@ -184,18 +208,6 @@ class ComInst(UltmarcTable): # DCF親施設コード self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi - # 住所カウント_漢字の0埋め - self.dr_addr_kanji1.zfill(2) - self.dr_addr_kanji2.zfill(2) - self.dr_addr_kanji3.zfill(2) - self.dr_addr_kanji4.zfill(2) - - # 住所カウント_カナの0埋め - self.dr_addr_kana1.zfill(2) - self.dr_addr_kana2.zfill(2) - self.dr_addr_kana3.zfill(2) - self.dr_addr_kana4.zfill(2) - # 許可ベッド(集合項目) self.prmit_bed = [ self.bed_num_sum, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv index 1fb79e85..09c509fb 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/com_dr_update.csv @@ -6,3 +6,4 @@ "501","01","997906","00","B","20170911","20170912","","","","","","","","@","","","","","","@","","","","","","U91","U92","U93","U94","U95","5","","","","","","","","","","","","","","","","","@","","","","","","@","","" "501","01","999613","00","B","20170901","20170902","@","","","","","","","4","2","09","22","37","11","","","","","@","","","","","","","@","01","002","033","444","555-6666","神奈川県鎌倉市玉縄2-8-30","カナガワケン カマクラシ タマナワ 2-8-30","2-8-30","00","00","00","00","00","00","00","00","","","","","","","","","" "501","99","999999","90","B","20230425","20230426","@","@","9","10","11","12","1","@","15","06","17","18","19","@","21","022","3","@","25","@","C27","I28","K29","L30","@","32","033","034","035","231-0036","37","38","126-1-39","40","41","42","43","44","45","46","47","@","@","@","@","@","3","@","55","6" +"501","99","999999","00","A","20230425","20230426","","","","","","","","","","","","","","","","","","","","A01","","A03","","A05","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv index 9b043d87..1c34701d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_before_update.csv @@ -7,3 +7,4 @@ "0199790600","オカ モリマサ","丘 守正","3","20","03","11","19450311","99","4","03","1991","029-274-7110","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","","799","1","3","45","1970","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "0199961300","フジタ アカネ","藤田 茜","","","","","NULL","99","","","NULL","","","","","00000000000","00","000","","00000000","00000000","99","9","2","5","6","799","1","","","NULL","","0148106500","1","","","","","4","23","2011","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/08 20:57:12","clsComDrInfo" "9999999990","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"9999999900","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv index a9f320d5..cf4d0ac7 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/db_com_dr_trt_course_before_update.csv @@ -1,6 +1,7 @@ "trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "A01","0122222233","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" "A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A01","9999999900","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" "A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" "A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" "A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv index b62bbbca..fa2ab558 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv @@ -1,5 +1,8 @@ "trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"A01","9999999900","1","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A03","9999999900","3","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A05","9999999900","5","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" "A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" "A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" "A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py index dd533e17..5d45b49b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -28,13 +28,13 @@ class TestComDrMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): @@ -243,10 +243,13 @@ class TestComDrMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - if actual_col_name == 'sequence': - assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_logical_delete(self): """ @@ -354,7 +357,10 @@ class TestComDrMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - if actual_col_name == 'sequence': - assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name == 'sequence': + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv index e69de29b..5c588736 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_delete.csv @@ -0,0 +1,5 @@ +"101","22","33333","44","C","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","00","9900146","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901649","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901679","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9904439","","C","20160826","20160903","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv index 5fed0c67..f597e06a 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_insert.csv @@ -1 +1,7 @@ -"101","22","33333","44","A","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","22","33333","44","A","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","00","9900146","","A","20141113","20141114","","","","","","医療法人敬老会森岡内科","イリヨウホウジンケイロウカイモリオカナイカ","森岡内科 医療","モリオカナイカ イリヨウ","","36","201","117","002","770-0854","徳島県徳島市徳島本町2-31","トクシマケン トクシマシ トクシマホンチヨウ 2-31","2-31","03","03","04","02","07","06","10","02","","088-623-6161","431","10","01","092029","","板東 章二","バンドウ シヨウジ","","","1","201410","A01","A11","C04","E02","A23","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20130729","0","0","0","0","0","0","0","","","","","","","","","","" +"101","00","9900194","","A","20141113","20141114","1","9","","","","一期崎医院","イチゴザキイイン","一期崎医院","イチゴザキイイン","6","43","101","059","000","860-0844","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","1-27-2D","03","06","3","","07","13","09","00","1","","472","10","","","","","","","","","","O01","O02","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20090430","0","0","0","0","0","0","0","","","","","","","","","","" +"101","00","9901649","","A","20141113","20141114","","","","","","社会福祉法人明和会特別養護老人ホームあづき","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","あづき(特養) 社福","アヅキ シヤフク","","37","322","000","000","761-4100","香川県小豆郡土庄町字半ノ池甲1360-143","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","","03","06","00","00","07","18","00","00","","0879-62-7707","435","41","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","9","9","","","","","50","","","","","","","","","","","","","","","","00","7201648","" +"101","00","9901679","","A","20141113","20141114","","","","","","鹿児島市医師会臨床検査センター","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","カゴシマシイシカイリンシヨウケンサセンタ-","","46","201","017","000","892-0846","鹿児島県鹿児島市加治屋町3-10","カゴシマケン カゴシマシ カジヤチヨウ 3-10","3-10","04","04","04","00","08","07","08","00","","099-226-8827","470","60","01","148013","","海江田 健","カイエダ タケル","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","9","9","","","","","0","","","","","","","","","1","1","1","1","1","1","1","","","" +"101","00","9904439","","A","20141113","20141114","","","","","","川崎市立井田病院","カワサキシリツイダビヨウイン","井田病院 市立","イダビヨウイン シリツ","","14","133","001","002","211-0035","神奈川県川崎市中原区井田2-27-1","カナガワケン カワサキシ ナカハラク イダ 2-27-1","2-27-1","04","06","02","02","08","12","04","02","","044-766-2188","221","01","","","","","","","","","","A01","A34","A22","M01","D02","A12","A81","C01","N03","K01","J01","P02","O01","B01","C04","E02","F01","I01","C05","B31","H02","A41","A03","A58","A61","A65","F08","A56","B11","B22","B04","P03","G06","A57","","","","","","","","","","","","","","","","","","","","","","","","","","","1","3","","","","","370","20140811","370","0","27","0","343","343","0","","","","","","","","","","" +"101","00","9929798","","A","20141113","20141114","","","","","","パーソナルヘルス学びのクリニック","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのCL","パ-ソナルヘルスマナビノクリニツク","","13","103","025","002","107-0062","東京都港区南青山2-2-15 ウイン青山405","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","2-2-15-405","03","02","03","02","07","05","08","02","1","","472","10","01","331831","","白澤 博満","シラサワ ヒロミツ","","","","","A01","I01","A57","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","6","","","","","0","20130415","0","0","0","0","0","0","0","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv index e69de29b..2a13c00e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/com_inst_update.csv @@ -0,0 +1,10 @@ +"101","22","33333","44","B","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","22","33333","99","B","20230606","200230607","8","9","10","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","7","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","4","35","36","37","38","39","40","あいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコ","3","202304","5","202306","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7","8","8","10","11","2","113","20230114","115","6","7","8","9","0","1","2","3","4","5","6","7","8","99","333333","11" +"101","99","33333","44","B","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","99","99999","99","B","20230606","200230607","@","@","@","11","12","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオカクキケコアイウエオカクキケコ","@","18","19","20","21","123-4522","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","25","26","27","28","29","30","31","32","33","@","@","36","37","@","39","40","@","@","@","202304","@","202306","@","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","7","8","@","10","11","@","@","@","@","6","7","8","9","0","1","@","3","4","5","6","7","8","@","333333","11" +"101","00","9900146","","B","20170401","20170404","","2","00","3631462","","","テストイリヨウホウジンケイロウカイモリオカナイカ","","","","","","","","","","","","","","","","","","","","","","221","","","","","","","","","@","","@","A11","C04","E02","A23","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","@","","","@","@","@","@","","","","","","","","","","","","","","0","9912345","" +"101","00","9900194","","B","20170401","20170404","@","@","@","","","","","","","@","11","222","333","444","106-0045","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","1-5-18-10-3","3","2","4","2","7","5","13","2","","","","","","","","","","","","","","U21","U23","U18","U15","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"101","00","9901649","","B","20170401","20170404","","","","","","","","あづき(てすと)","","","","","","","","","","","","","","","","","","","","","","60","","","","","","1","201801","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","@","","" +"101","00","9901679","","B","20170401","20170404","","","","","","","","","カゴシマテスト","","","","","","","","","","","","","","","","","","","@","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","@","","","","","","","","","" +"101","00","9904439","","B","20170401","20170404","","","","","","川崎市立テスト病院","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","11","1234567","","","","","","","","","","","","3","","1","","2","","3","","","" +"101","00","9929798","","B","20170401","20170404","","","","","","","","","","6","","","","","","","","","","","","","","","","","@","","","","@","","","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","91","92","93","94","95","96","97","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv index e69de29b..6e20eb7b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","0","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","0","0","0","0","0","0","0","0","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv index e69de29b..0b1ad996 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_inst_before_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"223333399","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"993333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"999999999","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"009900146","10","","イリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","1","0","1","","201410","","1","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","431","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130729","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","10","6","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","1","","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","860-0844","43101059000","43","101","1-27-2D","07130900","03060300","472","9","7","003631463","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009901649","41","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(特養) 社福","","50","","","","","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","9","","","","","","","","","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","","01148013","カイエダ タケル","海江田 健","","","099-226-8827","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","1","1","1","1","1","1","1","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立井田病院","井田病院 市立","","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","","","","","","","","3","343","0","27","0","370","343","0","20140811","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009929798","10","","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","01331831","シラサワ ヒロミツ","白澤 博満","1","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130415","1","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv new file mode 100644 index 00000000..cc988dcc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_delete.csv @@ -0,0 +1,4 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"009900146","09912345","20220201","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 11:08:29","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","NULL","20220131","20220201","20220201","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv new file mode 100644 index 00000000..9bc1f8ff --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_spcare_before_update.csv @@ -0,0 +1,5 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"009901649","007201648","20220131","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 11:38:27","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv new file mode 100644 index 00000000..557be371 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_delete.csv @@ -0,0 +1,66 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900146","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv new file mode 100644 index 00000000..46080fbc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv @@ -0,0 +1,48 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"223333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"009900146","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","A11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","A23","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900146","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009900194","O02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv index e69de29b..b2dde439 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","0","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","0","0","0","0","0","0","0","0","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","20160826","0","","","","","","NULL","","NULL","","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 15:50:39","com_inst_mapper" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","","0","","","","","","NULL","","NULL","","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 14:52:44","clsComInstInfo" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","20230606","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv index 88bf2163..97617e35 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_insert.csv @@ -1,2 +1,8 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"009900146","10","","イリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","0","1","","201410","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","431","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130729","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009900194","10","6","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","1","","クマモトケン クマモトシ チユウオウク スイドウチヨウ 1-27 ダイガクドウビル 2カイDシツ","熊本県熊本市中央区水道町1-27 大学堂ビル2階D室","860-0844","43101059000","43","101","1-27-2D","07130900","03060300","472","9","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009901649","41","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(特養) 社福","","50","","","","","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","9","","","","","","","","","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマシイシカイリンシヨウケンサセンタ-","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","","01148013","カイエダ タケル","海江田 健","","","099-226-8827","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","1","1","1","1","1","1","1","9","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立井田病院","井田病院 市立","","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","","","","","","","","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","10","","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","01331831","シラサワ ヒロミツ","白澤 博満","1","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv index e69de29b..f2aa0ac2 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv @@ -0,0 +1,11 @@ +"dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","NULL","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:28","com_inst_mapper" +"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","","","","","","","","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","","","","","","","","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 11:08:30","com_inst_mapper" +"223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"223333399","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" +"993333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" +"999999999","37","","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","","NULL","","","","","","","","","","","","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","","7","","","","","","","","","8","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv new file mode 100644 index 00000000..9cede581 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_delete.csv @@ -0,0 +1,4 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","09912345","20220201","20220201","NULL","NULL","NULL","NULL","NULL","2022/02/01 11:08:29","clsComInstInfo","2022/02/01 14:52:43","clsComInstInfo" +"009901649","NULL","20220131","20220201","20220201","NULL","NULL","NULL","NULL","2022/01/31 11:38:27","clsComInstInfo","2022/02/01 14:52:43","clsComInstInfo" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv index db6f2bd4..a07ed27d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_insert.csv @@ -1,2 +1,3 @@ "dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"293031","20230427NULLNULL","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"009901649","007201648","20220131","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"223333344","9933333311","20230427","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv new file mode 100644 index 00000000..b85d46c8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv @@ -0,0 +1,7 @@ +"dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","09912345","20220201","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 11:08:29","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009901649","","20220131","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 14:52:43","com_inst_mapper" +"223333344","9933333311","20230508","20230508","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333399","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" +"999999999","","20230508","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv new file mode 100644 index 00000000..bfd476b6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_delete.csv @@ -0,0 +1,66 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2022-02-01 14:52:43","clsComInstInfo","2022-02-01 14:52:43","clsComInstInfo" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv index 133e9b9f..78a3a2de 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_insert.csv @@ -1,4 +1,55 @@ "dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009900146","A11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","A23","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900146","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900194","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009900194","O02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","com_inst_mapper","2022-01-31 11:38:26","com_inst_mapper" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","com_inst_mapper","2022-01-31 11:38:27","com_inst_mapper" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","com_inst_mapper","2022-01-31 11:38:28","com_inst_mapper" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" @@ -52,10 +103,3 @@ "223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" -"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv new file mode 100644 index 00000000..8d4e9a35 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv @@ -0,0 +1,66 @@ +"dcf_dsf_inst_cd","trt_course_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900194","U15","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","103","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","104","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","105","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","106","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","47","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","48","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","49","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","50","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","51","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","52","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","53","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","54","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","55","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","56","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","57","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","58","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","59","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","60","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","61","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","62","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","63","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","64","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","65","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","66","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","67","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","68","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","69","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","70","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","71","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","72","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","73","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","74","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","75","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","76","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","77","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","78","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","79","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","80","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","81","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","82","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","83","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","84","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","85","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","86","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","87","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","88","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","89","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","90","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","91","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","92","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","93","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","94","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","95","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","96","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","97","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","98","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"223333344","99","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" +"993333344","999","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 3dd1f2bb..7575319c 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -28,13 +28,13 @@ class TestComInstMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): @@ -76,26 +76,39 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup', + 'regist_ymd', + 'regist_ymd', + 'sys_update_date', + 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup', - 'regist_ymd', - 'sys_regist_date', - 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name in ignore_columns: + if actual_col_name in [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup']: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # 期待値ファイルを読み込む(施設診療科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_insert.csv')) @@ -139,7 +152,7 @@ class TestComInstMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): @@ -165,6 +178,7 @@ class TestComInstMapper: self.db.execute(delete_sql, delete_parameter) delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_spcare_med_office_dat', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 # DBデータを読み込む(施設) test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_before_update.csv')) @@ -198,6 +212,7 @@ class TestComInstMapper: for line_number, line in enumerate(test_dat_file, start=1): sut: com_inst_mapper.ComInstMapper = create_ultmarc_table_mapper_sut(line, self.db) assert type(sut) is com_inst_mapper.ComInstMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() sut.execute_queries() @@ -208,7 +223,20 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + # 期待値検査 + ignore_columns = [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup', + 'regist_ymd', + 'regist_ymd', + 'sys_update_date', + 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -219,7 +247,19 @@ class TestComInstMapper: if expect_row[expect_col_name] is None: assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name in [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup']: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # 期待値ファイルを読み込む(施設診療科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_update.csv')) @@ -248,13 +288,17 @@ class TestComInstMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # 期待値ファイルを読み込む(特養医務室データ) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_update.csv')) primary_keys = [f"'{primary_key['dcf_chld_inst_cd']}'" for primary_key in expect_data_list] actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) @@ -263,8 +307,11 @@ class TestComInstMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_logical_delete(self): """ @@ -332,7 +379,19 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup', + 'regist_ymd', + 'regist_ymd', + 'sys_update_date', + 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -343,7 +402,19 @@ class TestComInstMapper: if expect_row[expect_col_name] is None: assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if actual_col_name in [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup']: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # 期待値ファイルを読み込む(施設診療科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_delete.csv')) @@ -372,7 +443,10 @@ class TestComInstMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' # 期待値ファイルを読み込む(特養医務室データ) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_spcare_delete.csv')) @@ -388,4 +462,7 @@ class TestComInstMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: - assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From aca85704dafb90c5bbb68e6ed3d11b45222fe433 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 8 May 2023 16:25:11 +0900 Subject: [PATCH 223/962] =?UTF-8?q?LOAD=20DATA=20=20LOCAL=20INFILE?= =?UTF-8?q?=E3=81=A73948=E3=82=A8=E3=83=A9=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 2 +- .../src/batch/vjsk/vjsk_data_load_manager.py | 28 +++--- .../src/batch/vjsk/vjsk_importer.py | 42 ++++----- .../src/batch/vjsk/vjsk_recv_file_manager.py | 90 +++++++++---------- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 5 +- 5 files changed, 89 insertions(+), 78 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 79c80db9..2ee93eb8 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -123,7 +123,7 @@ class VjskBucket(S3Bucket): def download_data_file(self, data_filename: str): temporary_dir = tempfile.mkdtemp() - temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._folder}/", "")}') + temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._recv_folder}/", "")}') with open(temporary_file_path, mode='wb') as f: self._s3_client.download_file(self._bucket_name, data_filename, f) f.seek(0) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index a412c3c7..9aa80070 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -1,5 +1,4 @@ -from src.batch.vjsk.vjsk_recv_file_manager import (VjskDatFile, - VjskRecvFileManager) +# from src.batch.vjsk.vjsk_recv_file_manager import VjskDatFile from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper from src.db.database import Database from src.logging.get_logger import get_logger @@ -9,20 +8,26 @@ mapper = VjskRecvFileMapper() class JjskDataLoadManager: - def _import_to_db(dat_file: VjskDatFile, condkey: str): + def __init__(self): + pass + + def _import_to_db(src_file_name: str, condkey: str): db = Database.get_instance() table_name_org = mapper.get_org_table(condkey) - table_name_src = mapper.get_org_table(condkey) + table_name_src = mapper.get_src_table(condkey) try: db.connect() # TODO:接続オプション local_infile = True が必要? db.begin() # orgをtruncate - f"TRUNCATE TABLE {table_name_org};" + db.execute(f"TRUNCATE TABLE {table_name_org};") + + # load DATA local infileステートメント実行許可設定 + db.execute("SET GLOBAL local_infile=on;") # orgにload ※warningは1148エラーになるらしい - sql = f"LOAD DATA LOCAL INFILE {dat_file} INTO TABLE {table_name_org} FIELDS TERMINATED BY '\t' ENCLOSED BY ""'"" IGNORE 1 LINES;" + sql = f"LOAD DATA LOCAL INFILE '{src_file_name}' INTO TABLE {table_name_org} FIELDS TERMINATED BY '\\t' ENCLOSED BY \"'\" IGNORE 1 LINES;" cnt = db.execute(sql) logger.info(f'tsvデータをorgテーブルにLOAD : 件数({cnt})') @@ -39,18 +44,21 @@ class JjskDataLoadManager: db.disconnect() return + @classmethod def Load(self, target: dict): + logger.debug(f'JjskDataLoadManager#load start target:{target}') # target : {"condkey": key, "src_file_path":local_file_path} # データファイルオープン - dat_file = VjskRecvFileManager.file_open(target["local_file_path"]) + local_file_name = target["src_file_path"] + # dat_file = VjskDatFile.retrieve_from_file(local_file_name) # TODO: tsvファイルをload投入用のDMLに加工(システム日時つけたり、エンコードをUTF-8に変換したり) - # TODO: ファイルオンコード判定の参考 https://zenn.dev/takedato/articles/c3a491546f8c58 + # TODO: ファイルエンコード判定の参考 https://zenn.dev/takedato/articles/c3a491546f8c58 # TODO: エンコード変換の参考 https://dev.classmethod.jp/articles/python-encoding/ - dat_file = dat_file # データベース登録 - self._import_to_db(dat_file, target["condkey"]) + self._import_to_db(local_file_name, target["condkey"]) + logger.debug('JjskDataLoadManager#load end') return diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 839058ab..7db2983e 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -9,7 +9,7 @@ from src.logging.get_logger import get_logger # from src.batch.datachange import emp_chg_inst_lau -logger = get_logger('V実消化データ取込') +_logger = get_logger('V実消化データ取込') batch_context = BatchContext.get_instance() vjsk_recv_bucket = VjskBucket() vjsk_mapper = VjskRecvFileMapper() @@ -28,11 +28,11 @@ def _check_if_file_exists(src_list: list, key: str) -> bool: def _check_received_files(): """V実消化連携データ存在確認処理""" - logger.debug('V実消化連携データ存在確認処理:開始') + _logger.debug('V実消化連携データ存在確認処理:開始') # 実消化&アルトマーク V実消化データ受領バケットにあるファイル一覧を取得 received_files = vjsk_recv_bucket.get_s3_file_list() - logger.debug(f'ファイル一覧{received_files}') + _logger.debug(f'ファイル一覧{received_files}') # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) if batch_context.is_import_target_vjsk_stockslipdata: @@ -87,13 +87,13 @@ def _check_received_files(): if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_files}') - logger.debug('V実消化連携データ存在確認処理:終了') + _logger.debug('V実消化連携データ存在確認処理:終了') return True def _import_file_to_db(): - logger.debug('V実消化取込処理:開始') + _logger.debug('V実消化取込処理:開始') # 実消化&アルトマーク V実消化データ受領バケットにあるファイルパス一覧を取得 received_s3_files = vjsk_recv_bucket.get_s3_file_list() @@ -101,11 +101,11 @@ def _import_file_to_db(): # ファイルパス一覧にマッピング情報を参照するためのキーを持たせて辞書可する target_dict = {} for s3_file_path in received_s3_files: - local_file_path = vjsk_recv_bucket.download_data_file(s3_file_path) - key = vjsk_mapper.get_condkey_by_s3_file_path(local_file_path) + local_file_path = vjsk_recv_bucket.download_data_file(s3_file_path.get('filename')) + key = vjsk_mapper.get_condkey_by_s3_file_path(s3_file_path.get('filename')) if key is not None: target_dict[key] = {"condkey": key, "src_file_path": local_file_path} - logger.debug(f'S3ファイルパス辞書{target_dict}') + _logger.debug(f'S3ファイルパス辞書{target_dict}') # TODO: diff_upsertに変わるやつを呼び出す # TODO: emp_chg_inst_lau.batch_process() みたいに @@ -150,7 +150,7 @@ def _import_file_to_db(): # # # ファイル存在確認 MDBコード変換マスタ # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) - logger.debug('V実消化取込処理:終了') + _logger.debug('V実消化取込処理:終了') def _determine_today_is_stockslipdata_target(): @@ -162,37 +162,39 @@ def _determine_today_is_stockslipdata_target(): targetdays = CalendarWholwSalerStockFile(holiday_list_file_path) ret = targetdays.compare_date(today) except Exception as e: - logger.error(f'{e}') + _logger.error(f'{e}') raise e return ret def exec(): """V実消化データ取込""" - logger.info('Start Jitsusyouka Torikomi PGM.') + _logger.info('Start Jitsusyouka Torikomi PGM.') # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる - logger.debug('卸在庫データ取込対象日であるかを判定') + _logger.debug('卸在庫データ取込対象日であるかを判定') batch_context.is_import_target_vjsk_stockslipdata = _determine_today_is_stockslipdata_target() - logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') + _logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') if batch_context.is_import_target_vjsk_stockslipdata: - logger.info('卸在庫データ取込対象日です') + _logger.info('卸在庫データ取込対象日です') # V実消化データファイル受領チェック - logger.debug('V実消化データファイル受領チェック:開始') + _logger.debug('V実消化データファイル受領チェック:開始') try: # S3バケット上でV実消化データファイルの存在チェックをする _check_received_files() except BatchOperationException as e: - logger.error('受領したV実消化データファイルに欠落があります') + _logger.error('受領したV実消化データファイルに欠落があります') raise e - logger.debug('V実消化データファイル受領チェック:終了') + _logger.debug('V実消化データファイル受領チェック:終了') # データベース取込 - logger.debug('V実消化データ取込:開始') + _logger.debug('V実消化データ取込:開始') try: _import_file_to_db() except Exception as e: - logger.error(f'データベース登録失敗 {e}') - logger.debug('V実消化データ取込:終了') + _logger.error(f'データベース登録失敗 {e}') + raise e + + _logger.debug('V実消化データ取込:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py index 5a0dd54f..7ddbb766 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py @@ -1,60 +1,60 @@ -import csv -from io import TextIOWrapper +# import csv +# from io import TextIOWrapper -class VjskRecvFileManager: - layout_class: str - records: list[str] +# class VjskRecvFileManager: +# layout_class: str +# records: list[str] - def __init__(self, dat_line: list[str]) -> None: - self.layout_class = dat_line[0] - self.records = dat_line +# def __init__(self, dat_line: list[str]) -> None: +# self.layout_class = dat_line[0] +# self.records = dat_line -class VjskDatFile: - """V実消化データファイル""" +# class VjskDatFile: +# """V実消化データファイル""" - lines: list[VjskRecvFileManager] - success_count: int = 0 - error_count: int = 0 - total_count: int = 0 - __i: int = 0 +# lines: list[VjskRecvFileManager] +# success_count: int = 0 +# error_count: int = 0 +# total_count: int = 0 +# __i: int = 0 - def __iter__(self): - return self +# def __iter__(self): +# return self - def __next__(self) -> VjskRecvFileManager: - if self.__i == len(self.lines): - raise StopIteration() - line = self.lines[self.__i] - self.__i += 1 - return line +# def __next__(self) -> VjskRecvFileManager: +# if self.__i == len(self.lines): +# raise StopIteration() +# line = self.lines[self.__i] +# self.__i += 1 +# return line - def __init__(self, file: TextIOWrapper) -> None: - reader = csv.reader(file) - csv_rows = [VjskRecvFileManager(row) for row in reader] +# def __init__(self, file: TextIOWrapper) -> None: +# reader = csv.reader(file) +# csv_rows = [VjskRecvFileManager(row) for row in reader] - self.lines = csv_rows - self.total_count = len(csv_rows) +# self.lines = csv_rows +# self.total_count = len(csv_rows) - def count_up_success(self): - self.success_count += 1 +# def count_up_success(self): +# self.success_count += 1 - def count_up_error(self): - self.error_count += 1 +# def count_up_error(self): +# self.error_count += 1 - @classmethod - def file_open(cls, local_file_path: str): - """V実消化データファイルを読み込み、新しいインスタンスを作成する +# @classmethod +# def retrieve_from_file(cls, local_file_path: str): +# """V実消化データファイルを読み込み、新しいインスタンスを作成する - Args: - local_file_path (str): ローカルのファイルパス +# Args: +# local_file_path (str): ローカルのファイルパス - Returns: - VjskDatFile: このクラスのインスタンス - """ - # cp932(Shift-JIS Windows拡張)でファイルを読み込む - file = open(local_file_path, encoding='cp932') - instance = cls(file) - file.close() - return instance +# Returns: +# VjskDatFile: このクラスのインスタンス +# """ +# # cp932(Shift-JIS Windows拡張)でファイルを読み込む +# file = open(local_file_path, encoding='cp932') +# instance = cls(file) +# file.close() +# return instance diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index d89f5063..4aeea24f 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -168,8 +168,9 @@ class VjskRecvFileMapper: def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: ret = None filename = s3_file_path[s3_file_path.rfind("/") + 1:] - for element in self._VJSK_INTERFACE_MAPPING: + for condkey in self._VJSK_INTERFACE_MAPPING: + element = self._VJSK_INTERFACE_MAPPING.get(condkey) if filename.startswith(element.get(self._KEY_FILE_PREFIX)) and filename.endswith(element.get(self._KEY_FILE_SUFFIX)): - ret = element + ret = condkey break return ret From 4226ad9db1dc9d07cb3798b4f6da5e28e1958e59 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 8 May 2023 18:13:23 +0900 Subject: [PATCH 224/962] =?UTF-8?q?org=E3=81=AE=E3=83=86=E3=83=BC=E3=83=96?= =?UTF-8?q?=E3=83=AB=E3=81=ABLOAD=20DATA=20LOCAL=20INFILE=E3=81=8C?= =?UTF-8?q?=E9=80=9A=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 9 +++------ ecs/jskult-batch-daily/src/db/database.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 9aa80070..af35a2aa 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -23,13 +23,10 @@ class JjskDataLoadManager: # orgをtruncate db.execute(f"TRUNCATE TABLE {table_name_org};") - # load DATA local infileステートメント実行許可設定 - db.execute("SET GLOBAL local_infile=on;") - # orgにload ※warningは1148エラーになるらしい - sql = f"LOAD DATA LOCAL INFILE '{src_file_name}' INTO TABLE {table_name_org} FIELDS TERMINATED BY '\\t' ENCLOSED BY \"'\" IGNORE 1 LINES;" - cnt = db.execute(sql) - logger.info(f'tsvデータをorgテーブルにLOAD : 件数({cnt})') + sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org} FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" + result = db.execute(sql, {"src_file_name": src_file_name}) + logger.info(f'tsvデータをorgテーブルにLOAD : 件数({result.rowcount})') # org→srcにinsert select # TODO: INTO句とSELECT句はmapperに持たせてcondkeyで引っ張ってくるようにしたい diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py index f67a21b9..b67c3a3d 100644 --- a/ecs/jskult-batch-daily/src/db/database.py +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -44,7 +44,7 @@ class Database: host=self.__host, port=self.__port, database=self.__schema, - query={"charset": "utf8mb4"} + query={"charset": "utf8mb4", "local_infile": "1"}, ) self.__engine = create_engine( From 0962172f4d7328757ec1977d28a3300bbdae9bab Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 8 May 2023 23:08:58 +0900 Subject: [PATCH 225/962] =?UTF-8?q?=E3=81=A8=E3=82=8A=E3=81=82=E3=81=88?= =?UTF-8?q?=E3=81=9A=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AA=E3=81=97=E3=81=A7?= =?UTF-8?q?=E9=80=9A=E3=81=9B=E3=82=8B=E7=A8=8B=E5=BA=A6=E3=81=AE=E4=BB=AE?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 16 +- .../src/batch/vjsk/vjsk_importer.py | 48 +- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 1349 ++++++++++++++++- 3 files changed, 1362 insertions(+), 51 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index af35a2aa..4b574dce 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -14,7 +14,7 @@ class JjskDataLoadManager: def _import_to_db(src_file_name: str, condkey: str): db = Database.get_instance() table_name_org = mapper.get_org_table(condkey) - table_name_src = mapper.get_src_table(condkey) + upsert_sql = mapper.get_upsert_sql(condkey) try: db.connect() # TODO:接続オプション local_infile = True が必要? @@ -24,13 +24,14 @@ class JjskDataLoadManager: db.execute(f"TRUNCATE TABLE {table_name_org};") # orgにload ※warningは1148エラーになるらしい - sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org} FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" + sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org}" \ + " FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" result = db.execute(sql, {"src_file_name": src_file_name}) logger.info(f'tsvデータをorgテーブルにLOAD : 件数({result.rowcount})') # org→srcにinsert select - # TODO: INTO句とSELECT句はmapperに持たせてcondkeyで引っ張ってくるようにしたい - f"INSERT INTO {table_name_src} SELECT * FROM {table_name_org};" + result = db.execute(upsert_sql) + logger.info(f'orgテーブルをsrcテーブルにUPSERT : 件数({result.rowcount})') db.commit() except Exception as e: # TODO:DB例外だけキャッチしたい @@ -46,13 +47,8 @@ class JjskDataLoadManager: logger.debug(f'JjskDataLoadManager#load start target:{target}') # target : {"condkey": key, "src_file_path":local_file_path} - # データファイルオープン + # S3からローカルストレージにdownloadした登録対象のtsvファイルパスを取得 local_file_name = target["src_file_path"] - # dat_file = VjskDatFile.retrieve_from_file(local_file_name) - - # TODO: tsvファイルをload投入用のDMLに加工(システム日時つけたり、エンコードをUTF-8に変換したり) - # TODO: ファイルエンコード判定の参考 https://zenn.dev/takedato/articles/c3a491546f8c58 - # TODO: エンコード変換の参考 https://dev.classmethod.jp/articles/python-encoding/ # データベース登録 self._import_to_db(local_file_name, target["condkey"]) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 7db2983e..8b4b5197 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -114,41 +114,41 @@ def _import_file_to_db(): if batch_context.is_import_target_vjsk_stockslipdata: JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) - # # # ファイル存在確認 卸販売データ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) + # DB登録 卸販売データ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) - # # # ファイル存在確認 卸組織変換マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) + # DB登録 卸組織変換マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) - # # # ファイル存在確認 施設統合マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) + # DB登録 施設統合マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) - # # # ファイル存在確認 卸マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) + # DB登録 卸マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) - # # # ファイル存在確認 卸ホールディングスマスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) + # DB登録 卸ホールディングスマスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) - # # # ファイル存在確認 施設マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) + # DB登録 施設マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) - # # # ファイル存在確認 メーカー卸組織展開表 - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) + # DB登録 メーカー卸組織展開表 + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) - # # # ファイル存在確認 取引区分マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) + # DB登録 取引区分マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) - # # # ファイル存在確認 製品マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) + # DB登録 製品マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) - # # # ファイル存在確認 製品価格マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) + # DB登録 製品価格マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) - # # # ファイル存在確認 卸得意先情報マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) + # DB登録 卸得意先情報マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) - # # # ファイル存在確認 MDBコード変換マスタ - # JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) + # DB登録 MDBコード変換マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) _logger.debug('V実消化取込処理:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 4aeea24f..a6736e16 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -1,3 +1,6 @@ +import textwrap + + class VjskRecvFileMapper: CONDKEY_SLIP_DATA = "SLIP_DATA" # 販売実績データ CONDKEY_HLD_MST = "HLD_MST" # V卸ホールディングスマスタ @@ -19,13 +22,274 @@ class VjskRecvFileMapper: _KEY_FILE_SUFFIX = "file_suffix" _KEY_ORG_TABLE = "org_table" _KEY_SRC_TABLE = "src_table" + _KEY_UPSERT_SQL = "upsert_sql" _VJSK_INTERFACE_MAPPING = { # 販売実績データ CONDKEY_SLIP_DATA: { _KEY_FILE_PREFIX: "slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.sales", - _KEY_SRC_TABLE: "src05.sales" + _KEY_SRC_TABLE: "src05.sales", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.sales ( + REC_DATA + ,REC_WHS_CD + ,REC_WHS_SUB_CD + ,REC_WHS_ORG_CD + ,REC_CUST_CD + ,REC_COMM_CD + ,REC_TRAN_KBN + ,REV_HSDNYMD_WRK + ,REV_HSDNYMD_SRK + ,REC_URAG_NUM + ,REC_QTY + ,REC_NONYU_PRICE + ,REC_NONYU_AMT + ,REC_COMM_NAME + ,REC_NONYU_FCL_NAME + ,FREE_ITEM + ,REC_NONYU_FCL_ADDR + ,REC_NONYU_FCL_POST + ,REC_NONYU_FCL_TEL + ,REC_BEF_HSDN_YMD + ,REC_BEF_SLIP_NUM + ,REC_YMD + ,SALE_DATA_CAT + ,SLIP_FILE_NAME + ,SLIP_MGT_NUM + ,ROW_NUM + ,HSDN_YMD + ,EXEC_DT + ,V_TRAN_CD + ,TRAN_KBN_NAME + ,WHS_ORG_CD + ,V_WHSORG_CD + ,WHS_ORG_NAME + ,WHS_ORG_KN + ,V_WHS_CD + ,WHS_NAME + ,NONYU_FCL_CD + ,V_INST_CD + ,V_INST_KN + ,V_INST_NAME + ,V_INST_ADDR + ,COMM_CD + ,COMM_NAME + ,NONYU_QTY + ,NONYU_PRICE + ,NONYU_AMT + ,SHIKIRI_PRICE + ,SHIKIRI_AMT + ,NHI_PRICE + ,NHI_AMT + ,WHSPOS_ERR_KBN + ,HTDNYMD_ERR_KBN + ,PRD_EXIS_KBN + ,FCL_EXIS_KBN + ,BEF_HSDN_YMD + ,BEF_SLIP_NUM + ,SLIP_ORG_KBN + ,ERR_FLG1 + ,ERR_FLG2 + ,ERR_FLG3 + ,ERR_FLG4 + ,ERR_FLG5 + ,ERR_FLG6 + ,ERR_FLG7 + ,ERR_FLG8 + ,ERR_FLG9 + ,ERR_FLG10 + ,ERR_FLG11 + ,ERR_FLG12 + ,ERR_FLG13 + ,ERR_FLG14 + ,ERR_FLG15 + ,ERR_FLG16 + ,ERR_FLG17 + ,ERR_FLG18 + ,ERR_FLG19 + ,ERR_FLG20 + ,KJYO_YM + ,TKSNBK_KBN + ,FCL_EXEC_KBN + ,REC_STS_KBN + ,INS_DT + ,INS_USR + ,DWH_UPD_DT + ) + SELECT + t.REC_DATA + ,t.REC_WHS_CD + ,t.REC_WHS_SUB_CD + ,t.REC_WHS_ORG_CD + ,t.REC_CUST_CD + ,t.REC_COMM_CD + ,t.REC_TRAN_KBN + ,t.REV_HSDNYMD_WRK + ,t.REV_HSDNYMD_SRK + ,t.REC_URAG_NUM + ,t.REC_QTY + ,t.REC_NONYU_PRICE + ,t.REC_NONYU_AMT + ,t.REC_COMM_NAME + ,t.REC_NONYU_FCL_NAME + ,t.FREE_ITEM + ,t.REC_NONYU_FCL_ADDR + ,t.REC_NONYU_FCL_POST + ,t.REC_NONYU_FCL_TEL + ,t.REC_BEF_HSDN_YMD + ,t.REC_BEF_SLIP_NUM + ,t.REC_YMD + ,t.SALE_DATA_CAT + ,t.SLIP_FILE_NAME + ,t.SLIP_MGT_NUM + ,t.ROW_NUM + ,t.HSDN_YMD + ,t.EXEC_DT + ,t.V_TRAN_CD + ,t.TRAN_KBN_NAME + ,t.WHS_ORG_CD + ,t.V_WHSORG_CD + ,t.WHS_ORG_NAME + ,t.WHS_ORG_KN + ,t.V_WHS_CD + ,t.WHS_NAME + ,t.NONYU_FCL_CD + ,t.V_INST_CD + ,t.V_INST_KN + ,t.V_INST_NAME + ,t.V_INST_ADDR + ,t.COMM_CD + ,t.COMM_NAME + ,t.NONYU_QTY + ,t.NONYU_PRICE + ,t.NONYU_AMT + ,t.SHIKIRI_PRICE + ,t.SHIKIRI_AMT + ,t.NHI_PRICE + ,t.NHI_AMT + ,t.WHSPOS_ERR_KBN + ,t.HTDNYMD_ERR_KBN + ,t.PRD_EXIS_KBN + ,t.FCL_EXIS_KBN + ,t.BEF_HSDN_YMD + ,t.BEF_SLIP_NUM + ,t.SLIP_ORG_KBN + ,t.ERR_FLG1 + ,t.ERR_FLG2 + ,t.ERR_FLG3 + ,t.ERR_FLG4 + ,t.ERR_FLG5 + ,t.ERR_FLG6 + ,t.ERR_FLG7 + ,t.ERR_FLG8 + ,t.ERR_FLG9 + ,t.ERR_FLG10 + ,t.ERR_FLG11 + ,t.ERR_FLG12 + ,t.ERR_FLG13 + ,t.ERR_FLG14 + ,t.ERR_FLG15 + ,t.ERR_FLG16 + ,t.ERR_FLG17 + ,t.ERR_FLG18 + ,t.ERR_FLG19 + ,t.ERR_FLG20 + ,t.KJYO_YM + ,t.TKSNBK_KBN + ,t.FCL_EXEC_KBN + ,t.REC_STS_KBN + ,t.INS_DT + ,t.INS_USR + ,SYSDATE() + FROM org05.sales AS t + ON DUPLICATE KEY UPDATE + REC_DATA=t.REC_DATA + ,REC_WHS_CD=t.REC_WHS_CD + ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD + ,REC_WHS_ORG_CD=t.REC_WHS_ORG_CD + ,REC_CUST_CD=t.REC_CUST_CD + ,REC_COMM_CD=t.REC_COMM_CD + ,REC_TRAN_KBN=t.REC_TRAN_KBN + ,REV_HSDNYMD_WRK=t.REV_HSDNYMD_WRK + ,REV_HSDNYMD_SRK=t.REV_HSDNYMD_SRK + ,REC_URAG_NUM=t.REC_URAG_NUM + ,REC_QTY=t.REC_QTY + ,REC_NONYU_PRICE=t.REC_NONYU_PRICE + ,REC_NONYU_AMT=t.REC_NONYU_AMT + ,REC_COMM_NAME=t.REC_COMM_NAME + ,REC_NONYU_FCL_NAME=t.REC_NONYU_FCL_NAME + ,FREE_ITEM=t.FREE_ITEM + ,REC_NONYU_FCL_ADDR=t.REC_NONYU_FCL_ADDR + ,REC_NONYU_FCL_POST=t.REC_NONYU_FCL_POST + ,REC_NONYU_FCL_TEL=t.REC_NONYU_FCL_TEL + ,REC_BEF_HSDN_YMD=t.REC_BEF_HSDN_YMD + ,REC_BEF_SLIP_NUM=t.REC_BEF_SLIP_NUM + ,REC_YMD=t.REC_YMD + ,SALE_DATA_CAT=t.SALE_DATA_CAT + ,SLIP_FILE_NAME=t.SLIP_FILE_NAME + ,SLIP_MGT_NUM=t.SLIP_MGT_NUM + ,ROW_NUM=t.ROW_NUM + ,HSDN_YMD=t.HSDN_YMD + ,EXEC_DT=t.EXEC_DT + ,V_TRAN_CD=t.V_TRAN_CD + ,TRAN_KBN_NAME=t.TRAN_KBN_NAME + ,WHS_ORG_CD=t.WHS_ORG_CD + ,V_WHSORG_CD=t.V_WHSORG_CD + ,WHS_ORG_NAME=t.WHS_ORG_NAME + ,WHS_ORG_KN=t.WHS_ORG_KN + ,V_WHS_CD=t.V_WHS_CD + ,WHS_NAME=t.WHS_NAME + ,NONYU_FCL_CD=t.NONYU_FCL_CD + ,V_INST_CD=t.V_INST_CD + ,V_INST_KN=t.V_INST_KN + ,V_INST_NAME=t.V_INST_NAME + ,V_INST_ADDR=t.V_INST_ADDR + ,COMM_CD=t.COMM_CD + ,COMM_NAME=t.COMM_NAME + ,NONYU_QTY=t.NONYU_QTY + ,NONYU_PRICE=t.NONYU_PRICE + ,NONYU_AMT=t.NONYU_AMT + ,SHIKIRI_PRICE=t.SHIKIRI_PRICE + ,SHIKIRI_AMT=t.SHIKIRI_AMT + ,NHI_PRICE=t.NHI_PRICE + ,NHI_AMT=t.NHI_AMT + ,WHSPOS_ERR_KBN=t.WHSPOS_ERR_KBN + ,HTDNYMD_ERR_KBN=t.HTDNYMD_ERR_KBN + ,PRD_EXIS_KBN=t.PRD_EXIS_KBN + ,FCL_EXIS_KBN=t.FCL_EXIS_KBN + ,BEF_HSDN_YMD=t.BEF_HSDN_YMD + ,BEF_SLIP_NUM=t.BEF_SLIP_NUM + ,SLIP_ORG_KBN=t.SLIP_ORG_KBN + ,ERR_FLG1=t.ERR_FLG1 + ,ERR_FLG2=t.ERR_FLG2 + ,ERR_FLG3=t.ERR_FLG3 + ,ERR_FLG4=t.ERR_FLG4 + ,ERR_FLG5=t.ERR_FLG5 + ,ERR_FLG6=t.ERR_FLG6 + ,ERR_FLG7=t.ERR_FLG7 + ,ERR_FLG8=t.ERR_FLG8 + ,ERR_FLG9=t.ERR_FLG9 + ,ERR_FLG10=t.ERR_FLG10 + ,ERR_FLG11=t.ERR_FLG11 + ,ERR_FLG12=t.ERR_FLG12 + ,ERR_FLG13=t.ERR_FLG13 + ,ERR_FLG14=t.ERR_FLG14 + ,ERR_FLG15=t.ERR_FLG15 + ,ERR_FLG16=t.ERR_FLG16 + ,ERR_FLG17=t.ERR_FLG17 + ,ERR_FLG18=t.ERR_FLG18 + ,ERR_FLG19=t.ERR_FLG19 + ,ERR_FLG20=t.ERR_FLG20 + ,KJYO_YM=t.KJYO_YM + ,TKSNBK_KBN=t.TKSNBK_KBN + ,FCL_EXEC_KBN=t.FCL_EXEC_KBN + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,INS_USR=t.INS_USR + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V卸ホールディングスマスタ @@ -33,7 +297,50 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "hld_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.hld_mst_v", - _KEY_SRC_TABLE: "src05.hld_mst_v" + _KEY_SRC_TABLE: "src05.hld_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.hld_mst_v ( + V_HLD_CD + ,SUB_NUM + ,NAME + ,KN_NAME + ,ABB_NAME + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.V_HLD_CD + ,t.SUB_NUM + ,t.NAME + ,t.KN_NAME + ,t.ABB_NAME + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() FROM org05.hld_mst_v AS t + ON DUPLICATE KEY UPDATE + V_HLD_CD=t.V_HLD_CD + ,SUB_NUM=t.SUB_NUM + ,NAME=t.NAME + ,KN_NAME=t.KN_NAME + ,ABB_NAME=t.ABB_NAME + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V卸マスタ @@ -41,7 +348,66 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "whs_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whs_mst_v", - _KEY_SRC_TABLE: "src05.whs_mst_v" + _KEY_SRC_TABLE: "src05.whs_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whs_mst_v ( + V_WHS_CD + ,SUB_NUM + ,NAME + ,KN_NAME + ,ABB_NAME + ,POSTAL_CD + ,ADDR + ,KN_ADDR + ,TEL_NUM + ,V_HLD_CD + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.V_WHS_CD + ,t.SUB_NUM + ,t.NAME + ,t.KN_NAME + ,t.ABB_NAME + ,t.POSTAL_CD + ,t.ADDR + ,t.KN_ADDR + ,t.TEL_NUM + ,t.V_HLD_CD + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.whs_mst_v AS t + ON DUPLICATE KEY UPDATE + V_WHS_CD=t.V_WHS_CD + ,SUB_NUM=t.SUB_NUM + ,NAME=t.NAME + ,KN_NAME=t.KN_NAME + ,ABB_NAME=t.ABB_NAME + ,POSTAL_CD=t.POSTAL_CD + ,ADDR=t.ADDR + ,KN_ADDR=t.KN_ADDR + ,TEL_NUM=t.TEL_NUM + ,V_HLD_CD=t.V_HLD_CD + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # Vメーカー卸組織展開表 @@ -49,7 +415,156 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "mkr_org_horizon_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", - _KEY_SRC_TABLE: "src05.mkr_org_horizon_v" + _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.mkr_org_horizon_v ( + VID_KIND_1 + ,V_CD_1 + ,NAME_1 + ,DSP_ODR_1 + ,VID_KIND_2 + ,V_CD_2 + ,NAME_2 + ,DSP_ODR_2 + ,VID_KIND_3 + ,V_CD_3 + ,NAME_3 + ,DSP_ODR_3 + ,VID_KIND_4 + ,V_CD_4 + ,NAME_4 + ,DSP_ODR_4 + ,VID_KIND_5 + ,V_CD_5 + ,NAME_5 + ,DSP_ODR_5 + ,VID_KIND_6 + ,V_CD_6 + ,NAME_6 + ,DSP_ODR_6 + ,VID_KIND_7 + ,V_CD_7 + ,NAME_7 + ,DSP_ODR_7 + ,VID_KIND_8 + ,V_CD_8 + ,NAME_8 + ,DSP_ODR_8 + ,VID_KIND_9 + ,V_CD_9 + ,NAME_9 + ,DSP_ODR_9 + ,VID_KIND_10 + ,V_CD_10 + ,NAME_10 + ,DSP_ODR_10 + ,V_WHS_CD + ,START_DATE + ,END_DATE + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.VID_KIND_1 + ,t.V_CD_1 + ,t.NAME_1 + ,t.DSP_ODR_1 + ,t.VID_KIND_2 + ,t.V_CD_2 + ,t.NAME_2 + ,t.DSP_ODR_2 + ,t.VID_KIND_3 + ,t.V_CD_3 + ,t.NAME_3 + ,t.DSP_ODR_3 + ,t.VID_KIND_4 + ,t.V_CD_4 + ,t.NAME_4 + ,t.DSP_ODR_4 + ,t.VID_KIND_5 + ,t.V_CD_5 + ,t.NAME_5 + ,t.DSP_ODR_5 + ,t.VID_KIND_6 + ,t.V_CD_6 + ,t.NAME_6 + ,t.DSP_ODR_6 + ,t.VID_KIND_7 + ,t.V_CD_7 + ,t.NAME_7 + ,t.DSP_ODR_7 + ,t.VID_KIND_8 + ,t.V_CD_8 + ,t.NAME_8 + ,t.DSP_ODR_8 + ,t.VID_KIND_9 + ,t.V_CD_9 + ,t.NAME_9 + ,t.DSP_ODR_9 + ,t.VID_KIND_10 + ,t.V_CD_10 + ,t.NAME_10 + ,t.DSP_ODR_10 + ,t.V_WHS_CD + ,t.START_DATE + ,t.END_DATE + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.mkr_org_horizon_v AS t + ON DUPLICATE KEY UPDATE + VID_KIND_1=t.VID_KIND_1 + ,V_CD_1=t.V_CD_1 + ,NAME_1=t.NAME_1 + ,DSP_ODR_1=t.DSP_ODR_1 + ,VID_KIND_2=t.VID_KIND_2 + ,V_CD_2=t.V_CD_2 + ,NAME_2=t.NAME_2 + ,DSP_ODR_2=t.DSP_ODR_2 + ,VID_KIND_3=t.VID_KIND_3 + ,V_CD_3=t.V_CD_3 + ,NAME_3=t.NAME_3 + ,DSP_ODR_3=t.DSP_ODR_3 + ,VID_KIND_4=t.VID_KIND_4 + ,V_CD_4=t.V_CD_4 + ,NAME_4=t.NAME_4 + ,DSP_ODR_4=t.DSP_ODR_4 + ,VID_KIND_5=t.VID_KIND_5 + ,V_CD_5=t.V_CD_5 + ,NAME_5=t.NAME_5 + ,DSP_ODR_5=t.DSP_ODR_5 + ,VID_KIND_6=t.VID_KIND_6 + ,V_CD_6=t.V_CD_6 + ,NAME_6=t.NAME_6 + ,DSP_ODR_6=t.DSP_ODR_6 + ,VID_KIND_7=t.VID_KIND_7 + ,V_CD_7=t.V_CD_7 + ,NAME_7=t.NAME_7 + ,DSP_ODR_7=t.DSP_ODR_7 + ,VID_KIND_8=t.VID_KIND_8 + ,V_CD_8=t.V_CD_8 + ,NAME_8=t.NAME_8 + ,DSP_ODR_8=t.DSP_ODR_8 + ,VID_KIND_9=t.VID_KIND_9 + ,V_CD_9=t.V_CD_9 + ,NAME_9=t.NAME_9 + ,DSP_ODR_9=t.DSP_ODR_9 + ,VID_KIND_10=t.VID_KIND_10 + ,V_CD_10=t.V_CD_10 + ,NAME_10=t.NAME_10 + ,DSP_ODR_10=t.DSP_ODR_10 + ,V_WHS_CD=t.V_WHS_CD + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V卸組織変換マスタ @@ -57,7 +572,51 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "org_cnv_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.org_cnv_mst_v", - _KEY_SRC_TABLE: "src05.org_cnv_mst_v" + _KEY_SRC_TABLE: "src05.org_cnv_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.org_cnv_mst_v ( + WHS_CD + ,WHS_SUB_CD + ,ORG_CD + ,SUB_NUM + ,V_ORG_CD + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.WHS_CD + ,t.WHS_SUB_CD + ,t.ORG_CD + ,t.SUB_NUM + ,t.V_ORG_CD + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.org_cnv_mst_v AS t + ON DUPLICATE KEY UPDATE + WHS_CD=t.WHS_CD + ,WHS_SUB_CD=t.WHS_SUB_CD + ,ORG_CD=t.ORG_CD + ,SUB_NUM=t.SUB_NUM + ,V_ORG_CD=t.V_ORG_CD + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V取引区分マスタ @@ -65,7 +624,45 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "tran_kbn_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", - _KEY_SRC_TABLE: "src05.tran_kbn_mst_v" + _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.tran_kbn_mst_v ( + V_TRAN_CD + ,SUB_NUM + ,NAME + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.V_TRAN_CD + ,t.SUB_NUM + ,t.NAME + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.tran_kbn_mst_v AS t + ON DUPLICATE KEY UPDATE + V_TRAN_CD=t.V_TRAN_CD + ,SUB_NUM=t.SUB_NUM + ,NAME=t.NAME + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V施設マスタ @@ -73,7 +670,90 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "fcl_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.fcl_mst_v", - _KEY_SRC_TABLE: "src05.fcl_mst_v" + _KEY_SRC_TABLE: "src05.fcl_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.fcl_mst_v ( + V_INST_CD + ,SUB_NUM + ,START_DATE + ,END_DATE + ,CLOSED_DT + ,FCL_NAME + ,FCL_KN_NAME + ,FCL_ABB_NAME + ,FCL_ABB_KN_NAME + ,MKR_CD + ,JSK_PROC_KBN + ,FMT_ADDR + ,FMT_KN_ADDR + ,POSTAL_CD + ,PRFT_CD + ,PRFT_NAME + ,CITY_NAME + ,ADDR_LINE_1 + ,TEL_NUM + ,ADMIN_KBN + ,FCL_TYPE + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.V_INST_CD + ,t.SUB_NUM + ,t.START_DATE + ,t.END_DATE + ,t.CLOSED_DT + ,t.FCL_NAME + ,t.FCL_KN_NAME + ,t.FCL_ABB_NAME + ,t.FCL_ABB_KN_NAME + ,t.MKR_CD + ,t.JSK_PROC_KBN + ,t.FMT_ADDR + ,t.FMT_KN_ADDR + ,t.POSTAL_CD + ,t.PRFT_CD + ,t.PRFT_NAME + ,t.CITY_NAME + ,t.ADDR_LINE_1 + ,t.TEL_NUM + ,t.ADMIN_KBN + ,t.FCL_TYPE + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.fcl_mst_v AS t + ON DUPLICATE KEY UPDATE + V_INST_CD=t.V_INST_CD + ,SUB_NUM=t.SUB_NUM + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,CLOSED_DT=t.CLOSED_DT + ,FCL_NAME=t.FCL_NAME + ,FCL_KN_NAME=t.FCL_KN_NAME + ,FCL_ABB_NAME=t.FCL_ABB_NAME + ,FCL_ABB_KN_NAME=t.FCL_ABB_KN_NAME + ,MKR_CD=t.MKR_CD + ,JSK_PROC_KBN=t.JSK_PROC_KBN + ,FMT_ADDR=t.FMT_ADDR + ,FMT_KN_ADDR=t.FMT_KN_ADDR + ,POSTAL_CD=t.POSTAL_CD + ,PRFT_CD=t.PRFT_CD + ,PRFT_NAME=t.PRFT_NAME + ,CITY_NAME=t.CITY_NAME + ,ADDR_LINE_1=t.ADDR_LINE_1 + ,TEL_NUM=t.TEL_NUM + ,ADMIN_KBN=t.ADMIN_KBN + ,FCL_TYPE=t.FCL_TYPE + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V製品マスタ @@ -81,7 +761,102 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "phm_prd_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.phm_prd_mst_v", - _KEY_SRC_TABLE: "src05.phm_prd_mst_v" + _KEY_SRC_TABLE: "src05.phm_prd_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.phm_prd_mst_v ( + PRD_CD + ,SUB_NUM + ,PRD_NAME + ,PRD_E_NAME + ,MKR_CD + ,MKR_INF_1 + ,MKR_INF_2 + ,PHM_ITM_CD + ,ITM_NAME + ,ITM_ABB_NAME + ,FORM_CD + ,FORM_NAME + ,VOL_CD + ,VOL_NAME + ,CONT_CD + ,CONT_NAME + ,PKG_CD + ,PKG_NAME + ,CNV_NUM + ,JSK_START_DT + ,PRD_SALE_KBN + ,JSK_PROC_KBN + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.PRD_CD + ,t.SUB_NUM + ,t.PRD_NAME + ,t.PRD_E_NAME + ,t.MKR_CD + ,t.MKR_INF_1 + ,t.MKR_INF_2 + ,t.PHM_ITM_CD + ,t.ITM_NAME + ,t.ITM_ABB_NAME + ,t.FORM_CD + ,t.FORM_NAME + ,t.VOL_CD + ,t.VOL_NAME + ,t.CONT_CD + ,t.CONT_NAME + ,t.PKG_CD + ,t.PKG_NAME + ,t.CNV_NUM + ,t.JSK_START_DT + ,t.PRD_SALE_KBN + ,t.JSK_PROC_KBN + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.phm_prd_mst_v AS t + ON DUPLICATE KEY UPDATE + PRD_CD=t.PRD_CD + ,SUB_NUM=t.SUB_NUM + ,PRD_NAME=t.PRD_NAME + ,PRD_E_NAME=t.PRD_E_NAME + ,MKR_CD=t.MKR_CD + ,MKR_INF_1=t.MKR_INF_1 + ,MKR_INF_2=t.MKR_INF_2 + ,PHM_ITM_CD=t.PHM_ITM_CD + ,ITM_NAME=t.ITM_NAME + ,ITM_ABB_NAME=t.ITM_ABB_NAME + ,FORM_CD=t.FORM_CD + ,FORM_NAME=t.FORM_NAME + ,VOL_CD=t.VOL_CD + ,VOL_NAME=t.VOL_NAME + ,CONT_CD=t.CONT_CD + ,CONT_NAME=t.CONT_NAME + ,PKG_CD=t.PKG_CD + ,PKG_NAME=t.PKG_NAME + ,CNV_NUM=t.CNV_NUM + ,JSK_START_DT=t.JSK_START_DT + ,PRD_SALE_KBN=t.PRD_SALE_KBN + ,JSK_PROC_KBN=t.JSK_PROC_KBN + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V製品価格マスタ @@ -89,7 +864,48 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "phm_price_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.phm_price_mst_v", - _KEY_SRC_TABLE: "src05.phm_price_mst_v" + _KEY_SRC_TABLE: "src05.phm_price_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.phm_price_mst_v ( + PHM_PRD_CD + ,PHM_PRICE_KIND + ,SUB_NUM + ,PRICE + ,START_DATE + ,END_DATE + ,DSP_ODR + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.PHM_PRD_CD + ,t.PHM_PRICE_KIND + ,t.SUB_NUM + ,t.PRICE + ,t.START_DATE + ,t.END_DATE + ,t.DSP_ODR + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.phm_price_mst_v AS t + ON DUPLICATE KEY UPDATE + PHM_PRD_CD=t.PHM_PRD_CD + ,PHM_PRICE_KIND=t.PHM_PRICE_KIND + ,SUB_NUM=t.SUB_NUM + ,PRICE=t.PRICE + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,DSP_ODR=t.DSP_ODR + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V施設統合マスタ @@ -97,7 +913,30 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "vop_hco_merge_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.vop_hco_merge_v", - _KEY_SRC_TABLE: "src05.vop_hco_merge_v" + _KEY_SRC_TABLE: "src05.vop_hco_merge_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.vop_hco_merge_v ( + V_INST_CD + ,V_INST_CD_MERG + ,APPLY_DT + ,MERGE_REASON + ,DWH_UPD_DT + ) + SELECT + t.V_INST_CD + ,t.V_INST_CD_MERG + ,t.APPLY_DT + ,t.MERGE_REASON + ,SYSDATE() + FROM org05.vop_hco_merge_v AS t + ON DUPLICATE KEY UPDATE + V_INST_CD=t.V_INST_CD + ,V_INST_CD_MERG=t.V_INST_CD_MERG + ,APPLY_DT=t.APPLY_DT + ,MERGE_REASON=t.MERGE_REASON + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # V卸得意先情報マスタ @@ -105,15 +944,112 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "whs_customer_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whs_customer_mst_v", - _KEY_SRC_TABLE: "src05.whs_customer_mst_v" + _KEY_SRC_TABLE: "src05.whs_customer_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whs_customer_mst_v ( + WHS_CD + ,WHS_SUB_CD + ,CUSTOMER_CD + ,SUB_NUM + ,START_DATE + ,END_DATE + ,WHS_ORG_CD + ,SRC_ORG_CD + ,NAME + ,KN_NAME + ,ADDR + ,KN_ADDR + ,POSTAL_CD + ,TEL_NUM + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.WHS_CD + ,t.WHS_SUB_CD + ,t.CUSTOMER_CD + ,t.SUB_NUM + ,t.START_DATE + ,t.END_DATE + ,t.WHS_ORG_CD + ,t.SRC_ORG_CD + ,t.NAME + ,t.KN_NAME + ,t.ADDR + ,t.KN_ADDR + ,t.POSTAL_CD + ,t.TEL_NUM + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.whs_customer_mst_v AS t + ON DUPLICATE KEY UPDATE + WHS_CD=t.WHS_CD + ,WHS_SUB_CD=t.WHS_SUB_CD + ,CUSTOMER_CD=t.CUSTOMER_CD + ,SUB_NUM=t.SUB_NUM + ,START_DATE=t.START_DATE + ,END_DATE=t.END_DATE + ,WHS_ORG_CD=t.WHS_ORG_CD + ,SRC_ORG_CD=t.SRC_ORG_CD + ,NAME=t.NAME + ,KN_NAME=t.KN_NAME + ,ADDR=t.ADDR + ,KN_ADDR=t.KN_ADDR + ,POSTAL_CD=t.POSTAL_CD + ,TEL_NUM=t.TEL_NUM + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # MDBコード変換表 CONDKEY_MDB_CONV_MST: { _KEY_FILE_PREFIX: "mdb_conv_mst_", _KEY_FILE_SUFFIX: ".tsv", - _KEY_ORG_TABLE: "org05.mdb_conv_mst_v", - _KEY_SRC_TABLE: "src05.mdb_conv_mst_v" + _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", + _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.mdb_cnv_mst_v ( + HCO_VID_V + ,SUB_NUM + ,MDB_CD + ,RELIABILITY + ,START_DATE + ,REC_STS_KBN + ,INS_DT + ,UPD_DT + ,DWH_UPD_DT + ) + SELECT + t.HCO_VID_V + ,t.SUB_NUM + ,t.MDB_CD + ,t.RELIABILITY + ,t.START_DATE + ,t.REC_STS_KBN + ,t.INS_DT + ,t.UPD_DT + ,SYSDATE() + FROM org05.mdb_cnv_mst_v AS t + ON DUPLICATE KEY UPDATE + HCO_VID_V=t.HCO_VID_V + ,SUB_NUM=t.SUB_NUM + ,MDB_CD=t.MDB_CD + ,RELIABILITY=t.RELIABILITY + ,START_DATE=t.START_DATE + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,UPD_DT=t.UPD_DT + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # 卸在庫データ @@ -121,7 +1057,105 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "stock_slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whole_stock", - _KEY_SRC_TABLE: "src05.whole_stock" + _KEY_SRC_TABLE: "src05.whole_stock", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.whole_stock ( + REC_DATA + ,REC_WHS_CD + ,REC_WHS_SUB_CD + ,REC_STO_PLACE + ,REC_STOCK_YMD + ,REC_COMM_CD + ,REC_QTY + ,REC_STOCK_NO_SIGN + ,REC_JAN_CD + ,FREE_ITEM + ,REC_YMD + ,SALE_DATA_CAT + ,SLIP_FILE_NAME + ,SLIP_MGT_NUM + ,ROW_NUM + ,EXEC_DT + ,ERR_FLG1 + ,ERR_FLG2 + ,ERR_FLG3 + ,ERR_FLG4 + ,ERR_FLG5 + ,ERR_FLG6 + ,ERR_FLG7 + ,ERR_FLG8 + ,ERR_FLG9 + ,ERR_FLG10 + ,REC_STS_KBN + ,INS_DT + ,INS_USR + ,DWH_UPD_DT + ) + SELECT + t.REC_DATA + ,t.REC_WHS_CD + ,t.REC_WHS_SUB_CD + ,t.REC_STO_PLACE + ,t.REC_STOCK_YMD + ,t.REC_COMM_CD + ,t.REC_QTY + ,t.REC_STOCK_NO_SIGN + ,t.REC_JAN_CD + ,t.FREE_ITEM + ,t.REC_YMD + ,t.SALE_DATA_CAT + ,t.SLIP_FILE_NAME + ,t.SLIP_MGT_NUM + ,t.ROW_NUM + ,t.EXEC_DT + ,t.ERR_FLG1 + ,t.ERR_FLG2 + ,t.ERR_FLG3 + ,t.ERR_FLG4 + ,t.ERR_FLG5 + ,t.ERR_FLG6 + ,t.ERR_FLG7 + ,t.ERR_FLG8 + ,t.ERR_FLG9 + ,t.ERR_FLG10 + ,t.REC_STS_KBN + ,t.INS_DT + ,t.INS_USR + ,SYSDATE() + FROM org05.whole_stock AS t + ON DUPLICATE KEY UPDATE + REC_DATA=t.REC_DATA + ,REC_WHS_CD=t.REC_WHS_CD + ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD + ,REC_STO_PLACE=t.REC_STO_PLACE + ,REC_STOCK_YMD=t.REC_STOCK_YMD + ,REC_COMM_CD=t.REC_COMM_CD + ,REC_QTY=t.REC_QTY + ,REC_STOCK_NO_SIGN=t.REC_STOCK_NO_SIGN + ,REC_JAN_CD=t.REC_JAN_CD + ,FREE_ITEM=t.FREE_ITEM + ,REC_YMD=t.REC_YMD + ,SALE_DATA_CAT=t.SALE_DATA_CAT + ,SLIP_FILE_NAME=t.SLIP_FILE_NAME + ,SLIP_MGT_NUM=t.SLIP_MGT_NUM + ,ROW_NUM=t.ROW_NUM + ,EXEC_DT=t.EXEC_DT + ,ERR_FLG1=t.ERR_FLG1 + ,ERR_FLG2=t.ERR_FLG2 + ,ERR_FLG3=t.ERR_FLG3 + ,ERR_FLG4=t.ERR_FLG4 + ,ERR_FLG5=t.ERR_FLG5 + ,ERR_FLG6=t.ERR_FLG6 + ,ERR_FLG7=t.ERR_FLG7 + ,ERR_FLG8=t.ERR_FLG8 + ,ERR_FLG9=t.ERR_FLG9 + ,ERR_FLG10=t.ERR_FLG10 + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,INS_USR=t.INS_USR + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # 生物由来データ @@ -129,7 +1163,252 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "bio_slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.bio_sales", - _KEY_SRC_TABLE: "src05.bio_sales" + _KEY_SRC_TABLE: "src05.bio_sales", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.bio_sales ( + REC_DATA + ,REC_WHS_CD + ,REC_WHS_SUB_CD + ,REC_WHS_ORG_CD + ,REC_CUST_CD + ,REC_COMM_CD + ,REC_TRAN_KBN + ,REV_HSDNYMD_WRK + ,REV_HSDNYMD_SRK + ,REC_URAG_NUM + ,REC_COMM_NAME + ,REC_NONYU_FCL_NAME + ,REC_NONYU_FCL_ADDR + ,REC_LOT_NUM1 + ,REC_QTY1 + ,REC_LOT_NUM2 + ,REC_QTY2 + ,REC_LOT_NUM3 + ,REC_QTY3 + ,REC_YMD + ,SALE_DATA_CAT + ,SLIP_FILE_NAME + ,SLIP_MGT_NUM + ,ROW_NUM + ,HSDN_YMD + ,EXEC_DT + ,V_TRAN_CD + ,TRAN_KBN_NAME + ,WHS_ORG_CD + ,V_WHSORG_CD + ,WHS_ORG_NAME + ,WHS_ORG_KN + ,V_WHS_CD + ,WHS_NAME + ,NONYU_FCL_CD + ,V_INST_CD + ,V_INST_NAME + ,V_INST_KN + ,V_INST_ADDR + ,COMM_CD + ,PRODUCT_NAME + ,HTDNYMD_ERR_KBN + ,PRD_EXIS_KBN + ,FCL_EXIS_KBN + ,QTY1 + ,QTY2 + ,QTY3 + ,SLIP_ORG_KBN + ,BEF_SLIP_MGT_NUM + ,WHS_REP_COMM_NAME + ,WHS_REP_NONYU_FCL_NAME + ,WHS_REP_NONYU_FCL_ADDR + ,ERR_FLG1 + ,ERR_FLG2 + ,ERR_FLG3 + ,ERR_FLG4 + ,ERR_FLG5 + ,ERR_FLG6 + ,ERR_FLG7 + ,ERR_FLG8 + ,ERR_FLG9 + ,ERR_FLG10 + ,ERR_FLG11 + ,ERR_FLG12 + ,ERR_FLG13 + ,ERR_FLG14 + ,ERR_FLG15 + ,ERR_FLG16 + ,ERR_FLG17 + ,ERR_FLG18 + ,ERR_FLG19 + ,ERR_FLG20 + ,KJYO_YM + ,TKSNBK_KBN + ,FCL_EXEC_KBN + ,REC_STS_KBN + ,INS_DT + ,INS_USR + ,DWH_UPD_DT + ) + SELECT + t.REC_DATA + ,t.REC_WHS_CD + ,t.REC_WHS_SUB_CD + ,t.REC_WHS_ORG_CD + ,t.REC_CUST_CD + ,t.REC_COMM_CD + ,t.REC_TRAN_KBN + ,t.REV_HSDNYMD_WRK + ,t.REV_HSDNYMD_SRK + ,t.REC_URAG_NUM + ,t.REC_COMM_NAME + ,t.REC_NONYU_FCL_NAME + ,t.REC_NONYU_FCL_ADDR + ,t.REC_LOT_NUM1 + ,t.REC_QTY1 + ,t.REC_LOT_NUM2 + ,t.REC_QTY2 + ,t.REC_LOT_NUM3 + ,t.REC_QTY3 + ,t.REC_YMD + ,t.SALE_DATA_CAT + ,t.SLIP_FILE_NAME + ,t.SLIP_MGT_NUM + ,t.ROW_NUM + ,t.HSDN_YMD + ,t.EXEC_DT + ,t.V_TRAN_CD + ,t.TRAN_KBN_NAME + ,t.WHS_ORG_CD + ,t.V_WHSORG_CD + ,t.WHS_ORG_NAME + ,t.WHS_ORG_KN + ,t.V_WHS_CD + ,t.WHS_NAME + ,t.NONYU_FCL_CD + ,t.V_INST_CD + ,t.V_INST_NAME + ,t.V_INST_KN + ,t.V_INST_ADDR + ,t.COMM_CD + ,t.PRODUCT_NAME + ,t.HTDNYMD_ERR_KBN + ,t.PRD_EXIS_KBN + ,t.FCL_EXIS_KBN + ,t.QTY1 + ,t.QTY2 + ,t.QTY3 + ,t.SLIP_ORG_KBN + ,t.BEF_SLIP_MGT_NUM + ,t.WHS_REP_COMM_NAME + ,t.WHS_REP_NONYU_FCL_NAME + ,t.WHS_REP_NONYU_FCL_ADDR + ,t.ERR_FLG1 + ,t.ERR_FLG2 + ,t.ERR_FLG3 + ,t.ERR_FLG4 + ,t.ERR_FLG5 + ,t.ERR_FLG6 + ,t.ERR_FLG7 + ,t.ERR_FLG8 + ,t.ERR_FLG9 + ,t.ERR_FLG10 + ,t.ERR_FLG11 + ,t.ERR_FLG12 + ,t.ERR_FLG13 + ,t.ERR_FLG14 + ,t.ERR_FLG15 + ,t.ERR_FLG16 + ,t.ERR_FLG17 + ,t.ERR_FLG18 + ,t.ERR_FLG19 + ,t.ERR_FLG20 + ,t.KJYO_YM + ,t.TKSNBK_KBN + ,t.FCL_EXEC_KBN + ,t.REC_STS_KBN + ,t.INS_DT + ,t.INS_USR + ,SYSDATE() + FROM org05.bio_sales AS t + ON DUPLICATE KEY UPDATE + REC_DATA=t.REC_DATA + ,REC_WHS_CD=t.REC_WHS_CD + ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD + ,REC_WHS_ORG_CD=t.REC_WHS_ORG_CD + ,REC_CUST_CD=t.REC_CUST_CD + ,REC_COMM_CD=t.REC_COMM_CD + ,REC_TRAN_KBN=t.REC_TRAN_KBN + ,REV_HSDNYMD_WRK=t.REV_HSDNYMD_WRK + ,REV_HSDNYMD_SRK=t.REV_HSDNYMD_SRK + ,REC_URAG_NUM=t.REC_URAG_NUM + ,REC_COMM_NAME=t.REC_COMM_NAME + ,REC_NONYU_FCL_NAME=t.REC_NONYU_FCL_NAME + ,REC_NONYU_FCL_ADDR=t.REC_NONYU_FCL_ADDR + ,REC_LOT_NUM1=t.REC_LOT_NUM1 + ,REC_QTY1=t.REC_QTY1 + ,REC_LOT_NUM2=t.REC_LOT_NUM2 + ,REC_QTY2=t.REC_QTY2 + ,REC_LOT_NUM3=t.REC_LOT_NUM3 + ,REC_QTY3=t.REC_QTY3 + ,REC_YMD=t.REC_YMD + ,SALE_DATA_CAT=t.SALE_DATA_CAT + ,SLIP_FILE_NAME=t.SLIP_FILE_NAME + ,SLIP_MGT_NUM=t.SLIP_MGT_NUM + ,ROW_NUM=t.ROW_NUM + ,HSDN_YMD=t.HSDN_YMD + ,EXEC_DT=t.EXEC_DT + ,V_TRAN_CD=t.V_TRAN_CD + ,TRAN_KBN_NAME=t.TRAN_KBN_NAME + ,WHS_ORG_CD=t.WHS_ORG_CD + ,V_WHSORG_CD=t.V_WHSORG_CD + ,WHS_ORG_NAME=t.WHS_ORG_NAME + ,WHS_ORG_KN=t.WHS_ORG_KN + ,V_WHS_CD=t.V_WHS_CD + ,WHS_NAME=t.WHS_NAME + ,NONYU_FCL_CD=t.NONYU_FCL_CD + ,V_INST_CD=t.V_INST_CD + ,V_INST_NAME=t.V_INST_NAME + ,V_INST_KN=t.V_INST_KN + ,V_INST_ADDR=t.V_INST_ADDR + ,COMM_CD=t.COMM_CD + ,PRODUCT_NAME=t.PRODUCT_NAME + ,HTDNYMD_ERR_KBN=t.HTDNYMD_ERR_KBN + ,PRD_EXIS_KBN=t.PRD_EXIS_KBN + ,FCL_EXIS_KBN=t.FCL_EXIS_KBN + ,QTY1=t.QTY1 + ,QTY2=t.QTY2 + ,QTY3=t.QTY3 + ,SLIP_ORG_KBN=t.SLIP_ORG_KBN + ,BEF_SLIP_MGT_NUM=t.BEF_SLIP_MGT_NUM + ,WHS_REP_COMM_NAME=t.WHS_REP_COMM_NAME + ,WHS_REP_NONYU_FCL_NAME=t.WHS_REP_NONYU_FCL_NAME + ,WHS_REP_NONYU_FCL_ADDR=t.WHS_REP_NONYU_FCL_ADDR + ,ERR_FLG1=t.ERR_FLG1 + ,ERR_FLG2=t.ERR_FLG2 + ,ERR_FLG3=t.ERR_FLG3 + ,ERR_FLG4=t.ERR_FLG4 + ,ERR_FLG5=t.ERR_FLG5 + ,ERR_FLG6=t.ERR_FLG6 + ,ERR_FLG7=t.ERR_FLG7 + ,ERR_FLG8=t.ERR_FLG8 + ,ERR_FLG9=t.ERR_FLG9 + ,ERR_FLG10=t.ERR_FLG10 + ,ERR_FLG11=t.ERR_FLG11 + ,ERR_FLG12=t.ERR_FLG12 + ,ERR_FLG13=t.ERR_FLG13 + ,ERR_FLG14=t.ERR_FLG14 + ,ERR_FLG15=t.ERR_FLG15 + ,ERR_FLG16=t.ERR_FLG16 + ,ERR_FLG17=t.ERR_FLG17 + ,ERR_FLG18=t.ERR_FLG18 + ,ERR_FLG19=t.ERR_FLG19 + ,ERR_FLG20=t.ERR_FLG20 + ,KJYO_YM=t.KJYO_YM + ,TKSNBK_KBN=t.TKSNBK_KBN + ,FCL_EXEC_KBN=t.FCL_EXEC_KBN + ,REC_STS_KBN=t.REC_STS_KBN + ,INS_DT=t.INS_DT + ,INS_USR=t.INS_USR + ,DWH_UPD_DT=SYSDATE() + ; + """) }, # ロットマスタデータ @@ -137,7 +1416,36 @@ class VjskRecvFileMapper: _KEY_FILE_PREFIX: "lot_num_ms_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.lot_num_mst", - _KEY_SRC_TABLE: "src05.lot_num_mst" + _KEY_SRC_TABLE: "src05.lot_num_mst", + _KEY_UPSERT_SQL: textwrap.dedent("""\ + INSERT INTO src05.lot_num_mst ( + SER_NUM + ,LOT_NUM + ,EXPR_DT + ,FRST_MOV_DT + ,INS_DT + ,INS_USR + ,DWH_UPD_DT + ) + SELECT + t.SER_NUM + ,t.LOT_NUM + ,t.EXPR_DT + ,t.FRST_MOV_DT + ,t.INS_DT + ,t.INS_USR + ,SYSDATE() + FROM org05.lot_num_mst AS t + ON DUPLICATE KEY UPDATE + SER_NUM=t.SER_NUM + ,LOT_NUM=t.LOT_NUM + ,EXPR_DT=t.EXPR_DT + ,FRST_MOV_DT=t.FRST_MOV_DT + ,INS_DT=t.INS_DT + ,INS_USR=t.INS_USR + ,DWH_UPD_DT=SYSDATE() + ; + """) }, } @@ -165,12 +1473,19 @@ class VjskRecvFileMapper: ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_SRC_TABLE) return ret + def get_upsert_sql(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_UPSERT_SQL) + return ret + def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: ret = None filename = s3_file_path[s3_file_path.rfind("/") + 1:] for condkey in self._VJSK_INTERFACE_MAPPING: element = self._VJSK_INTERFACE_MAPPING.get(condkey) - if filename.startswith(element.get(self._KEY_FILE_PREFIX)) and filename.endswith(element.get(self._KEY_FILE_SUFFIX)): + if filename.startswith(element.get(self._KEY_FILE_PREFIX)) \ + and filename.endswith(element.get(self._KEY_FILE_SUFFIX)): ret = condkey break return ret From cab7db1e0bc60a99b318a89f161286ddb3ec2b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 9 May 2023 09:22:31 +0900 Subject: [PATCH 226/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E4=BD=9C=E6=A5=AD=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 1475 +++++++++++++++++ .../utmp_tables/tables/com_inst_att.py | 690 ++++++++ .../ultmarc_table_mapper_factory.py | 4 +- 3 files changed, 2168 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py new file mode 100644 index 00000000..6f9de396 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -0,0 +1,1475 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst_att import ComInstAtt + + +class ComInstAttMapper(UltmarcTableMapper): + """レイアウト区分111: COM_施設属税 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst_att + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_inst_att + ( + dcf_dsf_inst_cd, + dpc_flag, + dpc_specday, + dpc_cancelday, + predpc_flag, + predpc_specday, + predpc_cancelday, + cancer_flag, + cancer_specday, + cancer_cancelday, + funchpflag, + funchpokdate, + funchpcandate, + areasuphpflag, + areasuphpintrate, + areasuphpokdate, + areasuphpcandate, + acuthpaddflag, + acuthpaddokdate, + acuthpaddcandate, + genadmisiionflag, + genadmisiionfokdate, + genadmisiionfcandate, + assistanceflag, + assistanceokdate, + assistancecandate, + diagnosistreatment_flag, + diagnosistreatment_specday, + diagnosistreatment_cancelday, + safety_flag, + safety_specday, + safety_cancelday, + highrisk_flag, + highrisk_specday, + highrisk_cancelday, + infantandholiday_flag, + infantandholiday_specday, + infantandholiday_cancelday, + ophpflag, + ophpokdate, + ophpcandate, + critical_flag, + critical_code01, + critical_code02, + critical_code03, + critical_code04, + critical_code05, + critical_code06, + critical_code07, + critical_code08, + critical_code09, + critical_code10, + critical_code11, + critical_code12, + critical_code13, + critical_code14, + critical_code15, + critical_code16, + critical_code17, + critical_code18, + critical_code19, + critical_code20, + drgmgthpflag, + drgmgthpokdate, + drgmgthpcandate, + imagediagnosis_flag, + imagediagnosis_specifiedday, + imagediagnosis_cancelday, + chemotherapy_flag, + chemotherapy_specday, + chemotherapy_cancelday, + rehabilitation_flag, + rehabilitation_code01, + rehabilitation_code02, + rehabilitation_code03, + rehabilitation_code04, + rehabilitation_code05, + rehabilitation_code06, + rehabilitation_code07, + rehabilitation_code08, + rehabilitation_code09, + rehabilitation_code10, + anesthetizingmanage_flag, + anesthetizingmanage_specday, + anesthetizingmanage_cancelday, + homerecuperation_flag, + homerecuperation_specday, + homerecuperation_cancelday, + synthesiswhenstaying_flag, + synthesiswhenstaying_specday, + synthesiswhenstaying_cancelday, + homelateflag, + homelateokday, + homelatecanday, + caremixkind, + fullmoveflag, + resthpflag, + resthpcarekind, + resthpbednum, + resthpokdate, + resthpcandate, + resthpcarenrskind, + resthpcarebednum, + resthpcareokdate, + resthpcarecandate, + resthpsbednum, + nrmhpflag, + nrmhpcarekind, + nrmhpbedtotalnum, + menthpflag, + menthpcarekind, + menthpbednum, + tubhpflag, + tubhpcarekind, + tubhpbednum, + infhpflag, + infhpflag1, + infhpflag2, + infhpbedflag, + infhpbednum, + hospiceflag, + hospicebednum, + hospiceokdate, + hospicecandate, + hpfuncestflag, + hpfuncestkind, + hpfuncestokdate, + hpfuncestcandate, + clolyhpkind, + clolyhpokdate, + clolyhpcandate, + clhpkind, + clhpokdate, + clhpcandate, + cldephpkind, + cldephpokdate, + cldephpcandate, + disasthpflag, + d1emerhpflag, + d2emerhpflag, + d3emerhpflag, + emergencyclinic, + trialcoreflag, + trialcore_div, + trialcoreokdate, + trialcorecandate, + dementiaflag, + dementiaokdate, + dementiacandate, + sphealth_exploration, + sphealth_guidance, + hiadhpflag, + hiadhpcode1, + hiadhpkind1, + hiadhpcode2, + hiadhpkind2, + hiadhpcode3, + hiadhpkind3, + hiadhpcode4, + hiadhpkind4, + hiadhpcode5, + hiadhpkind5, + hiadhpcode6, + hiadhpkind6, + hiadhpcode7, + hiadhpkind7, + hiadhpcode8, + hiadhpkind8, + hiadhpcode9, + hiadhpkind9, + hiadhpcode10, + hiadhpkind10, + hiadhpcode11, + hiadhpkind11, + hiadhpcode12, + hiadhpkind12, + hiadhpcode13, + hiadhpkind13, + hiadhpcode14, + hiadhpkind14, + hiadhpcode15, + hiadhpkind15, + hiadhpcode16, + hiadhpkind16, + hiadhpcode17, + hiadhpkind17, + hiadhpcode18, + hiadhpkind18, + hiadhpcode19, + hiadhpkind19, + hiadhpcode20, + hiadhpkind20, + hiadhpcode21, + hiadhpkind21, + hiadhpcode22, + hiadhpkind22, + hiadhpcode23, + hiadhpkind23, + hiadhpcode24, + hiadhpkind24, + hiadhpcode25, + hiadhpkind25, + hiadhpcode26, + hiadhpkind26, + hiadhpcode27, + hiadhpkind27, + hiadhpcode28, + hiadhpkind28, + hiadhpcode29, + hiadhpkind29, + hiadhpcode30, + hiadhpkind30, + hiadhpcode31, + hiadhpkind31, + hiadhpcode32, + hiadhpkind32, + hiadhpcode33, + hiadhpkind33, + hiadhpcode34, + hiadhpkind34, + hiadhpcode35, + hiadhpkind35, + hiadhpcode36, + hiadhpkind36, + hiadhpcode37, + hiadhpkind37, + hiadhpcode38, + hiadhpkind38, + hiadhpcode39, + hiadhpkind39, + hiadhpcode40, + hiadhpkind40, + hitechhpflag, + hitechhpkind1, + hitechhpkind2, + hitechhpkind3, + hitechhpkind4, + hitechhpkind5, + hitechhpkind6, + hitechhpkind7, + hitechhpkind8, + hitechhpkind9, + hitechhpkind10, + hitechhpkind11, + hitechhpkind12, + hitechhpkind13, + hitechhpkind14, + hitechhpkind15, + hitechhpkind16, + hitechhpkind17, + hitechhpkind18, + hitechhpkind19, + hitechhpkind20, + policymedical_flag, + policymedical_code01, + policymedical_content01, + policymedical_code02, + policymedical_content02, + policymedical_code03, + policymedical_content03, + policymedical_code04, + policymedical_content04, + policymedical_code05, + policymedical_content05, + policymedical_code06, + policymedical_content06, + policymedical_code07, + policymedical_content07, + policymedical_code08, + policymedical_content08, + policymedical_code09, + policymedical_content09, + policymedical_code10, + policymedical_content10, + policymedical_code11, + policymedical_content11, + policymedical_code12, + policymedical_content12, + policymedical_code13, + policymedical_content13, + policymedical_code14, + policymedical_content14, + policymedical_code15, + policymedical_content15, + policymedical_code16, + policymedical_content16, + policymedical_code17, + policymedical_content17, + policymedical_code18, + policymedical_content18, + policymedical_code19, + policymedical_content19, + policymedical_code20, + policymedical_content20, + visitcarestflag, + visitcarestation_id, + visitcarestation_code, + visitcarestation_yobi, + opendate, + regist_ymd, + update_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :dpc_flag, + :dpc_spec_day, + :dpc_cancel_day, + :predpc_flag, + :predpc_spec_day, + :predpc_cancel_day, + :cancer_flag, + :cancer_spec_day, + :cancer_cancel_day, + :funchp_flag, + :funchp_ok_date, + :funchp_can_date, + :areasuphp_flag, + :areasuphp_intrate, + :areasuphp_ok_date, + :areasuphp_can_date, + :acuthp_add_flag, + :acuthp_add_ok_date, + :acuthp_add_can_date, + :genadmisiion_flag, + :genadmisiion_ok_date, + :genadmisiion_can_date, + :assistance_flag, + :assistance_ok_date, + :assistance_can_date, + :diagnosis_treatment_flag, + :diagnosis_treatment_spec_day, + :diagnosis_treatment_cancel_day, + :safety_flag, + :safety_spec_day, + :safety_cancel_day, + :highrisk_flag, + :highrisk_spec_day, + :highrisk_cancel_day, + :infant_and_holiday_flag, + :infant_and_holiday_spec_day, + :infant_and_holiday_cancel_day, + :ophp_flag, + :ophpok_date, + :ophpcan_date, + :critical_flag, + :critical_code01, + :critical_code02, + :critical_code03, + :critical_code04, + :critical_code05, + :critical_code06, + :critical_code07, + :critical_code08, + :critical_code09, + :critical_code10, + :critical_code11, + :critical_code12, + :critical_code13, + :critical_code14, + :critical_code15, + :critical_code16, + :critical_code17, + :critical_code18, + :critical_code19, + :critical_code20, + :drgmgthp_flag, + :drgmgthp_ok_date, + :drgmgthp_can_date, + :image_diagnosis_flag, + :image_diagnosis_specified_day, + :image_diagnosis_cancel_day, + :chemotherapy_flag, + :chemotherapy_spec_day, + :chemotherapy_cancel_day, + :rehabilitation_flag, + :rehabilitation_code01, + :rehabilitation_code02, + :rehabilitation_code03, + :rehabilitation_code04, + :rehabilitation_code05, + :rehabilitation_code06, + :rehabilitation_code07, + :rehabilitation_code08, + :rehabilitation_code09, + :rehabilitation_code10, + :anesthetizing_manage_flag, + :anesthetizing_manage_spec_day, + :anesthetizing_manage_can_day, + :home_recuperation_flag, + :home_recuperation_specday, + :home_recuperation_cancelday, + :synthesis_when_staying_flag, + :synthesis_when_staying_spec_day, + :synthesis_when_staying_can_day, + :home_late_flag, + :home_late_ok_day, + :home_late_can_day, + :caremix_kind, + :fullmove_flag, + :resthp_flag, + :resthp_care_kind, + :resthp_bed_num, + :resthp_ok_date, + :resthp_can_date, + :resthp_care_nrs_kind, + :resthp_care_bed_num, + :resthp_care_ok_date, + :resthp_care_can_date, + :resthp_sbed_num, + :nrmhp_flag, + :nrmhp_care_kind, + :nrmhp_bed_total_num, + :menthp_flag, + :menthp_care_kind, + :menthp_bed_num, + :tubhp_flag, + :tubhp_care_kind, + :tubhp_bed_num, + :infhp_flag, + :infhp_flag1, + :infhp_flag2, + :infhp_bed_flag, + :infhp_bed_num, + :hospice_flag, + :hospice_bed_num, + :hospice_ok_date, + :hospice_can_date, + :hpfunce_st_flag, + :hpfunce_st_kind, + :hpfunce_st_ok_date, + :hpfunce_st_can_date, + :clolyhp_kind, + :clolyhp_ok_date, + :clolyhp_can_date, + :clhp_kind, + :clhp_ok_date, + :clhp_can_date, + :cldephp_kind, + :cldephp_ok_date, + :cldephp_can_date, + :disasthp_flag, + :d1emerhp_flag, + :d2emerhp_flag, + :d3emerhp_flag, + :emergency_clinic, + :trial_core_flag, + :trial_core_div, + :trial_core_ok_date, + :trial_core_can_date, + :dementia_flag, + :dementia_okd_ate, + :dementia_can_date, + :sphealth_exploration, + :sphealth_guidance, + :hiadhp_flag, + :hiadhp_code1, + :hiadhp_kind1, + :hiadhp_code2, + :hiadhp_kind2, + :hiadhp_code3, + :hiadhp_kind3, + :hiadhp_code4, + :hiadhp_kind4, + :hiadhp_code5, + :hiadhp_kind5, + :hiadhp_code6, + :hiadhp_kind6, + :hiadhp_code7, + :hiadhp_kind7, + :hiadhp_code8, + :hiadhp_kind8, + :hiadhp_code9, + :hiadhp_kind9, + :hiadhp_code10, + :hiadhp_kind10, + :hiadhp_code11, + :hiadhp_kind11, + :hiadhp_code12, + :hiadhp_kind12, + :hiadhp_code13, + :hiadhp_kind13, + :hiadhp_code14, + :hiadhp_kind14, + :hiadhp_code15, + :hiadhp_kind15, + :hiadhp_code16, + :hiadhp_kind16, + :hiadhp_code17, + :hiadhp_kind17, + :hiadhp_code18, + :hiadhp_kind18, + :hiadhp_code19, + :hiadhp_kind19, + :hiadhp_code20, + :hiadhp_kind20, + :hiadhp_code21, + :hiadhp_kind21, + :hiadhp_code22, + :hiadhp_kind22, + :hiadhp_code23, + :hiadhp_kind23, + :hiadhp_code24, + :hiadhp_kind24, + :hiadhp_code25, + :hiadhp_kind25, + :hiadhp_code26, + :hiadhp_kind26, + :hiadhp_code27, + :hiadhp_kind27, + :hiadhp_code28, + :hiadhp_kind28, + :hiadhp_code29, + :hiadhp_kind29, + :hiadhp_code30, + :hiadhp_kind30, + :hiadhp_code31, + :hiadhp_kind31, + :hiadhp_code32, + :hiadhp_kind32, + :hiadhp_code33, + :hiadhp_kind33, + :hiadhp_code34, + :hiadhp_kind34, + :hiadhp_code35, + :hiadhp_kind35, + :hiadhp_code36, + :hiadhp_kind36, + :hiadhp_code37, + :hiadhp_kind37, + :hiadhp_code38, + :hiadhp_kind38, + :hiadhp_code39, + :hiadhp_kind39, + :hiadhp_code40, + :hiadhp_kind40, + :hitechhp_flag, + :hitechhp_kind1, + :hitechhp_kind2, + :hitechhp_kind3, + :hitechhp_kind4, + :hitechhp_kind5, + :hitechhp_kind6, + :hitechhp_kind7, + :hitechhp_kind8, + :hitechhp_kind9, + :hitechhp_kind10, + :hitechhp_kind11, + :hitechhp_kind12, + :hitechhp_kind13, + :hitechhp_kind14, + :hitechhp_kind15, + :hitechhp_kind16, + :hitechhp_kind17, + :hitechhp_kind18, + :hitechhp_kind19, + :hitechhp_kind20, + :policy_medical_flag, + :policy_medical_code01, + :policy_medical_content01, + :policy_medical_code02, + :policy_medical_content02, + :policy_medical_code03, + :policy_medical_content03, + :policy_medical_code04, + :policy_medical_content04, + :policy_medical_code05, + :policy_medical_content05, + :policy_medical_code06, + :policy_medical_content06, + :policy_medical_code07, + :policy_medical_content07, + :policy_medical_code08, + :policy_medical_content08, + :policy_medical_code09, + :policy_medical_content09, + :policy_medical_code10, + :policy_medical_content10, + :policy_medical_code11, + :policy_medical_content11, + :policy_medical_code12, + :policy_medical_content12, + :policy_medical_code13, + :policy_medical_content13, + :policy_medical_code14, + :policy_medical_content14, + :policy_medical_code15, + :policy_medical_content15, + :policy_medical_code16, + :policy_medical_content16, + :policy_medical_code17, + :policy_medical_content17, + :policy_medical_code18, + :policy_medical_content18, + :policy_medical_code19, + :policy_medical_content19, + :policy_medical_code20, + :policy_medical_content20, + :visitcarest_flag, + :visitcarestation_id, + :visitcarestation_code, + :visitcarestation_yobi, + :open_date, + :execute_date_str_ymd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_inst_att + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_inst_att + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + record: ComInstAtt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInstAtt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'C' and self.record.adddel_div == 1: + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.__make_upsert_query() + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + self.queries.append(self.INSERT_QUERY) + return + + # 存在する場合はUpdate + set_clauses = [] + # DPC対象病院 + if len(self.record.dpc_flag) > 0: + set_clauses.append('dpc_flag = :dpc_flag') + set_clauses.append('dpc_specday = :dpc_spec_day') + set_clauses.append('dpc_cancelday = :dpc_cancel_day') + if self.record.dpc_flag == '@': + self.query_parameter['dpc_flag'] = '' + self.query_parameter['dpc_spec_day'] = '' + self.query_parameter['dpc_cancel_day'] = '' + + # DPC準備病院 + if len(self.record.predpc_flag) > 0: + set_clauses.append('predpc_flag = :predpc_flag') + set_clauses.append('predpc_specday = :predpc_spec_day') + set_clauses.append('predpc_cancelday = :predpc_cancel_day') + if self.record.predpc_flag == '@': + self.query_parameter['predpc_flag'] = '' + self.query_parameter['predpc_spec_day'] = '' + self.query_parameter['predpc_cancel_day'] = '' + + # がん診療連携拠点病院 + if len(self.record.cancer_flag) > 0: + set_clauses.append('cancer_flag = :cancer_flag') + set_clauses.append('cancer_specday = :cancer_spec_day') + set_clauses.append('cancer_cancelday = :cancer_cancel_day') + if self.record.cancer_flag == '@': + self.query_parameter['cancer_flag'] = '' + self.query_parameter['cancer_spec_day'] = '' + self.query_parameter['cancer_cancel_day'] = '' + + # 特定機能病院 + if len(self.record.funchp_flag) > 0: + set_clauses.append('funchpflag = :funchp_flag') + set_clauses.append('funchpokdate = :funchp_ok_date') + set_clauses.append('funchpcandate = :funchp_can_date') + if self.record.funchp_flag == '@': + self.query_parameter['funchp_flag'] = '' + self.query_parameter['funchp_ok_date'] = '' + self.query_parameter['funchp_can_date'] = '' + + # 地域医療支援病院 + if len(self.record.areasuphp_flag) > 0: + set_clauses.append('areasuphpflag = :areasuphp_flag') + set_clauses.append('areasuphpintrate = :areasuphp_intrate') + set_clauses.append('areasuphpokdate = :areasuphp_ok_date') + set_clauses.append('areasuphpcandate = :areasuphp_can_date') + if self.record.areasuphp_flag == '@': + self.query_parameter['areasuphp_flag'] = '' + self.query_parameter['areasuphp_intrate'] = '' + self.query_parameter['areasuphp_ok_date'] = '' + self.query_parameter['areasuphp_can_date'] = '' + + # 超急性期脳卒中加算 + if len(self.record.acuthp_add_flag) > 0: + set_clauses.append('acuthpaddflag = :acuthp_add_flag') + set_clauses.append('acuthpaddokdate = :acuthp_add_ok_date') + set_clauses.append('acuthpaddcandate = :acuthp_add_can_date') + if self.record.acuthp_add_flag == '@': + self.query_parameter['acuthp_add_flag'] = '' + self.query_parameter['acuthp_add_ok_date'] = '' + self.query_parameter['acuthp_add_can_date'] = '' + + # 総合入院体制加算 + if len(self.record.genadmisiion_flag) > 0: + set_clauses.append('genadmisiionflag = :genadmisiion_flag') + set_clauses.append('genadmisiionfokdate = :genadmisiion_ok_date') + set_clauses.append('genadmisiionfcandate = :genadmisiion_can_date') + if self.record.genadmisiion_flag == '@': + self.query_parameter['genadmisiion_flag'] = '' + self.query_parameter['genadmisiion_ok_date'] = '' + self.query_parameter['genadmisiion_can_date'] = '' + + # 医師事務作業補助体制加算 + if len(self.record.assistance_flag) > 0: + set_clauses.append('assistanceflag = :assistance_flag') + set_clauses.append('assistanceokdate = :assistance_ok_date') + set_clauses.append('assistancecandate = :assistance_can_date') + if self.record.assistance_flag == '@': + self.query_parameter['assistance_flag'] = '' + self.query_parameter['assistance_ok_date'] = '' + self.query_parameter['assistance_can_date'] = '' + + # 診療録管理体制加算 + if len(self.record.diagnosis_treatment_flag) > 0: + set_clauses.append('diagnosistreatment_flag = :diagnosis_treatment_flag') + set_clauses.append('diagnosistreatment_specday = :diagnosis_treatment_spec_day') + set_clauses.append('diagnosistreatment_cancelday = :diagnosis_treatment_cancel_day') + if self.record.diagnosis_treatment_flag == '@': + self.query_parameter['diagnosis_treatment_flag'] = '' + self.query_parameter['diagnosis_treatment_spec_day'] = '' + self.query_parameter['diagnosis_treatment_cancel_day'] = '' + + # 医療安全対策加算 + if len(self.record.safety_flag) > 0: + set_clauses.append('safety_flag = :safety_flag') + set_clauses.append('safety_specday = :safety_spec_day') + set_clauses.append('safety_cancelday = :safety_cancel_day') + if self.record.safety_flag == '@': + self.query_parameter['safety_flag'] = '' + self.query_parameter['safety_spec_day'] = '' + self.query_parameter['safety_cancel_day'] = '' + + # 褥瘡ハイリスク患者ケア加算 + if len(self.record.highrisk_flag) > 0: + set_clauses.append('highrisk_flag = :highrisk_flag') + set_clauses.append('highrisk_specday = :highrisk_spec_day') + set_clauses.append('highrisk_cancelday = :highrisk_cancel_day') + if self.record.highrisk_flag == '@': + self.query_parameter['highrisk_flag'] = '' + self.query_parameter['highrisk_spec_day'] = '' + self.query_parameter['highrisk_cancel_day'] = '' + + # 地域連携小児夜間・休日診療料 + if len(self.record.infant_and_holiday_flag) > 0: + set_clauses.append('infantandholiday_flag = :infant_and_holiday_flag') + set_clauses.append('infantandholiday_specday = :infant_and_holiday_spec_day') + set_clauses.append('infantandholiday_cancelday = :infant_and_holiday_cancel_day') + if self.record.infant_and_holiday_flag == '@': + self.query_parameter['infant_and_holiday_flag'] = '' + self.query_parameter['infant_and_holiday_spec_day'] = '' + self.query_parameter['infant_and_holiday_cancel_day'] = '' + + # 開放型病院 + if len(self.record.ophp_flag) > 0: + set_clauses.append('ophpflag = :ophp_flag') + set_clauses.append('ophpokdate = :ophpok_date') + set_clauses.append('ophpcandate = :ophpcan_date') + if self.record.ophp_flag == '@': + self.query_parameter['ophp_flag'] = '' + self.query_parameter['ophpok_date'] = '' + self.query_parameter['ophpcan_date'] = '' + + # 地域連携クリティカルパス + if len(self.record.critical_flag) > 0: + set_clauses.append('critical_flag = :critical_flag') + set_clauses.append('critical_code01 = :critical_code01') + set_clauses.append('critical_code02 = :critical_code02') + set_clauses.append('critical_code03 = :critical_code03') + set_clauses.append('critical_code04 = :critical_code04') + set_clauses.append('critical_code05 = :critical_code05') + set_clauses.append('critical_code06 = :critical_code06') + set_clauses.append('critical_code07 = :critical_code07') + set_clauses.append('critical_code08 = :critical_code08') + set_clauses.append('critical_code09 = :critical_code09') + set_clauses.append('critical_code10 = :critical_code10') + set_clauses.append('critical_code11 = :critical_code11') + set_clauses.append('critical_code12 = :critical_code12') + set_clauses.append('critical_code13 = :critical_code13') + set_clauses.append('critical_code14 = :critical_code14') + set_clauses.append('critical_code15 = :critical_code15') + set_clauses.append('critical_code16 = :critical_code16') + set_clauses.append('critical_code17 = :critical_code17') + set_clauses.append('critical_code18 = :critical_code18') + set_clauses.append('critical_code19 = :critical_code19') + set_clauses.append('critical_code20 = :critical_code20') + if self.record.critical_flag == '@': + self.query_parameter['critical_flag'] = '' + self.query_parameter['critical_code01'] = '' + self.query_parameter['critical_code02'] = '' + self.query_parameter['critical_code03'] = '' + self.query_parameter['critical_code04'] = '' + self.query_parameter['critical_code05'] = '' + self.query_parameter['critical_code06'] = '' + self.query_parameter['critical_code07'] = '' + self.query_parameter['critical_code08'] = '' + self.query_parameter['critical_code09'] = '' + self.query_parameter['critical_code10'] = '' + self.query_parameter['critical_code11'] = '' + self.query_parameter['critical_code12'] = '' + self.query_parameter['critical_code13'] = '' + self.query_parameter['critical_code14'] = '' + self.query_parameter['critical_code15'] = '' + self.query_parameter['critical_code16'] = '' + self.query_parameter['critical_code17'] = '' + self.query_parameter['critical_code18'] = '' + self.query_parameter['critical_code19'] = '' + self.query_parameter['critical_code20'] = '' + + # 薬剤管理指導料 + if len(self.record.drgmgthp_flag) > 0: + set_clauses.append('drgmgthpflag = :drgmgthp_flag') + set_clauses.append('drgmgthpokdate = :drgmgthp_ok_date') + set_clauses.append('drgmgthpcandate = :drgmgthp_can_date') + if self.record.drgmgthp_flag == '@': + self.query_parameter['drgmgthp_flag'] = '' + self.query_parameter['drgmgthp_ok_date'] = '' + self.query_parameter['drgmgthp_can_date'] = '' + + # 画像診断管理加算 + if len(self.record.image_diagnosis_flag) > 0: + set_clauses.append('imagediagnosis_flag = :image_diagnosis_flag') + set_clauses.append('imagediagnosis_specifiedday = :image_diagnosis_specified_day') + set_clauses.append('imagediagnosis_cancelday = :image_diagnosis_cancel_day') + if self.record.image_diagnosis_flag == '@': + self.query_parameter['image_diagnosis_flag'] = '' + self.query_parameter['image_diagnosis_specified_day'] = '' + self.query_parameter['image_diagnosis_cancel_day'] = '' + + # 外来化学療法加算 + if len(self.record.chemotherapy_flag) > 0: + set_clauses.append('chemotherapy_flag = :chemotherapy_flag') + set_clauses.append('chemotherapy_specday = :chemotherapy_spec_day') + set_clauses.append('chemotherapy_cancelday = :chemotherapy_cancel_day') + if self.record.chemotherapy_flag == '@': + self.query_parameter['chemotherapy_flag'] = '' + self.query_parameter['chemotherapy_spec_day'] = '' + self.query_parameter['chemotherapy_cancel_day'] = '' + + # 疾患別リハビリテーション料 + if len(self.record.rehabilitation_flag) > 0: + set_clauses.append('rehabilitation_flag = :rehabilitation_flag') + set_clauses.append('rehabilitation_code01= :rehabilitation_code01') + set_clauses.append('rehabilitation_code02= :rehabilitation_code02') + set_clauses.append('rehabilitation_code03= :rehabilitation_code03') + set_clauses.append('rehabilitation_code04= :rehabilitation_code04') + set_clauses.append('rehabilitation_code05= :rehabilitation_code05') + set_clauses.append('rehabilitation_code06= :rehabilitation_code06') + set_clauses.append('rehabilitation_code07= :rehabilitation_code07') + set_clauses.append('rehabilitation_code08= :rehabilitation_code08') + set_clauses.append('rehabilitation_code09= :rehabilitation_code09') + set_clauses.append('rehabilitation_code10= :rehabilitation_code10') + if self.record.rehabilitation_flag == '@': + self.query_parameter['rehabilitation_flag'] = '' + self.query_parameter['rehabilitation_code01'] = '' + self.query_parameter['rehabilitation_code02'] = '' + self.query_parameter['rehabilitation_code03'] = '' + self.query_parameter['rehabilitation_code04'] = '' + self.query_parameter['rehabilitation_code05'] = '' + self.query_parameter['rehabilitation_code06'] = '' + self.query_parameter['rehabilitation_code07'] = '' + self.query_parameter['rehabilitation_code08'] = '' + self.query_parameter['rehabilitation_code09'] = '' + self.query_parameter['rehabilitation_code10'] = '' + + # 麻酔管理料 + if len(self.record.anesthetizing_manage_flag) > 0: + set_clauses.append('anesthetizingmanage_flag = :anesthetizing_manage_flag') + set_clauses.append('anesthetizingmanage_specday = :anesthetizing_manage_spec_day') + set_clauses.append('anesthetizingmanage_cancelday = :anesthetizing_manage_can_day') + if self.record.anesthetizing_manage_flag == '@': + self.query_parameter['anesthetizing_manage_flag'] = '' + self.query_parameter['anesthetizing_manage_spec_day'] = '' + self.query_parameter['anesthetizing_manage_can_day'] = '' + + # 在宅療養支援病院・診療所 + if len(self.record.home_recuperation_flag) > 0: + set_clauses.append('homerecuperation_flag = :home_recuperation_flag') + set_clauses.append('homerecuperation_specday = :home_recuperation_spec_day') + set_clauses.append('homerecuperation_cancelday = :home_recuperation_cancel_day') + if self.record.home_recuperation_flag == '@': + self.query_parameter['home_recuperation_flag'] = '' + self.query_parameter['home_recuperation_spec_day'] = '' + self.query_parameter['home_recuperation_cancel_day'] = '' + + # 在宅時医学総合管理料 + if len(self.record.synthesis_when_staying_flag) > 0: + set_clauses.append('synthesiswhenstaying_flag = :synthesis_when_staying_flag') + set_clauses.append('synthesiswhenstaying_specday = :synthesis_when_staying_spec_day') + set_clauses.append('synthesiswhenstaying_cancelday = :synthesis_when_staying_can_day') + if self.record.synthesis_when_staying_flag == '@': + self.query_parameter['synthesis_when_staying_flag'] = '' + self.query_parameter['synthesis_when_staying_spec_day'] = '' + self.query_parameter['synthesis_when_staying_can_day'] = '' + + # 在宅末期医療総合診療料 + if len(self.record.home_late_flag) > 0: + set_clauses.append('homelateflag = :home_late_flag') + set_clauses.append('homelateokday = :home_late_ok_day') + set_clauses.append('homelatecanday = :home_late_can_day') + if self.record.home_late_flag == '@': + self.query_parameter['home_late_flag'] = '' + self.query_parameter['home_late_ok_day'] = '' + self.query_parameter['home_late_can_day'] = '' + + # ケアミックス区分 + if len(self.record.caremix_kind) > 0: + set_clauses.append('homelateflag = :caremix_kind') + if self.record.caremixkind == '@': + self.query_parameter['caremix_kind'] = '' + + # 完全型・移行型区分 + if len(self.record.fullmove_flag) > 0: + set_clauses.append('fullmoveflag = :fullmove_flag') + if self.record.fullmove_flag == '@': + self.query_parameter['fullmove_flag'] = '' + + # 療養型病床群 + if sum(len(item) for item in self.record.resthp_list) > 0: + set_clauses.append('resthpflag = :resthp_flag') + set_clauses.append('resthpcarekind = :resthp_care_kind') + set_clauses.append('resthpbednum = :resthp_bed_num') + set_clauses.append('resthpokdate = :resthp_ok_date') + set_clauses.append('resthpcandate = :resthp_can_date') + set_clauses.append('resthpcarenrskind = :resthp_care_nrs_kind') + set_clauses.append('resthpcarebednum = :resthp_care_bed_num') + set_clauses.append('resthpcareokdate = :resthp_care_ok_date') + set_clauses.append('resthpcarecandate = :resthp_care_can_date') + set_clauses.append('resthpsbednum = :resthp_sbed_num') + if self.record.resthp_flag == '@': + self.query_parameter['resthp_flag'] = '' + self.query_parameter['resthp_care_kind'] = '' + self.query_parameter['resthp_bed_num'] = '' + self.query_parameter['resthp_ok_date'] = '' + self.query_parameter['resthp_can_date'] = '' + self.query_parameter['resthp_care_nrs_kind'] = '' + self.query_parameter['resthp_care_bed_num'] = '' + self.query_parameter['resthp_care_ok_date'] = '' + self.query_parameter['resthp_care_can_date'] = '' + self.query_parameter['resthp_sbed_num'] = '' + + # 一般病棟 + if len(self.record.nrmhp_flag) > 0: + set_clauses.append('nrmhpflag = :nrmhp_flag') + set_clauses.append('nrmhpcarekind = :nrmhp_care_kind') + set_clauses.append('nrmhpbedtotalnum = :nrmhp_bed_total_num') + if self.record.nrmhp_flag == '@': + self.query_parameter['nrmhp_flag'] = '' + self.query_parameter['nrmhp_care_kind'] = '' + self.query_parameter['nrmhp_bed_total_num'] = '' + + # 精神病棟 + if len(self.record.menthp_flag) > 0: + set_clauses.append('menthpflag = :menthp_flag') + set_clauses.append('menthpcarekind = :menthp_care_kind') + set_clauses.append('menthpbednum = :menthp_bed_num') + if self.record.menthp_flag == '@': + self.query_parameter['menthp_flag'] = '' + self.query_parameter['menthp_care_kind'] = '' + self.query_parameter['menthp_bed_num'] = '' + + # 結核病棟 + if len(self.record.tubhp_flag) > 0: + set_clauses.append('tubhpflag = :tubhp_flag') + set_clauses.append('tubhpcarekind = :tubhp_care_kind') + set_clauses.append('tubhpbednum = :tubhp_bed_num') + if self.record.tubhp_flag == '@': + self.query_parameter['tubhp_flag'] = '' + self.query_parameter['tubhp_care_kind'] = '' + self.query_parameter['tubhp_bed_num'] = '' + + # 感染症指定医療機関 + if len(self.record.infhp_flag) > 0: + set_clauses.append('infhpflag = :infhp_flag') + set_clauses.append('infhpflag1 = :infhp_flag1') + set_clauses.append('infhpflag2 = :infhp_flag2') + if self.record.infhp_flag == '@': + self.query_parameter['infhp_flag'] = '' + self.query_parameter['infhp_flag1'] = '' + self.query_parameter['infhp_flag2'] = '' + + # 感染症病床 + if len(self.record.infhp_bed_flag) > 0: + set_clauses.append('infhpbedflag = :infhp_bed_flag') + set_clauses.append('infhpbednum = :infhp_bed_num') + if self.record.infhp_bed_flag == '@': + self.query_parameter['infhp_bed_flag'] = '' + self.query_parameter['infhp_bed_num'] = '' + + # 緩和ケア病棟設置病院 + if len(self.record.hospice_flag) > 0: + set_clauses.append('hospiceflag = :hospice_flag') + set_clauses.append('hospicebednum = :hospice_bed_num') + set_clauses.append('hospiceokdate = :hospice_ok_date') + set_clauses.append('hospicecandate = :hospice_can_date') + if self.record.hospice_flag == '@': + self.query_parameter['hospice_flag'] = '' + self.query_parameter['hospice_bed_num'] = '' + self.query_parameter['hospice_ok_date'] = '' + self.query_parameter['hospice_can_date'] = '' + + # 医療機能評価 + if len(self.record.hpfunce_st_flag) > 0: + set_clauses.append('hpfuncestflag = :hpfunce_st_flag') + set_clauses.append('hpfuncestkind = :hpfunce_st_kind') + set_clauses.append('hpfuncestokdate = :hpfunce_st_ok_date') + set_clauses.append('hpfuncestcandate = :hospice_ok_date') + if self.record.hpfunce_st_flag == '@': + self.query_parameter['hpfunce_st_flag'] = '' + self.query_parameter['hpfunce_st_kind'] = '' + self.query_parameter['hpfunce_st_ok_date'] = '' + self.query_parameter['hospice_ok_date'] = '' + + # 臨床研修指定病院 + if sum(len(item) for item in self.record.cl_items) > 0: + set_clauses.append('clolyhpkind = :clolyhp_kind') + set_clauses.append('clolyhpokdate = :clolyhp_ok_date') + set_clauses.append('clolyhpcandate = :clolyhp_can_date') + set_clauses.append('clhpkind = :clhp_kind') + set_clauses.append('clhpokdate = :clhp_ok_date') + set_clauses.append('clhpcandate = :clhp_can_date') + set_clauses.append('cldephpkind = :cldephp_kind') + set_clauses.append('cldephpokdate = :cldephp_ok_date') + set_clauses.append('cldephpcandate = :cldephp_can_date') + if self.record.clolyhp_kind == '@': + self.query_parameter['clolyhp_kind'] = '' + self.query_parameter['clolyhp_ok_date'] = '' + self.query_parameter['clolyhp_can_date'] = '' + self.query_parameter['clhp_kind'] = '' + self.query_parameter['clhp_ok_date'] = '' + self.query_parameter['clhp_can_date'] = '' + self.query_parameter['cldephp_kind'] = '' + self.query_parameter['cldephp_ok_date'] = '' + self.query_parameter['cldephp_can_date'] = '' + + # 災害拠点病院 + if len(self.record.disasthp_flag) > 0: + set_clauses.append('disasthpflag = :disasthp_flag') + if self.record.disasthp_flag == '@': + self.query_parameter['disasthp_flag'] = '' + + # 救急医療 + if len(self.record.d1emerhp_flag) > 0: + set_clauses.append('d1emerhpflag = :d1emerhp_flag') + set_clauses.append('d2emerhpflag = :d2emerhp_flag') + set_clauses.append('d3emerhpflag = :d3emerhp_flag') + if self.record.d1emerhp_flag == '@': + self.query_parameter['d1emerhp_flag'] = '' + self.query_parameter['d2emerhp_flag'] = '' + self.query_parameter['d3emerhp_flag'] = '' + + # 救急告示診療所 + if len(self.record.emergency_clinic) > 0: + set_clauses.append('emergencyclinic = :emergency_clinic') + if self.record.emergency_clinic == '@': + self.query_parameter['emergency_clinic'] = '' + + # 治験中核病院 + if len(self.record.trial_core_flag) > 0: + set_clauses.append('trialcoreflag = :trial_core_flag') + set_clauses.append('trialcore_div = :trial_core_div') + set_clauses.append('trialcoreokdate = :trial_core_ok_date') + set_clauses.append('trialcorecandate = :trial_core_can_date') + if self.record.trial_core_flag == '@': + self.query_parameter['trial_core_flag'] = '' + self.query_parameter['trial_core_div'] = '' + self.query_parameter['trial_core_ok_date'] = '' + self.query_parameter['trial_core_can_date'] = '' + + # 認知症疾患医療センター + if len(self.record.dementia_flag) > 0: + set_clauses.append('dementiaflag = :dementia_flag') + set_clauses.append('dementiaokdate = :dementia_okd_ate') + set_clauses.append('dementiacandate = :dementia_can_date') + if self.record.dementia_flag == '@': + self.query_parameter['dementia_flag'] = '' + self.query_parameter['dementia_okd_ate'] = '' + self.query_parameter['dementia_can_date'] = '' + + # 特定健康診査実施機関 + if len(self.record.sphealth_exploration) > 0: + set_clauses.append('sphealth_exploration = :sphealth_exploration') + if self.record.sphealth_exploration == '@': + self.query_parameter['sphealth_exploration'] = '' + + # 特定保健指導実施機関 + if len(self.record.sphealth_guidance) > 0: + set_clauses.append('sphealth_guidance = :sphealth_guidance') + if self.record.sphealth_guidance == '@': + self.query_parameter['sphealth_guidance'] = '' + + # 先進医療実施医療機関 + if len(self.record.hiadhp_flag) > 0: + set_clauses.append('hiadhpflag = :hiadhp_flag') + set_clauses.append('hiadhpcode1 = :hiadhp_code1') + set_clauses.append('hiadhpkind1 = :hiadhp_kind1') + set_clauses.append('hiadhpcode2 = :hiadhp_code2') + set_clauses.append('hiadhpkind2 = :hiadhp_kind2') + set_clauses.append('hiadhpcode3 = :hiadhp_code3') + set_clauses.append('hiadhpkind3 = :hiadhp_kind3') + set_clauses.append('hiadhpcode4 = :hiadhp_code4') + set_clauses.append('hiadhpkind4 = :hiadhp_kind4') + set_clauses.append('hiadhpcode5 = :hiadhp_code5') + set_clauses.append('hiadhpkind5 = :hiadhp_kind5') + set_clauses.append('hiadhpcode6 = :hiadhp_code6') + set_clauses.append('hiadhpkind6 = :hiadhp_kind6') + set_clauses.append('hiadhpcode7 = :hiadhp_code7') + set_clauses.append('hiadhpkind7 = :hiadhp_kind7') + set_clauses.append('hiadhpcode8 = :hiadhp_code8') + set_clauses.append('hiadhpkind8 = :hiadhp_kind8') + set_clauses.append('hiadhpcode9 = :hiadhp_code9') + set_clauses.append('hiadhpkind9 = :hiadhp_kind9') + set_clauses.append('hiadhpcode10 = :hiadhp_code10') + set_clauses.append('hiadhpkind10 = :hiadhp_kind10') + set_clauses.append('hiadhpcode11 = :hiadhp_code11') + set_clauses.append('hiadhpkind11 = :hiadhp_kind11') + set_clauses.append('hiadhpcode12 = :hiadhp_code12') + set_clauses.append('hiadhpkind12 = :hiadhp_kind12') + set_clauses.append('hiadhpcode13 = :hiadhp_code13') + set_clauses.append('hiadhpkind13 = :hiadhp_kind13') + set_clauses.append('hiadhpcode14 = :hiadhp_code14') + set_clauses.append('hiadhpkind14 = :hiadhp_kind14') + set_clauses.append('hiadhpcode15 = :hiadhp_code15') + set_clauses.append('hiadhpkind15 = :hiadhp_kind15') + set_clauses.append('hiadhpcode16 = :hiadhp_code16') + set_clauses.append('hiadhpkind16 = :hiadhp_kind16') + set_clauses.append('hiadhpcode17 = :hiadhp_code17') + set_clauses.append('hiadhpkind17 = :hiadhp_kind17') + set_clauses.append('hiadhpcode18 = :hiadhp_code18') + set_clauses.append('hiadhpkind18 = :hiadhp_kind18') + set_clauses.append('hiadhpcode19 = :hiadhp_code19') + set_clauses.append('hiadhpkind19 = :hiadhp_kind19') + set_clauses.append('hiadhpcode20 = :hiadhp_code20') + set_clauses.append('hiadhpkind20 = :hiadhp_kind20') + set_clauses.append('hiadhpcode21 = :hiadhp_code21') + set_clauses.append('hiadhpkind21 = :hiadhp_kind21') + set_clauses.append('hiadhpcode22 = :hiadhp_code22') + set_clauses.append('hiadhpkind22 = :hiadhp_kind22') + set_clauses.append('hiadhpcode23 = :hiadhp_code23') + set_clauses.append('hiadhpkind23 = :hiadhp_kind23') + set_clauses.append('hiadhpcode24 = :hiadhp_code24') + set_clauses.append('hiadhpkind24 = :hiadhp_kind24') + set_clauses.append('hiadhpcode25 = :hiadhp_code25') + set_clauses.append('hiadhpkind25 = :hiadhp_kind25') + set_clauses.append('hiadhpcode26 = :hiadhp_code26') + set_clauses.append('hiadhpkind26 = :hiadhp_kind26') + set_clauses.append('hiadhpcode27 = :hiadhp_code27') + set_clauses.append('hiadhpkind27 = :hiadhp_kind27') + set_clauses.append('hiadhpcode28 = :hiadhp_code28') + set_clauses.append('hiadhpkind28 = :hiadhp_kind28') + set_clauses.append('hiadhpcode29 = :hiadhp_code29') + set_clauses.append('hiadhpkind29 = :hiadhp_kind29') + set_clauses.append('hiadhpcode30 = :hiadhp_code30') + set_clauses.append('hiadhpkind30 = :hiadhp_kind30') + set_clauses.append('hiadhpcode31 = :hiadhp_code31') + set_clauses.append('hiadhpkind31 = :hiadhp_kind31') + set_clauses.append('hiadhpcode32 = :hiadhp_code32') + set_clauses.append('hiadhpkind32 = :hiadhp_kind32') + set_clauses.append('hiadhpcode33 = :hiadhp_code33') + set_clauses.append('hiadhpkind33 = :hiadhp_kind33') + set_clauses.append('hiadhpcode34 = :hiadhp_code34') + set_clauses.append('hiadhpkind34 = :hiadhp_kind34') + set_clauses.append('hiadhpcode35 = :hiadhp_code35') + set_clauses.append('hiadhpkind35 = :hiadhp_kind35') + set_clauses.append('hiadhpcode36 = :hiadhp_code36') + set_clauses.append('hiadhpkind36 = :hiadhp_kind36') + set_clauses.append('hiadhpcode37 = :hiadhp_code37') + set_clauses.append('hiadhpkind37 = :hiadhp_kind37') + set_clauses.append('hiadhpcode38 = :hiadhp_code38') + set_clauses.append('hiadhpkind38 = :hiadhp_kind38') + set_clauses.append('hiadhpcode39 = :hiadhp_code39') + set_clauses.append('hiadhpkind39 = :hiadhp_kind39') + set_clauses.append('hiadhpcode40 = :hiadhp_code40') + set_clauses.append('hiadhpkind40 = :hiadhp_kind40') + if self.record.hiadhp_flag == '@': + self.query_parameter['hiadhp_flag'] = '' + self.query_parameter['hiadhp_code1'] = '' + self.query_parameter['hiadhp_kind1'] = '' + self.query_parameter['hiadhp_code2'] = '' + self.query_parameter['hiadhp_kind2'] = '' + self.query_parameter['hiadhp_code3'] = '' + self.query_parameter['hiadhp_kind3'] = '' + self.query_parameter['hiadhp_code4'] = '' + self.query_parameter['hiadhp_kind4'] = '' + self.query_parameter['hiadhp_code5'] = '' + self.query_parameter['hiadhp_kind5'] = '' + self.query_parameter['hiadhp_code6'] = '' + self.query_parameter['hiadhp_kind6'] = '' + self.query_parameter['hiadhp_code7'] = '' + self.query_parameter['hiadhp_kind7'] = '' + self.query_parameter['hiadhp_code8'] = '' + self.query_parameter['hiadhp_kind8'] = '' + self.query_parameter['hiadhp_code9'] = '' + self.query_parameter['hiadhp_kind9'] = '' + self.query_parameter['hiadhp_code10'] = '' + self.query_parameter['hiadhp_kind10'] = '' + self.query_parameter['hiadhp_code11'] = '' + self.query_parameter['hiadhp_kind11'] = '' + self.query_parameter['hiadhp_code12'] = '' + self.query_parameter['hiadhp_kind12'] = '' + self.query_parameter['hiadhp_code13'] = '' + self.query_parameter['hiadhp_kind13'] = '' + self.query_parameter['hiadhp_code14'] = '' + self.query_parameter['hiadhp_kind14'] = '' + self.query_parameter['hiadhp_code15'] = '' + self.query_parameter['hiadhp_kind15'] = '' + self.query_parameter['hiadhp_code16'] = '' + self.query_parameter['hiadhp_kind16'] = '' + self.query_parameter['hiadhp_code17'] = '' + self.query_parameter['hiadhp_kind17'] = '' + self.query_parameter['hiadhp_code18'] = '' + self.query_parameter['hiadhp_kind18'] = '' + self.query_parameter['hiadhp_code19'] = '' + self.query_parameter['hiadhp_kind19'] = '' + self.query_parameter['hiadhp_code20'] = '' + self.query_parameter['hiadhp_kind20'] = '' + self.query_parameter['hiadhp_code21'] = '' + self.query_parameter['hiadhp_kind21'] = '' + self.query_parameter['hiadhp_code22'] = '' + self.query_parameter['hiadhp_kind22'] = '' + self.query_parameter['hiadhp_code23'] = '' + self.query_parameter['hiadhp_kind23'] = '' + self.query_parameter['hiadhp_code24'] = '' + self.query_parameter['hiadhp_kind24'] = '' + self.query_parameter['hiadhp_code25'] = '' + self.query_parameter['hiadhp_kind25'] = '' + self.query_parameter['hiadhp_code26'] = '' + self.query_parameter['hiadhp_kind26'] = '' + self.query_parameter['hiadhp_code27'] = '' + self.query_parameter['hiadhp_kind27'] = '' + self.query_parameter['hiadhp_code28'] = '' + self.query_parameter['hiadhp_kind28'] = '' + self.query_parameter['hiadhp_code29'] = '' + self.query_parameter['hiadhp_kind29'] = '' + self.query_parameter['hiadhp_code30'] = '' + self.query_parameter['hiadhp_kind30'] = '' + self.query_parameter['hiadhp_code31'] = '' + self.query_parameter['hiadhp_kind31'] = '' + self.query_parameter['hiadhp_code32'] = '' + self.query_parameter['hiadhp_kind32'] = '' + self.query_parameter['hiadhp_code33'] = '' + self.query_parameter['hiadhp_kind33'] = '' + self.query_parameter['hiadhp_code34'] = '' + self.query_parameter['hiadhp_kind34'] = '' + self.query_parameter['hiadhp_code35'] = '' + self.query_parameter['hiadhp_kind35'] = '' + self.query_parameter['hiadhp_code36'] = '' + self.query_parameter['hiadhp_kind36'] = '' + self.query_parameter['hiadhp_code37'] = '' + self.query_parameter['hiadhp_kind37'] = '' + self.query_parameter['hiadhp_code38'] = '' + self.query_parameter['hiadhp_kind38'] = '' + self.query_parameter['hiadhp_code39'] = '' + self.query_parameter['hiadhp_kind39'] = '' + self.query_parameter['hiadhp_code40'] = '' + self.query_parameter['hiadhp_kind40'] = '' + + # 先端医療実施医療機関 + if len(self.record.hitechhp_flag) > 0: + set_clauses.append('hitechhpflag = :hitechhp_flag') + set_clauses.append('hitechhpkind1 = :hitechhp_kind1') + set_clauses.append('hitechhpkind2 = :hitechhp_kind2') + set_clauses.append('hitechhpkind3 = :hitechhp_kind3') + set_clauses.append('hitechhpkind4 = :hitechhp_kind4') + set_clauses.append('hitechhpkind5 = :hitechhp_kind5') + set_clauses.append('hitechhpkind6 = :hitechhp_kind6') + set_clauses.append('hitechhpkind7 = :hitechhp_kind7') + set_clauses.append('hitechhpkind8 = :hitechhp_kind8') + set_clauses.append('hitechhpkind9 = :hitechhp_kind9') + set_clauses.append('hitechhpkind10 = :hitechhp_kind10') + set_clauses.append('hitechhpkind11 = :hitechhp_kind11') + set_clauses.append('hitechhpkind12 = :hitechhp_kind12') + set_clauses.append('hitechhpkind13 = :hitechhp_kind13') + set_clauses.append('hitechhpkind14 = :hitechhp_kind14') + set_clauses.append('hitechhpkind15 = :hitechhp_kind15') + set_clauses.append('hitechhpkind16 = :hitechhp_kind16') + set_clauses.append('hitechhpkind17 = :hitechhp_kind17') + set_clauses.append('hitechhpkind18 = :hitechhp_kind18') + set_clauses.append('hitechhpkind19 = :hitechhp_kind19') + set_clauses.append('hitechhpkind20 = :hitechhp_kind20') + if self.record.hitechhp_flag == '@': + self.query_parameter['hitechhp_flag'] = '' + self.query_parameter['hitechhp_kind1'] = '' + self.query_parameter['hitechhp_kind2'] = '' + self.query_parameter['hitechhp_kind3'] = '' + self.query_parameter['hitechhp_kind4'] = '' + self.query_parameter['hitechhp_kind5'] = '' + self.query_parameter['hitechhp_kind6'] = '' + self.query_parameter['hitechhp_kind7'] = '' + self.query_parameter['hitechhp_kind8'] = '' + self.query_parameter['hitechhp_kind9'] = '' + self.query_parameter['hitechhp_kind10'] = '' + self.query_parameter['hitechhp_kind11'] = '' + self.query_parameter['hitechhp_kind12'] = '' + self.query_parameter['hitechhp_kind13'] = '' + self.query_parameter['hitechhp_kind14'] = '' + self.query_parameter['hitechhp_kind15'] = '' + self.query_parameter['hitechhp_kind16'] = '' + self.query_parameter['hitechhp_kind17'] = '' + self.query_parameter['hitechhp_kind18'] = '' + self.query_parameter['hitechhp_kind19'] = '' + self.query_parameter['hitechhp_kind20'] = '' + + # 政策医療 + if len(self.record.policy_medical_flag) > 0: + set_clauses.append('policymedical_flag = :policy_medical_flag') + set_clauses.append('policymedical_code01 = :policy_medical_code01') + set_clauses.append('policymedical_content01 = :policy_medical_content01') + set_clauses.append('policymedical_code02 = :policy_medical_code02') + set_clauses.append('policymedical_content02 = :policy_medical_content02') + set_clauses.append('policymedical_code03 = :policy_medical_code03') + set_clauses.append('policymedical_content03 = :policy_medical_content03') + set_clauses.append('policymedical_code04 = :policy_medical_code04') + set_clauses.append('policymedical_content04 = :policy_medical_content04') + set_clauses.append('policymedical_code05 = :policy_medical_code05') + set_clauses.append('policymedical_content05 = :policy_medical_content05') + set_clauses.append('policymedical_code06 = :policy_medical_code06') + set_clauses.append('policymedical_content06 = :policy_medical_content06') + set_clauses.append('policymedical_code07 = :policy_medical_code07') + set_clauses.append('policymedical_content07 = :policy_medical_content07') + set_clauses.append('policymedical_code08 = :policy_medical_code08') + set_clauses.append('policymedical_content08 = :policy_medical_content08') + set_clauses.append('policymedical_code09 = :policy_medical_code09') + set_clauses.append('policymedical_content09 = :policy_medical_content09') + set_clauses.append('policymedical_code10 = :policy_medical_code10') + set_clauses.append('policymedical_content10 = :policy_medical_content10') + set_clauses.append('policymedical_code11 = :policy_medical_code11') + set_clauses.append('policymedical_content11 = :policy_medical_content11') + set_clauses.append('policymedical_code12 = :policy_medical_code12') + set_clauses.append('policymedical_content12 = :policy_medical_content12') + set_clauses.append('policymedical_code13 = :policy_medical_code13') + set_clauses.append('policymedical_content13 = :policy_medical_content13') + set_clauses.append('policymedical_code14 = :policy_medical_code14') + set_clauses.append('policymedical_content14 = :policy_medical_content14') + set_clauses.append('policymedical_code15 = :policy_medical_code15') + set_clauses.append('policymedical_content15 = :policy_medical_content15') + set_clauses.append('policymedical_code16 = :policy_medical_code16') + set_clauses.append('policymedical_content16 = :policy_medical_content16') + set_clauses.append('policymedical_code17 = :policy_medical_code17') + set_clauses.append('policymedical_content17 = :policy_medical_content17') + set_clauses.append('policymedical_code18 = :policy_medical_code18') + set_clauses.append('policymedical_content18 = :policy_medical_content18') + set_clauses.append('policymedical_code19 = :policy_medical_code19') + set_clauses.append('policymedical_content19 = :policy_medical_content19') + set_clauses.append('policymedical_code20 = :policy_medical_code20') + set_clauses.append('policymedical_content20 = :policy_medical_content20') + if self.record.policy_medical_flag == '@': + self.query_parameter['policy_medical_flag'] = '' + self.query_parameter['policy_medical_code01'] = '' + self.query_parameter['policy_medical_content01'] = '' + self.query_parameter['policy_medical_code02'] = '' + self.query_parameter['policy_medical_content02'] = '' + self.query_parameter['policy_medical_code03'] = '' + self.query_parameter['policy_medical_content03'] = '' + self.query_parameter['policy_medical_code04'] = '' + self.query_parameter['policy_medical_content04'] = '' + self.query_parameter['policy_medical_code05'] = '' + self.query_parameter['policy_medical_content05'] = '' + self.query_parameter['policy_medical_code06'] = '' + self.query_parameter['policy_medical_content06'] = '' + self.query_parameter['policy_medical_code07'] = '' + self.query_parameter['policy_medical_content07'] = '' + self.query_parameter['policy_medical_code08'] = '' + self.query_parameter['policy_medical_content08'] = '' + self.query_parameter['policy_medical_code09'] = '' + self.query_parameter['policy_medical_content09'] = '' + self.query_parameter['policy_medical_code10'] = '' + self.query_parameter['policy_medical_content10'] = '' + self.query_parameter['policy_medical_code11'] = '' + self.query_parameter['policy_medical_content11'] = '' + self.query_parameter['policy_medical_code12'] = '' + self.query_parameter['policy_medical_content12'] = '' + self.query_parameter['policy_medical_code13'] = '' + self.query_parameter['policy_medical_content13'] = '' + self.query_parameter['policy_medical_code14'] = '' + self.query_parameter['policy_medical_content14'] = '' + self.query_parameter['policy_medical_code15'] = '' + self.query_parameter['policy_medical_content15'] = '' + self.query_parameter['policy_medical_code16'] = '' + self.query_parameter['policy_medical_content16'] = '' + self.query_parameter['policy_medical_code17'] = '' + self.query_parameter['policy_medical_content17'] = '' + self.query_parameter['policy_medical_code18'] = '' + self.query_parameter['policy_medical_content18'] = '' + self.query_parameter['policy_medical_code19'] = '' + self.query_parameter['policy_medical_content19'] = '' + self.query_parameter['policy_medical_code20'] = '' + self.query_parameter['policy_medical_content20'] = '' + + # 訪問看護ステーション + if len(self.record.visitcarest_flag) > 0: + set_clauses.append('visitcarestflag = :visitcarest_flag') + set_clauses.append('visitcarestation_id = :visitcarestation_id') + set_clauses.append('visitcarestation_code = :visitcarestation_code') + set_clauses.append('visitcarestation_yobi = :visitcarestation_yobi') + if self.record.visitcarest_flag == '@': + self.query_parameter['visitcarest_flag'] = '' + self.query_parameter['visitcarestation_id'] = '' + self.query_parameter['visitcarestation_code'] = '' + self.query_parameter['visitcarestation_yobi'] = '' + + # 開設年月 + if len(self.record.open_date) > 0: + set_clauses.append('opendate = :open_date') + if self.record.open_date == '@': + self.query_parameter['open_date'] = '' + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + self.queries.append(None) + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + self.queries.append(update_query) + + return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py new file mode 100644 index 00000000..57f59a82 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py @@ -0,0 +1,690 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInstAtt(UltmarcTable): + """レイアウト区分111: COM_施設属性""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備)10/8asa + dpc_flag: str # DPC対象病院フラグ + dpc_spec_day: str # DPC対象病院指定年月日 + dpc_cancel_day: str # DPC対象病院取消年月日 + predpc_flag: str # DPC準備病院フラグ + predpc_spec_day: str # DPC準備病院承認年 + predpc_cancel_day: str # DPC準備病院取消年月日 + cancer_flag: str # がん診療連携拠点病院フラグ + cancer_spec_day: str # がん診療連携拠点病院指定年月日 + cancer_cancel_day: str # がん診療連携拠点病院取消年月日 + funchp_flag: str # 特定機能病院フラグ + funchp_ok_date: str # 特定機能病院承認年月日 + funchp_can_date: str # 特定機能病院取消年月日 + areasuphp_flag: str # 地域医療支援病院フラグ + areasuphp_intrate: str # 地域医 ※ + areasuphp_ok_date: str # 地域医療支援病院承認年月日 + areasuphp_can_date: str # 地域医療支援病院取消年月日 + acuthp_add_flag: str # 超急性期脳卒中加算フラグ + acuthp_add_ok_date: str # 超急性期脳卒中加算承認年月日 + acuthp_add_can_date: str # 超急性期脳卒中加算取消年月日 + genadmisiion_flag: str # 総合入院体制加算フラグ + genadmisiion_ok_date: str # 総合入院体制加算承認年月日 + genadmisiion_can_date: str # 総合入院体制加算取消年月日 + assistance_flag: str # 医師事務作業補助体制加算フラグ + assistance_ok_date: str # 医師事務作業補助体制加算承認年月日 + assistance_can_date: str # 医師事務作業補助体制加算取消年月日 + diagnosis_treatment_flag: str # 診療録管理体制加算フラグ + diagnosis_treatment_spec_day: str # 診療録管理体制加算承認年月日 + diagnosis_treatment_cancel_day: str # 診療録管理体制加算取消年月日 + safety_flag: str # 医療安全対策加算フラグ + safety_spec_day: str # 医療安全対策加算承認年月日 + safety_cancel_day: str # 医療安全対策加算取消年月日 + highrisk_flag: str # 褥瘡ハイリスク患者ケア加算フラグ + highrisk_spec_day: str # 褥瘡ハイリスク患者ケア加算承認年月日 + highrisk_cancel_day: str # 褥瘡ハイリスク患者ケア加算取消年月日 + infant_and_holiday_flag: str # 地域連携小児夜間・休日診療料フラグ + infant_and_holiday_spec_day: str # 地域連携小児夜間・休日診療料承認 + infant_and_holiday_cancel_day: str # 地域連携小児夜間・休日診療料取消 + ophp_flag: str # 開放型病院フラグ + ophpok_date: str # 開放型病院承認年月日 + ophpcan_date: str # 開放型病院取消年月日 + critical_flag: str # 地域連携クリティカルパスフラグ + critical_code01: str # 地域連携クリティカルパスコード1 + critical_code02: str # 地域連携クリティカルパスコード2 + critical_code03: str # 地域連携クリティカルパスコード3 + critical_code04: str # 地域連携クリティカルパスコード4 + critical_code05: str # 地域連携クリティカルパスコード5 + critical_code06: str # 地域連携クリティカルパスコード6 + critical_code07: str # 地域連携クリティカルパスコード7 + critical_code08: str # 地域連携クリティカルパスコード8 + critical_code09: str # 地域連携クリティカルパスコード9 + critical_code10: str # 地域連携クリティカルパスコード10 + critical_code11: str # 地域連携クリティカルパスコード11 + critical_code12: str # 地域連携クリティカルパスコード12 + critical_code13: str # 地域連携クリティカルパスコード13 + critical_code14: str # 地域連携クリティカルパスコード14 + critical_code15: str # 地域連携クリティカルパスコード15 + critical_code16: str # 地域連携クリティカルパスコード16 + critical_code17: str # 地域連携クリティカルパスコード17 + critical_code18: str # 地域連携クリティカルパスコード18 + critical_code19: str # 地域連携クリティカルパスコード19 + critical_code20: str # 地域連携クリティカルパスコード20 + drgmgthp_flag: str # 薬剤管理指導料フラグ + drgmgthp_ok_date: str # 薬剤管理指導料承認年月日 + drgmgthp_can_date: str # 薬剤管理指導料取消年月日 + image_diagnosis_flag: str # 画像診断管理加算フラグ + image_diagnosis_specified_day: str # 画像診断管理加算承認年月日 + image_diagnosis_cancel_day: str # 画像診断管理加算取消年月日 + chemotherapy_flag: str # 外来化学療法加算フラグ + chemotherapy_spec_day: str # 外来化学療法加算承認年月日 + chemotherapy_cancel_day: str # 外来化学療法加算取消年月日 + rehabilitation_flag: str # 疾患別リハビリテーション料フラグ + rehabilitation_code01: str # 疾患別リハビリテーション料コード1 + rehabilitation_code02: str # 疾患別リハビリテーション料コード2 + rehabilitation_code03: str # 疾患別リハビリテーション料コード3 + rehabilitation_code04: str # 疾患別リハビリテーション料コード4 + rehabilitation_code05: str # 疾患別リハビリテーション料コード5 + rehabilitation_code06: str # 疾患別リハビリテーション料コード6 + rehabilitation_code07: str # 疾患別リハビリテーション料コード7 + rehabilitation_code08: str # 疾患別リハビリテーション料コード8 + rehabilitation_code09: str # 疾患別リハビリテーション料コード9 + rehabilitation_code10: str # 疾患別リハビリテーション料コード10 + anesthetizing_manage_flag: str # 麻酔管理料フラグ + anesthetizing_manage_spec_day: str # 麻酔管理料承認年月日 + anesthetizing_manage_can_day: str # 麻酔管理料取消年月日 + home_recuperation_flag: str # 在宅療養支援病院・診療所フラグ + home_recuperation_spec_day: str # 在宅療養支援病院・診療所承認年月 + home_recuperation_cancel_day: str # 在宅療養支援病院・診療所取消年月 + synthesis_when_staying_flag: str # 在宅時医学総合管理料フラグ + synthesis_when_staying_spec_day: str # 在宅時医学総合管理料承認年月日 + synthesis_when_staying_can_day: str # 在宅時医学総合管理料取消年月日 + home_late_flag: str # 在宅末期医療総合診療料フラグ + home_late_ok_day: str # 在宅末期医療総合診療料承認年月日 + home_late_can_day: str # 在宅末期医療総合診療料取消年月日 + caremix_kind: str # ケアミックス区分 + fullmove_flag: str # 完全型・移行型区分 + resthp_flag: str # 療養型病床群フラグ + resthp_care_kind: str # 療養型病床群_医療型(看護種別) + resthp_bed_num: str # 療養 ※ + resthp_ok_date: str # 療養型病床群_医療型(承認年月日) + resthp_can_date: str # 療養型病床群_医療型(取消年月日) + resthp_care_nrs_kind: str # 療養型病床群_介護型(看護種別) + resthp_care_bed_num: str # 療養  ※ + resthp_care_ok_date: str # 療養型病床群_介護型(承認年月日) + resthp_care_can_date: str # 療養型病床群_介護型(取消年月日) + resthp_sbed_num: str # 療養  ※ + nrmhp_flag: str # 一般病棟フラグ + nrmhp_care_kind: str # 一般病棟看護種別 + nrmhp_bed_total_num: str # 一般  ※ + menthp_flag: str # 精神病棟フラグ + menthp_care_kind: str # 精神病棟看護種別 + menthp_bed_num: str # 精神  ※ + tubhp_flag: str # 結核病棟フラグ + tubhp_care_kind: str # 結核病棟看護種別 + tubhp_bed_num: str # 結核  ※ + infhp_flag: str # 感染症特定 + infhp_flag1: str # 感染症1種 + infhp_flag2: str # 感染症2種 + infhp_bed_flag: str # 感染症病床フラグ + infhp_bed_num: str # 感染症病  ※ + hospice_flag: str # 緩和ケア病棟設置病院フラグ + hospice_bed_num: str # 緩和ケア  ※ + hospice_ok_date: str # 緩和ケア病棟設置病院承認年月日 + hospice_can_date: str # 緩和ケア病棟設置病院取消年月日 + hpfunce_st_flag: str # 医療機能評価フラグ + hpfunce_st_kind: str # 医療機能評価種別 + hpfunce_st_ok_date: str # 医療機能評価承認年月日 + hpfunce_st_can_date: str # 医療機能評価取消年月日 + clolyhp_kind: str # 臨床研修指定病院_基幹型病院1フラグ + clolyhp_ok_date: str # 臨床研修指定病院_基幹型病院1承認年月日 + clolyhp_can_date: str # 臨床研修指定病院_基幹型病院1取消年月日 + clhp_kind: str # 臨床研修指定病院_基幹型病院2(群指定)フラグ + clhp_ok_date: str # 臨床研修指定病院_基幹型病院2(群指定)承認 + clhp_can_date: str # 臨床研修指定病院_基幹型病院2(群指定)取消 + cldephp_kind: str # 臨床研修指定病院_協力型病院(群指定)フラグ + cldephp_ok_date: str # 臨床研修指定病院_協力型病院(群指定)承認年 + cldephp_can_date: str # 臨床研修指定病院_協力型病院(群指定)取消年 + disasthp_flag: str # 災害拠点病院 + d1emerhp_flag: str # 救急医療救急告示 + d2emerhp_flag: str # 救急医療2次救急 + d3emerhp_flag: str # 救急医療3次救急 + emergency_clinic: str # 救急告示診療所 + trial_core_flag: str # 治験中核病院フラグ + trial_core_div: str # 治験中核病院区分 + trial_core_ok_date: str # 治験中核病院承認年月日 + trial_core_can_date: str # 治験中核病院取消年月日 + dementia_flag: str # 認知症疾患医療センターフラグ + dementia_okd_ate: str # 認知症疾患医療センター承認年月日 + dementia_can_date: str # 認知症疾患医療センター取消年月日 + sphealth_exploration: str # 特定健康診査実施機 + sphealth_guidance: str # 特定保健指導実施機 + hiadhp_flag: str # 先端医療・高度医療技術実施医療機関フラグ + hiadhp_code1: str # 先端医療・高度医療技術実施医療機関1(コード) + hiadhp_kind1: str # 先端医療・高度医療技術実施医療機関1(区分) + hiadhp_code2: str # 先端医療・高度医療技術実施医療機関2(コード) + hiadhp_kind2: str # 先端医療・高度医療技術実施医療機関2(区分) + hiadhp_code3: str # 先端医療・高度医療技術実施医療機関3(コード) + hiadhp_kind3: str # 先端医療・高度医療技術実施医療機関3(区分) + hiadhp_code4: str # 先端医療・高度医療技術実施医療機関4(コード) + hiadhp_kind4: str # 先端医療・高度医療技術実施医療機関4(区分) + hiadhp_code5: str # 先端医療・高度医療技術実施医療機関5(コード) + hiadhp_kind5: str # 先端医療・高度医療技術実施医療機関5(区分) + hiadhp_code6: str # 先端医療・高度医療技術実施医療機関6(コード) + hiadhp_kind6: str # 先端医療・高度医療技術実施医療機関6(区分) + hiadhp_code7: str # 先端医療・高度医療技術実施医療機関7(コード) + hiadhp_kind7: str # 先端医療・高度医療技術実施医療機関7(区分) + hiadhp_code8: str # 先端医療・高度医療技術実施医療機関8(コード) + hiadhp_kind8: str # 先端医療・高度医療技術実施医療機関8(区分) + hiadhp_code9: str # 先端医療・高度医療技術実施医療機関9(コード) + hiadhp_kind9: str # 先端医療・高度医療技術実施医療機関9(区分) + hiadhp_code10: str # 先端医療・高度医療技術実施医療機関10(コード) + hiadhp_kind10: str # 先端医療・高度医療技術実施医療機関10(区分) + hiadhp_code11: str # 先端医療・高度医療技術実施医療機関11(コード) + hiadhp_kind11: str # 先端医療・高度医療技術実施医療機関11(区分) + hiadhp_code12: str # 先端医療・高度医療技術実施医療機関12(コード) + hiadhp_kind12: str # 先端医療・高度医療技術実施医療機関12(区分) + hiadhp_code13: str # 先端医療・高度医療技術実施医療機関13(コード) + hiadhp_kind13: str # 先端医療・高度医療技術実施医療機関13(区分) + hiadhp_code14: str # 先端医療・高度医療技術実施医療機関14(コード) + hiadhp_kind14: str # 先端医療・高度医療技術実施医療機関14(区分) + hiadhp_code15: str # 先端医療・高度医療技術実施医療機関15(コード) + hiadhp_kind15: str # 先端医療・高度医療技術実施医療機関15(区分) + hiadhp_code16: str # 先端医療・高度医療技術実施医療機関16(コード) + hiadhp_kind16: str # 先端医療・高度医療技術実施医療機関16(区分) + hiadhp_code17: str # 先端医療・高度医療技術実施医療機関17(コード) + hiadhp_kind17: str # 先端医療・高度医療技術実施医療機関17(区分) + hiadhp_code18: str # 先端医療・高度医療技術実施医療機関18(コード) + hiadhp_kind18: str # 先端医療・高度医療技術実施医療機関18(区分) + hiadhp_code19: str # 先端医療・高度医療技術実施医療機関19(コード) + hiadhp_kind19: str # 先端医療・高度医療技術実施医療機関19(区分) + hiadhp_code20: str # 先端医療・高度医療技術実施医療機関20(コード) + hiadhp_kind20: str # 先端医療・高度医療技術実施医療機関20(区分) + hiadhp_code21: str # 先端医療・高度医療技術実施医療機関21(コード) + hiadhp_kind21: str # 先端医療・高度医療技術実施医療機関21(区分) + hiadhp_code22: str # 先端医療・高度医療技術実施医療機関22(コード) + hiadhp_kind22: str # 先端医療・高度医療技術実施医療機関22(区分) + hiadhp_code23: str # 先端医療・高度医療技術実施医療機関23(コード) + hiadhp_kind23: str # 先端医療・高度医療技術実施医療機関23(区分) + hiadhp_code24: str # 先端医療・高度医療技術実施医療機関24(コード) + hiadhp_kind24: str # 先端医療・高度医療技術実施医療機関24(区分) + hiadhp_code25: str # 先端医療・高度医療技術実施医療機関25(コード) + hiadhp_kind25: str # 先端医療・高度医療技術実施医療機関25(区分) + hiadhp_code26: str # 先端医療・高度医療技術実施医療機関26(コード) + hiadhp_kind26: str # 先端医療・高度医療技術実施医療機関26(区分) + hiadhp_code27: str # 先端医療・高度医療技術実施医療機関27(コード) + hiadhp_kind27: str # 先端医療・高度医療技術実施医療機関27(区分) + hiadhp_code28: str # 先端医療・高度医療技術実施医療機関28(コード) + hiadhp_kind28: str # 先端医療・高度医療技術実施医療機関28(区分) + hiadhp_code29: str # 先端医療・高度医療技術実施医療機関29(コード) + hiadhp_kind29: str # 先端医療・高度医療技術実施医療機関29(区分) + hiadhp_code30: str # 先端医療・高度医療技術実施医療機関30(コード) + hiadhp_kind30: str # 先端医療・高度医療技術実施医療機関30(区分) + hiadhp_code31: str # 先端医療・高度医療技術実施医療機関31(コード) + hiadhp_kind31: str # 先端医療・高度医療技術実施医療機関31(区分) + hiadhp_code32: str # 先端医療・高度医療技術実施医療機関32(コード) + hiadhp_kind32: str # 先端医療・高度医療技術実施医療機関32(区分) + hiadhp_code33: str # 先端医療・高度医療技術実施医療機関33(コード) + hiadhp_kind33: str # 先端医療・高度医療技術実施医療機関33(区分) + hiadhp_code34: str # 先端医療・高度医療技術実施医療機関34(コード) + hiadhp_kind34: str # 先端医療・高度医療技術実施医療機関34(区分) + hiadhp_code35: str # 先端医療・高度医療技術実施医療機関35(コード) + hiadhp_kind35: str # 先端医療・高度医療技術実施医療機関35(区分) + hiadhp_code36: str # 先端医療・高度医療技術実施医療機関36(コード) + hiadhp_kind36: str # 先端医療・高度医療技術実施医療機関36(区分) + hiadhp_code37: str # 先端医療・高度医療技術実施医療機関37(コード) + hiadhp_kind37: str # 先端医療・高度医療技術実施医療機関37(区分) + hiadhp_code38: str # 先端医療・高度医療技術実施医療機関38(コード) + hiadhp_kind38: str # 先端医療・高度医療技術実施医療機関38(区分) + hiadhp_code39: str # 先端医療・高度医療技術実施医療機関39(コード) + hiadhp_kind39: str # 先端医療・高度医療技術実施医療機関39(区分) + hiadhp_code40: str # 先端医療・高度医療技術実施医療機関40(コード) + hiadhp_kind40: str # 先端医療・高度医療技術実施医療機関40(区分) + hitechhp_flag: str # 先端医療機器フラグ + hitechhp_kind1: str # 先端医療機器1 + hitechhp_kind2: str # 先端医療機器2 + hitechhp_kind3: str # 先端医療機器3 + hitechhp_kind4: str # 先端医療機器4 + hitechhp_kind5: str # 先端医療機器5 + hitechhp_kind6: str # 先端医療機器6 + hitechhp_kind7: str # 先端医療機器7 + hitechhp_kind8: str # 先端医療機器8 + hitechhp_kind9: str # 先端医療機器9 + hitechhp_kind10: str # 先端医療機器10 + hitechhp_kind11: str # 先端医療機器11 + hitechhp_kind12: str # 先端医療機器12 + hitechhp_kind13: str # 先端医療機器13 + hitechhp_kind14: str # 先端医療機器14 + hitechhp_kind15: str # 先端医療機器15 + hitechhp_kind16: str # 先端医療機器16 + hitechhp_kind17: str # 先端医療機器17 + hitechhp_kind18: str # 先端医療機器18 + hitechhp_kind19: str # 先端医療機器19 + hitechhp_kind20: str # 先端医療機器20 + policy_medical_flag: str # 政策医療フラグ + policy_medical_code01: str # 政策医療1(コード) + policy_medical_content01: str # 政策医療1(区分) + policy_medical_code02: str # 政策医療2(コード) + policy_medical_content02: str # 政策医療2(区分) + policy_medical_code03: str # 政策医療3(コード) + policy_medical_content03: str # 政策医療3(区分) + policy_medical_code04: str # 政策医療4(コード) + policy_medical_content04: str # 政策医療4(区分) + policy_medical_code05: str # 政策医療5(コード) + policy_medical_content05: str # 政策医療5(区分) + policy_medical_code06: str # 政策医療6(コード) + policy_medical_content06: str # 政策医療6(区分) + policy_medical_code07: str # 政策医療7(コード) + policy_medical_content07: str # 政策医療7(区分) + policy_medical_code08: str # 政策医療8(コード) + policy_medical_content08: str # 政策医療8(区分) + policy_medical_code09: str # 政策医療9(コード) + policy_medical_content09: str # 政策医療9(区分) + policy_medical_code10: str # 政策医療10(コード) + policy_medical_content10: str # 政策医療10(区分) + policy_medical_code11: str # 政策医療11(コード) + policy_medical_content11: str # 政策医療11(区分) + policy_medical_code12: str # 政策医療12(コード) + policy_medical_content12: str # 政策医療12(区分) + policy_medical_code13: str # 政策医療13(コード) + policy_medical_content13: str # 政策医療13(区分) + policy_medical_code14: str # 政策医療14(コード) + policy_medical_content14: str # 政策医療14(区分) + policy_medical_code15: str # 政策医療15(コード) + policy_medical_content15: str # 政策医療15(区分) + policy_medical_code16: str # 政策医療16(コード) + policy_medical_content16: str # 政策医療16(区分) + policy_medical_code17: str # 政策医療17(コード) + policy_medical_content17: str # 政策医療17(区分) + policy_medical_code18: str # 政策医療18(コード) + policy_medical_content18: str # 政策医療18(区分) + policy_medical_code19: str # 政策医療19(コード) + policy_medical_content19: str # 政策医療19(区分) + policy_medical_code20: str # 政策医療20(コード) + policy_medical_content20: str # 政策医療20(区分) + visitcarest_flag: str # 訪問看護ステーションフラグ + visitcarestation_id: str # 訪問看護ステーション_施設コード(レコードID) + visitcarestation_code: str # 訪問看護ステーション_施設コード(施設コード) + visitcarestation_yobi: str # 訪問看護ステーション_施設コード(予備) + open_date: str # 開設年月 + maint_flag: str # 修正区分 + adddel_div: str # 追加削除区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + resthp_items: list # 療養型病床リスト + cl_items: list # 臨床研修指定病院リスト + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + + self.maint_flag = record[4].strip() + self.adddel_div = record[5].strip() + + self.dpc_flag = record[8].strip() + self.dpc_spec_day = record[9].strip() + self.dpc_cancel_day = record[10].strip() + + self.predpc_flag = record[11].strip() + self.predpc_spec_day = record[12].strip() + self.predpc_cancel_day = record[13].strip() + + self.cancer_flag = record[14].strip() + self.cancer_spec_day = record[15].strip() + self.cancer_cancel_day = record[16].strip() + + self.funchp_flag = record[17].strip() + self.funchp_ok_date = record[18].strip() + self.funchp_can_date = record[19].strip() + + self.areasuphp_flag = record[20].strip() + self.areasuphp_intrate = record[21].strip() + self.areasuphp_ok_date = record[22].strip() + self.areasuphp_can_date = record[23].strip() + + self.acuthp_add_flag = record[24].strip() + self.acuthp_add_ok_date = record[25].strip() + self.acuthp_add_can_date = record[26].strip() + + self.genadmisiion_flag = record[27].strip() + self.genadmisiion_ok_date = record[28].strip() + self.genadmisiion_can_date = record[29].strip() + + self.assistance_flag = record[30].strip() + self.assistance_ok_date = record[31].strip() + self.assistance_can_date = record[32].strip() + + self.diagnosis_treatment_flag = record[33].strip() + self.diagnosis_treatment_spec_day = record[34].strip() + self.diagnosis_treatment_cancel_day = record[35].strip() + + self.safety_flag = record[36].strip() + self.safety_spec_day = record[37].strip() + self.safety_cancel_day = record[38].strip() + + self.highrisk_flag = record[39].strip() + self.highrisk_spec_day = record[40].strip() + self.highrisk_cancel_day = record[41].strip() + + self.infant_and_holiday_flag = record[42].strip() + self.infant_and_holiday_spec_day = record[43].strip() + self.infant_and_holiday_cancel_day = record[44].strip() + + self.ophp_flag = record[45].strip() + self.ophpok_date = record[46].strip() + self.ophpcan_date = record[47].strip() + self.critical_flag = record[48].strip() + + self.critical_code01 = record[49].strip() + self.critical_code02 = record[50].strip() + self.critical_code03 = record[51].strip() + self.critical_code04 = record[52].strip() + self.critical_code05 = record[53].strip() + self.critical_code06 = record[54].strip() + self.critical_code07 = record[55].strip() + self.critical_code08 = record[56].strip() + self.critical_code09 = record[57].strip() + self.critical_code10 = record[58].strip() + self.critical_code11 = record[59].strip() + self.critical_code12 = record[60].strip() + self.critical_code13 = record[61].strip() + self.critical_code14 = record[62].strip() + self.critical_code15 = record[63].strip() + self.critical_code16 = record[64].strip() + self.critical_code17 = record[65].strip() + self.critical_code18 = record[66].strip() + self.critical_code19 = record[67].strip() + self.critical_code20 = record[68].strip() + + self.drgmgthp_flag = record[69].strip() + self.drgmgthp_ok_date = record[70].strip() + self.drgmgthp_can_date = record[71].strip() + + self.image_diagnosis_flag = record[72].strip() + self.image_diagnosis_specified_day = record[73].strip() + self.image_diagnosis_cancel_day = record[74].strip() + + self.chemotherapy_flag = record[75].strip() + self.chemotherapy_spec_day = record[76].strip() + self.chemotherapy_cancel_day = record[77].strip() + + self.rehabilitation_flag = record[78].strip() + self.rehabilitation_code01 = record[79].strip() + self.rehabilitation_code02 = record[80].strip() + self.rehabilitation_code03 = record[81].strip() + self.rehabilitation_code04 = record[82].strip() + self.rehabilitation_code05 = record[83].strip() + self.rehabilitation_code06 = record[84].strip() + self.rehabilitation_code07 = record[85].strip() + self.rehabilitation_code08 = record[86].strip() + self.rehabilitation_code09 = record[87].strip() + self.rehabilitation_code10 = record[88].strip() + + self.anesthetizing_manage_flag = record[89].strip() + self.anesthetizing_manage_spec_day = record[90].strip() + self.anesthetizing_manage_can_day = record[91].strip() + + self.home_recuperation_flag = record[92].strip() + self.home_recuperation_spec_day = record[93].strip() + self.home_recuperation_cancel_day = record[94].strip() + + self.synthesis_when_staying_flag = record[95].strip() + self.synthesis_when_staying_spec_day = record[96].strip() + self.synthesis_when_staying_can_day = record[97].strip() + + self.home_late_flag = record[98].strip() + self.home_late_ok_day = record[99].strip() + self.home_late_can_day = record[100].strip() + + self.caremix_kind = record[101].strip() + self.fullmove_flag = record[102].strip() + + self.resthp_flag = record[103].strip() + self.resthp_care_kind = record[104].strip() + self.resthp_bed_num = record[105].strip() + self.resthp_ok_date = record[106].strip() + self.resthp_can_date = record[107].strip() + self.resthp_care_nrs_kind = record[108].strip() + self.resthp_care_bed_num = record[109].strip() + self.resthp_care_ok_date = record[110].strip() + self.resthp_care_can_date = record[111].strip() + self.resthp_sbed_num = record[112].strip() + + self.nrmhp_flag = record[113].strip() + self.nrmhp_care_kind = record[114].strip() + self.nrmhp_bed_total_num = record[115].strip() + + self.menthp_flag = record[116].strip() + self.menthp_care_kind = record[117].strip() + self.menthp_bed_num = record[118].strip() + + self.tubhp_flag = record[119].strip() + self.tubhp_care_kind = record[120].strip() + self.tubhp_bed_num = record[121].strip() + + self.infhp_flag = record[122].strip() + self.infhp_flag1 = record[123].strip() + self.infhp_flag2 = record[124].strip() + + self.infhp_bed_flag = record[125].strip() + self.infhp_bed_num = record[126].strip() + + self.hospice_flag = record[127].strip() + self.hospice_bed_num = record[128].strip() + self.hospice_ok_date = record[129].strip() + self.hospice_can_date = record[130].strip() + + self.hpfunce_st_flag = record[131].strip() + self.hpfunce_st_kind = record[132].strip() + self.hpfunce_st_ok_date = record[133].strip() + self.hpfunce_st_can_date = record[134].strip() + + self.clolyhp_kind = record[135].strip() + self.clolyhp_ok_date = record[136].strip() + self.clolyhp_can_date = record[137].strip() + self.clhp_kind = record[138].strip() + self.clhp_ok_date = record[139].strip() + self.clhp_can_date = record[140].strip() + self.cldephp_kind = record[141].strip() + self.cldephp_ok_date = record[142].strip() + self.cldephp_can_date = record[143].strip() + + self.disasthp_flag = record[144].strip() + + self.d1emerhp_flag = record[145].strip() + self.d2emerhp_flag = record[146].strip() + self.d3emerhp_flag = record[147].strip() + + self.emergency_clinic = record[148].strip() + + self.trial_core_flag = record[149].strip() + self.trial_core_div = record[150].strip() + self.trial_core_ok_date = record[151].strip() + self.trial_core_can_date = record[152].strip() + + self.dementia_flag = record[153].strip() + self.dementia_okd_ate = record[154].strip() + self.dementia_can_date = record[155].strip() + + self.sphealth_exploration = record[156].strip() + self.sphealth_guidance = record[157].strip() + + self.hiadhp_flag = record[158].strip() + self.hiadhp_code1 = record[159].strip() + self.hiadhp_kind1 = record[160].strip() + self.hiadhp_code2 = record[161].strip() + self.hiadhp_kind2 = record[162].strip() + self.hiadhp_code3 = record[163].strip() + self.hiadhp_kind3 = record[164].strip() + self.hiadhp_code4 = record[165].strip() + self.hiadhp_kind4 = record[166].strip() + self.hiadhp_code5 = record[167].strip() + self.hiadhp_kind5 = record[168].strip() + self.hiadhp_code6 = record[169].strip() + self.hiadhp_kind6 = record[170].strip() + self.hiadhp_code7 = record[171].strip() + self.hiadhp_kind7 = record[172].strip() + self.hiadhp_code8 = record[173].strip() + self.hiadhp_kind8 = record[174].strip() + self.hiadhp_code9 = record[175].strip() + self.hiadhp_kind9 = record[176].strip() + self.hiadhp_code10 = record[177].strip() + self.hiadhp_kind10 = record[178].strip() + self.hiadhp_code11 = record[179].strip() + self.hiadhp_kind11 = record[180].strip() + self.hiadhp_code12 = record[181].strip() + self.hiadhp_kind12 = record[182].strip() + self.hiadhp_code13 = record[183].strip() + self.hiadhp_kind13 = record[184].strip() + self.hiadhp_code14 = record[185].strip() + self.hiadhp_kind14 = record[186].strip() + self.hiadhp_code15 = record[187].strip() + self.hiadhp_kind15 = record[188].strip() + self.hiadhp_code16 = record[189].strip() + self.hiadhp_kind16 = record[190].strip() + self.hiadhp_code17 = record[191].strip() + self.hiadhp_kind17 = record[192].strip() + self.hiadhp_code18 = record[193].strip() + self.hiadhp_kind18 = record[194].strip() + self.hiadhp_code19 = record[195].strip() + self.hiadhp_kind19 = record[196].strip() + self.hiadhp_code20 = record[197].strip() + self.hiadhp_kind20 = record[198].strip() + self.hiadhp_code21 = record[199].strip() + self.hiadhp_kind21 = record[200].strip() + self.hiadhp_code22 = record[201].strip() + self.hiadhp_kind22 = record[202].strip() + self.hiadhp_code23 = record[203].strip() + self.hiadhp_kind23 = record[204].strip() + self.hiadhp_code24 = record[205].strip() + self.hiadhp_kind24 = record[206].strip() + self.hiadhp_code25 = record[207].strip() + self.hiadhp_kind25 = record[208].strip() + self.hiadhp_code26 = record[209].strip() + self.hiadhp_kind26 = record[210].strip() + self.hiadhp_code27 = record[211].strip() + self.hiadhp_kind27 = record[212].strip() + self.hiadhp_code28 = record[213].strip() + self.hiadhp_kind28 = record[214].strip() + self.hiadhp_code29 = record[215].strip() + self.hiadhp_kind29 = record[216].strip() + self.hiadhp_code30 = record[217].strip() + self.hiadhp_kind30 = record[218].strip() + self.hiadhp_code31 = record[219].strip() + self.hiadhp_kind31 = record[220].strip() + self.hiadhp_code32 = record[221].strip() + self.hiadhp_kind32 = record[222].strip() + self.hiadhp_code33 = record[223].strip() + self.hiadhp_kind33 = record[224].strip() + self.hiadhp_code34 = record[225].strip() + self.hiadhp_kind34 = record[226].strip() + self.hiadhp_code35 = record[227].strip() + self.hiadhp_kind35 = record[228].strip() + self.hiadhp_code36 = record[229].strip() + self.hiadhp_kind36 = record[230].strip() + self.hiadhp_code37 = record[231].strip() + self.hiadhp_kind37 = record[232].strip() + self.hiadhp_code38 = record[233].strip() + self.hiadhp_kind38 = record[234].strip() + self.hiadhp_code39 = record[235].strip() + self.hiadhp_kind39 = record[236].strip() + self.hiadhp_code40 = record[237].strip() + self.hiadhp_kind40 = record[238].strip() + + self.hitechhp_flag = record[239].strip() + self.hitechhp_kind1 = record[240].strip() + self.hitechhp_kind2 = record[241].strip() + self.hitechhp_kind3 = record[242].strip() + self.hitechhp_kind4 = record[243].strip() + self.hitechhp_kind5 = record[244].strip() + self.hitechhp_kind6 = record[245].strip() + self.hitechhp_kind7 = record[246].strip() + self.hitechhp_kind8 = record[247].strip() + self.hitechhp_kind9 = record[248].strip() + self.hitechhp_kind10 = record[249].strip() + self.hitechhp_kind11 = record[250].strip() + self.hitechhp_kind12 = record[251].strip() + self.hitechhp_kind13 = record[252].strip() + self.hitechhp_kind14 = record[253].strip() + self.hitechhp_kind15 = record[254].strip() + self.hitechhp_kind16 = record[255].strip() + self.hitechhp_kind17 = record[256].strip() + self.hitechhp_kind18 = record[257].strip() + self.hitechhp_kind19 = record[258].strip() + self.hitechhp_kind20 = record[259].strip() + + self.policy_medical_flag = record[260].strip() + self.policy_medical_code01 = record[261].strip() + self.policy_medical_content01 = record[262].strip() + self.policy_medical_code02 = record[263].strip() + self.policy_medical_content02 = record[264].strip() + self.policy_medical_code03 = record[265].strip() + self.policy_medical_content03 = record[266].strip() + self.policy_medical_code04 = record[267].strip() + self.policy_medical_content04 = record[268].strip() + self.policy_medical_code05 = record[269].strip() + self.policy_medical_content05 = record[270].strip() + self.policy_medical_code06 = record[271].strip() + self.policy_medical_content06 = record[272].strip() + self.policy_medical_code07 = record[273].strip() + self.policy_medical_content07 = record[274].strip() + self.policy_medical_code08 = record[275].strip() + self.policy_medical_content08 = record[276].strip() + self.policy_medical_code09 = record[277].strip() + self.policy_medical_content09 = record[278].strip() + self.policy_medical_code10 = record[279].strip() + self.policy_medical_content10 = record[280].strip() + self.policy_medical_code11 = record[281].strip() + self.policy_medical_content11 = record[282].strip() + self.policy_medical_code12 = record[283].strip() + self.policy_medical_content12 = record[284].strip() + self.policy_medical_code13 = record[285].strip() + self.policy_medical_content13 = record[286].strip() + self.policy_medical_code14 = record[287].strip() + self.policy_medical_content14 = record[288].strip() + self.policy_medical_code15 = record[289].strip() + self.policy_medical_content15 = record[290].strip() + self.policy_medical_code16 = record[291].strip() + self.policy_medical_content16 = record[292].strip() + self.policy_medical_code17 = record[293].strip() + self.policy_medical_content17 = record[294].strip() + self.policy_medical_code18 = record[295].strip() + self.policy_medical_content18 = record[296].strip() + self.policy_medical_code19 = record[297].strip() + self.policy_medical_content19 = record[298].strip() + self.policy_medical_code20 = record[299].strip() + self.policy_medical_content20 = record[300].strip() + + self.visitcarest_flag = record[301].strip() + self.visitcarestation_id = record[302].strip() + self.visitcarestation_code = record[303].strip() + self.visitcarestation_yobi = record[304].strip() + + self.open_date = record[305].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfhp_yobi + # 療養型病床群 + self.resthp_items = [ + self.resthp_care_kind, + self.resthp_bed_num, + self.resthp_ok_date, + self.resthp_can_date, + self.resthp_care_nrs_kind, + self.resthp_care_bed_num, + self.resthp_care_ok_date, + self.resthp_care_can_date, + self.resthp_sbed_num + ] + + # 臨床研修指定病院リスト + self.cl_items = [ + self.clolyhp_kind, + self.clolyhp_ok_date, + self.clolyhp_can_date, + self.clhp_kind, + self.clhp_ok_date, + self.clhp_can_date, + self.cldephp_kind, + self.cldephp_ok_date, + self.cldephp_can_date + ] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index c6c8bc68..44a68a3f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -30,6 +30,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \ ComDrMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \ ComDrSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_att_mapper import \ + ComInstAttMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -39,7 +41,7 @@ COM_TABLE_LIST = { # COM_医師学会 "521": ComDrSosietyMapper, # COM_施設属性 - "111": NullMapper, + "111": ComInstAttMapper, # COM_臨床研修病院 "112": NullMapper, # COM_医師 From ccd3ac3026a965d3222f7e8778002fc12413f969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 9 May 2023 09:54:07 +0900 Subject: [PATCH 227/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_inst_mapper.py | 6 ++++-- .../batch/ultmarc/utmp_tables/tables/com_inst.py | 9 ++++----- .../table_mapper/com_inst/test_com_inst_mapper.py | 14 +++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index 901d2b9b..a7146b42 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst class ComInstMapper(UltmarcTableMapper): - """レイアウト区分101: COM_施設 登録処理: TODO""" + """レイアウト区分101: COM_施設 登録処理""" # レコード存在確認SQL(COM_施設) RECORD_EXISTS_QUERY = """\ @@ -487,6 +487,7 @@ class ComInstMapper(UltmarcTableMapper): def __make_delete_insert_trt_query(self): # 施設診療科目の削除挿入 + # 診療科目(集合項目)のいずれも入力がない場合、何もしない if sum(len(item) for item in self.record.medsbj_code) == 0: return @@ -500,13 +501,14 @@ class ComInstMapper(UltmarcTableMapper): for medsbj_code in self.record.medsbj_code: if len(medsbj_code) > 0: insert_query = self.INSERT_INST_TRT_QUERY.format( - trt_course_cd="'" + medsbj_code + "'" + trt_course_cd=f"'{medsbj_code}'" ) self.queries.append(insert_query) return def __make_upsert_spcare_query(self): # 特養医務室の追加、更新 + # DCF親施設コードがない場合、何もしない if (self.record.dcf_prnt_inst_code == "00" or len(self.record.dcf_prnt_inst_code) == 0): return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py index 954afa88..167480d2 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst.py @@ -136,11 +136,10 @@ class ComInst(UltmarcTable): self.close_year_month = record[45].strip() # 診療科目1~60(csvカラム番号 46 ~ 105) - num = 46 + # rangeの第2引数の数字はループに含まれないため、+1を指定する self.medsbj_code = [] - for i in range(0, 60): - self.medsbj_code.append(str(record[num])) - num += 1 + for i in range(46, 106): + self.medsbj_code.append(str(record[i])) self.hp_kind_code = record[106].strip() self.reexam_flag = record[107].strip() @@ -158,7 +157,7 @@ class ComInst(UltmarcTable): self.bed_num_gen2 = record[119].strip() self.bed_num_rest = record[120].strip() - # smallint対策 + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する self.bed_num = self.bed_num if len(self.bed_num) > 0 else None self.bed_num_sum = self.bed_num_sum if len(self.bed_num_sum) > 0 else None self.bed_num_psy = self.bed_num_psy if len(self.bed_num_psy) > 0 else None diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 7575319c..84fc58e8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -28,13 +28,13 @@ class TestComInstMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): @@ -280,7 +280,7 @@ class TestComInstMapper: actual_data_list.append(sp_trt_data[0]) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -300,7 +300,7 @@ class TestComInstMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -435,7 +435,7 @@ class TestComInstMapper: actual_data_list.append(sp_trt_data[0]) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -454,14 +454,14 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_spcare_med_office_dat WHERE dcf_chld_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: if expect_row[expect_col_name] is None: assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: From e312b14269672768b2aaf59cff7f24d75a816f22 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 14:01:40 +0900 Subject: [PATCH 228/962] =?UTF-8?q?feat:=20=E9=A0=85=E7=9B=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 10 ++++++++-- s3/data/crm/settings/CRM_Event.txt | 4 ++-- s3/data/crm/settings/CRM_Suggestion_vod__c.txt | 4 ++-- s3/data/crm/settings/CRM_Task.txt | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) 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 9dd9f14a..f6a7d9c7 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3018,6 +3018,8 @@ "SystemModstamp", "MayEdit", "IsLocked", + "LastViewedDate", + "LastReferencedDate", "Account_Priority_Score_vod__c", "Account_vod__c", "Action_Count_vod__c", @@ -3047,6 +3049,8 @@ "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" @@ -3170,7 +3174,8 @@ "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", "MSJ_Task_Source__c", - "MSJ_Visit_Type__c" + "MSJ_Visit_Type__c", + "User_ID__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -3227,7 +3232,8 @@ "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", "MSJ_Task_Source__c", - "MSJ_Visit_Type__c" + "MSJ_Visit_Type__c", + "User_ID__c" ], "is_skip": false, "is_update_last_fetch_datetime": true diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt index ed6c978e..eab91799 100644 --- a/s3/data/crm/settings/CRM_Event.txt +++ b/s3/data/crm/settings/CRM_Event.txt @@ -5,8 +5,8 @@ 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 +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,User_ID__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,User_ID__c src02.crm_Event org02.crm_Event diff --git a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt index 0b819bda..29bd67a6 100644 --- a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt +++ b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 44 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,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,MSJ_Reason_unformatted__c,MSJ_Data_Id__c,MSJ_reason_id__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,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,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 +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_Task.txt b/s3/data/crm/settings/CRM_Task.txt index 45e1735b..7802e65f 100644 --- a/s3/data/crm/settings/CRM_Task.txt +++ b/s3/data/crm/settings/CRM_Task.txt @@ -5,8 +5,8 @@ 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 +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,User_ID__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,User_ID__c src02.crm_Task org02.crm_Task From daede1cb617dce353207c0a6a582a41433842c22 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 15:48:56 +0900 Subject: [PATCH 229/962] =?UTF-8?q?fix:=20=E9=A0=85=E7=9B=AE=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Event.txt | 2 +- s3/data/crm/settings/CRM_Task.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt index eab91799..dc25267f 100644 --- a/s3/data/crm/settings/CRM_Event.txt +++ b/s3/data/crm/settings/CRM_Event.txt @@ -4,7 +4,7 @@ utf-8 " CRLF 1 -59 +60 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,User_ID__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,User_ID__c src02.crm_Event diff --git a/s3/data/crm/settings/CRM_Task.txt b/s3/data/crm/settings/CRM_Task.txt index 7802e65f..29aa0f0a 100644 --- a/s3/data/crm/settings/CRM_Task.txt +++ b/s3/data/crm/settings/CRM_Task.txt @@ -4,7 +4,7 @@ utf-8 " CRLF 1 -50 +51 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,User_ID__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,User_ID__c src02.crm_Task From aed483161aeeb9653d1dee0a3ce19363afcede38 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 16:04:48 +0900 Subject: [PATCH 230/962] =?UTF-8?q?fix:=20Suggestion=E3=81=AE=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=82=82=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Suggestion_vod__c.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt index 29bd67a6..96ab5c78 100644 --- a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt +++ b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt @@ -4,7 +4,7 @@ utf-8 " CRLF 1 -44 +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 From b835aaa6ff59064f1f8152a9deade1edcbbadbe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 9 May 2023 16:21:44 +0900 Subject: [PATCH 231/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E5=AE=8C?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 34 +-- .../utmp_tables/tables/com_inst_att.py | 31 ++- .../com_inst/test_com_inst_mapper.py | 4 +- .../table_mapper/com_inst_att/__init__.py | 0 .../com_inst_att/com_inst_att_delete.csv | 6 + .../com_inst_att/com_inst_att_insert.csv | 20 ++ .../com_inst_att/com_inst_att_update.csv | 5 + .../db_com_inst_att_before_delete.csv | 23 ++ .../db_com_inst_att_before_update.csv | 6 + .../expect_com_inst_att_delete.csv | 17 ++ .../expect_com_inst_att_insert.csv | 21 ++ .../expect_com_inst_att_update.csv | 6 + .../com_inst_att/test_com_inst_att_mapper.py | 232 ++++++++++++++++++ 13 files changed, 377 insertions(+), 28 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index 6f9de396..14a0dd59 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -412,8 +412,8 @@ class ComInstAttMapper(UltmarcTableMapper): :anesthetizing_manage_spec_day, :anesthetizing_manage_can_day, :home_recuperation_flag, - :home_recuperation_specday, - :home_recuperation_cancelday, + :home_recuperation_spec_day, + :home_recuperation_cancel_day, :synthesis_when_staying_flag, :synthesis_when_staying_spec_day, :synthesis_when_staying_can_day, @@ -666,7 +666,7 @@ class ComInstAttMapper(UltmarcTableMapper): def make_query(self): # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 - if self.record.maint_flag == 'C' and self.record.adddel_div == 1: + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return @@ -732,7 +732,7 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('areasuphpcandate = :areasuphp_can_date') if self.record.areasuphp_flag == '@': self.query_parameter['areasuphp_flag'] = '' - self.query_parameter['areasuphp_intrate'] = '' + self.query_parameter['areasuphp_intrate'] = None self.query_parameter['areasuphp_ok_date'] = '' self.query_parameter['areasuphp_can_date'] = '' @@ -960,8 +960,8 @@ class ComInstAttMapper(UltmarcTableMapper): # ケアミックス区分 if len(self.record.caremix_kind) > 0: - set_clauses.append('homelateflag = :caremix_kind') - if self.record.caremixkind == '@': + set_clauses.append('caremixkind = :caremix_kind') + if self.record.caremix_kind == '@': self.query_parameter['caremix_kind'] = '' # 完全型・移行型区分 @@ -971,7 +971,7 @@ class ComInstAttMapper(UltmarcTableMapper): self.query_parameter['fullmove_flag'] = '' # 療養型病床群 - if sum(len(item) for item in self.record.resthp_list) > 0: + if sum(len(item) for item in self.record.resthp_items) > 0: set_clauses.append('resthpflag = :resthp_flag') set_clauses.append('resthpcarekind = :resthp_care_kind') set_clauses.append('resthpbednum = :resthp_bed_num') @@ -985,14 +985,14 @@ class ComInstAttMapper(UltmarcTableMapper): if self.record.resthp_flag == '@': self.query_parameter['resthp_flag'] = '' self.query_parameter['resthp_care_kind'] = '' - self.query_parameter['resthp_bed_num'] = '' + self.query_parameter['resthp_bed_num'] = None self.query_parameter['resthp_ok_date'] = '' self.query_parameter['resthp_can_date'] = '' self.query_parameter['resthp_care_nrs_kind'] = '' - self.query_parameter['resthp_care_bed_num'] = '' + self.query_parameter['resthp_care_bed_num'] = None self.query_parameter['resthp_care_ok_date'] = '' self.query_parameter['resthp_care_can_date'] = '' - self.query_parameter['resthp_sbed_num'] = '' + self.query_parameter['resthp_sbed_num'] = None # 一般病棟 if len(self.record.nrmhp_flag) > 0: @@ -1002,7 +1002,7 @@ class ComInstAttMapper(UltmarcTableMapper): if self.record.nrmhp_flag == '@': self.query_parameter['nrmhp_flag'] = '' self.query_parameter['nrmhp_care_kind'] = '' - self.query_parameter['nrmhp_bed_total_num'] = '' + self.query_parameter['nrmhp_bed_total_num'] = None # 精神病棟 if len(self.record.menthp_flag) > 0: @@ -1012,7 +1012,7 @@ class ComInstAttMapper(UltmarcTableMapper): if self.record.menthp_flag == '@': self.query_parameter['menthp_flag'] = '' self.query_parameter['menthp_care_kind'] = '' - self.query_parameter['menthp_bed_num'] = '' + self.query_parameter['menthp_bed_num'] = None # 結核病棟 if len(self.record.tubhp_flag) > 0: @@ -1022,7 +1022,7 @@ class ComInstAttMapper(UltmarcTableMapper): if self.record.tubhp_flag == '@': self.query_parameter['tubhp_flag'] = '' self.query_parameter['tubhp_care_kind'] = '' - self.query_parameter['tubhp_bed_num'] = '' + self.query_parameter['tubhp_bed_num'] = None # 感染症指定医療機関 if len(self.record.infhp_flag) > 0: @@ -1040,7 +1040,7 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('infhpbednum = :infhp_bed_num') if self.record.infhp_bed_flag == '@': self.query_parameter['infhp_bed_flag'] = '' - self.query_parameter['infhp_bed_num'] = '' + self.query_parameter['infhp_bed_num'] = None # 緩和ケア病棟設置病院 if len(self.record.hospice_flag) > 0: @@ -1050,7 +1050,7 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('hospicecandate = :hospice_can_date') if self.record.hospice_flag == '@': self.query_parameter['hospice_flag'] = '' - self.query_parameter['hospice_bed_num'] = '' + self.query_parameter['hospice_bed_num'] = None self.query_parameter['hospice_ok_date'] = '' self.query_parameter['hospice_can_date'] = '' @@ -1059,12 +1059,12 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('hpfuncestflag = :hpfunce_st_flag') set_clauses.append('hpfuncestkind = :hpfunce_st_kind') set_clauses.append('hpfuncestokdate = :hpfunce_st_ok_date') - set_clauses.append('hpfuncestcandate = :hospice_ok_date') + set_clauses.append('hpfuncestcandate = :hpfunce_st_can_date') if self.record.hpfunce_st_flag == '@': self.query_parameter['hpfunce_st_flag'] = '' self.query_parameter['hpfunce_st_kind'] = '' self.query_parameter['hpfunce_st_ok_date'] = '' - self.query_parameter['hospice_ok_date'] = '' + self.query_parameter['hpfunce_st_can_date'] = '' # 臨床研修指定病院 if sum(len(item) for item in self.record.cl_items) > 0: diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py index 57f59a82..77ec6cf6 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py @@ -19,7 +19,7 @@ class ComInstAtt(UltmarcTable): funchp_ok_date: str # 特定機能病院承認年月日 funchp_can_date: str # 特定機能病院取消年月日 areasuphp_flag: str # 地域医療支援病院フラグ - areasuphp_intrate: str # 地域医 ※ + areasuphp_intrate: str # 地域医療支援病院紹介率 ※ areasuphp_ok_date: str # 地域医療支援病院承認年月日 areasuphp_can_date: str # 地域医療支援病院取消年月日 acuthp_add_flag: str # 超急性期脳卒中加算フラグ @@ -103,30 +103,30 @@ class ComInstAtt(UltmarcTable): fullmove_flag: str # 完全型・移行型区分 resthp_flag: str # 療養型病床群フラグ resthp_care_kind: str # 療養型病床群_医療型(看護種別) - resthp_bed_num: str # 療養 ※ + resthp_bed_num: str # 療養型病床群_医療型(病床数) ※ resthp_ok_date: str # 療養型病床群_医療型(承認年月日) resthp_can_date: str # 療養型病床群_医療型(取消年月日) resthp_care_nrs_kind: str # 療養型病床群_介護型(看護種別) - resthp_care_bed_num: str # 療養  ※ + resthp_care_bed_num: str # 療養型病床群_介護型(病床数) ※ resthp_care_ok_date: str # 療養型病床群_介護型(承認年月日) resthp_care_can_date: str # 療養型病床群_介護型(取消年月日) - resthp_sbed_num: str # 療養  ※ + resthp_sbed_num: str # 療養型病床群_稼動数合計(病床数) ※ nrmhp_flag: str # 一般病棟フラグ nrmhp_care_kind: str # 一般病棟看護種別 - nrmhp_bed_total_num: str # 一般  ※ + nrmhp_bed_total_num: str # 一般病棟病床数 ※ menthp_flag: str # 精神病棟フラグ menthp_care_kind: str # 精神病棟看護種別 - menthp_bed_num: str # 精神  ※ + menthp_bed_num: str # 精神病棟病床数 ※ tubhp_flag: str # 結核病棟フラグ tubhp_care_kind: str # 結核病棟看護種別 - tubhp_bed_num: str # 結核  ※ + tubhp_bed_num: str # 結核病棟病床数 ※ infhp_flag: str # 感染症特定 infhp_flag1: str # 感染症1種 infhp_flag2: str # 感染症2種 infhp_bed_flag: str # 感染症病床フラグ - infhp_bed_num: str # 感染症病  ※ + infhp_bed_num: str # 感染症病床病床数 ※ hospice_flag: str # 緩和ケア病棟設置病院フラグ - hospice_bed_num: str # 緩和ケア  ※ + hospice_bed_num: str # 緩和ケア病棟設置病院病床数 ※ hospice_ok_date: str # 緩和ケア病棟設置病院承認年月日 hospice_can_date: str # 緩和ケア病棟設置病院取消年月日 hpfunce_st_flag: str # 医療機能評価フラグ @@ -663,8 +663,10 @@ class ComInstAtt(UltmarcTable): # DCFDSF施設コード self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfhp_yobi + # 療養型病床群 self.resthp_items = [ + self.resthp_flag, self.resthp_care_kind, self.resthp_bed_num, self.resthp_ok_date, @@ -688,3 +690,14 @@ class ComInstAtt(UltmarcTable): self.cldephp_ok_date, self.cldephp_can_date ] + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.areasuphp_intrate = self.areasuphp_intrate if len(self.areasuphp_intrate) > 0 else None + self.resthp_bed_num = self.resthp_bed_num if len(self.resthp_bed_num) > 0 else None + self.resthp_care_bed_num = self.resthp_care_bed_num if len(self.resthp_care_bed_num) > 0 else None + self.resthp_sbed_num = self.resthp_sbed_num if len(self.resthp_sbed_num) > 0 else None + self.nrmhp_bed_total_num = self.nrmhp_bed_total_num if len(self.nrmhp_bed_total_num) > 0 else None + self.menthp_bed_num = self.menthp_bed_num if len(self.menthp_bed_num) > 0 else None + self.tubhp_bed_num = self.tubhp_bed_num if len(self.tubhp_bed_num) > 0 else None + self.infhp_bed_num = self.infhp_bed_num if len(self.infhp_bed_num) > 0 else None + self.hospice_bed_num = self.hospice_bed_num if len(self.hospice_bed_num) > 0 else None diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 84fc58e8..4c4058d8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -28,13 +28,13 @@ class TestComInstMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv new file mode 100644 index 00000000..baf15d84 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_delete.csv @@ -0,0 +1,6 @@ +"111","123","456789","99","B","1","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900146","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900615","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9901806","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9901918","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9904136","","B","1","20160905","20160910","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv new file mode 100644 index 00000000..57045790 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_insert.csv @@ -0,0 +1,20 @@ +"111","123","456789","99","A","0","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900146","","A","2","20141113","20141114","1","20080701","","","","","1","20100401","","","","","1","","20011022","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","","","20081130","1","20130501","","1","99","","","","","","","","","","","","","","","","","","","","1","20130501","","1","20140401","","1","20130501","","1","01","02","03","04","","","","","","","1","20130501","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","4","","","","","","","","","","","20040229","1","20031030","","1","20050914","","1","1","","1","","","","","","1","20090401","","","","1","217","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195604" +"111","00","9900194","","A","2","20141113","20141114","1","20060501","","","","","","","","","","","","","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204" +"111","00","9900615","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900631","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","","","","6","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"111","00","9900700","","A","2","20141113","20141114","1","20100701","","","","","1","20100401","","","","","1","","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","4","","","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310" +"111","00","9901649","","A","2","20141113","20141114","","","","1","2009","","","","","","","","","","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","","","","43","1","B999","120","","","","","","","","","","","","","","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004" +"111","00","9901806","","A","2","20141113","20141114","1","20090401","","","","","1","20100401","","","","","1","","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","8","","","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011" +"111","00","9901820","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","","","","4101","116","20090501","","116","1","B999","40","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405" +"111","00","9901918","","A","2","20141113","20141114","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","","","","84","1","B999","177","","","","","","","","","","","","","","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601" +"111","00","9902043","","A","2","20141113","20141114","1","20140401","","","","20140331","","","","","","","","","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004" +"111","00","9902175","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704" +"111","00","9902728","","A","2","20141113","20141114","1","20090401","","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","","","20040430","","","","20040430","","","","","","","","","","","","","","","","","","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005" +"111","00","9903500","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","","","","26","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912" +"111","00","9904136","","A","2","20141113","20141114","1","20080701","","","","","","","","","","","1","","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","1","1","10","","","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208" +"111","00","9904439","","A","2","20141113","20141114","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","","","20040930","54","1","B999","450","","","","","","","","","","","","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812" +"111","00","9906696","","A","2","20141113","20141114","1","20060601","","","","","","","","","","","1","","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708" +"111","00","9908576","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","","","","33","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704" +"111","00","9910624","","A","2","20141113","20141114","1","20030401","","","","","1","20120401","","1","19940201","","","","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202" +"111","00","9929798","","A","2","20141113","20141114","1","20080701","","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv new file mode 100644 index 00000000..ad999396 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/com_inst_att_update.csv @@ -0,0 +1,5 @@ +"111","123","456789","99","A","0","NULL","NULL","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303" +"111","00","9900631","","B","","20141113","20141114","1","20171009","","1","2017","20171009","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","@","","","","","","","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","" +"111","00","9901649","","B","","20141113","20141114","","","","1","2009","20171010","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710" +"111","00","9990146","","B","","20171113","20171114","@","","","@","","","@","","","@","","","@","","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","@","","","","","","","","","","","","","","","","","","","","","@","","","@","","","@","","","@","","","","","","","","","","","@","","","@","","","@","","","@","","","@","@","@","","","","","","","","","","@","","","@","","","@","","","@","","","@","","@","","","","@","","","","@","","","","","","","","","@","@","","","@","@","","","","@","","","@","@","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","@" +"111","99","9999999","99","B","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv new file mode 100644 index 00000000..ba1b07af --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_delete.csv @@ -0,0 +1,23 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" +"009900146","1","20171009","20171009","2","2017","20171009","3","20171009","20171009","4","19940928","20171009","5","99.9","20171009","20171009","6","20120401","20171009","7","20171009","20171009","8","20171009","20171009","9","20121201","20171009","A","20090701","20171009","B","20061101","20171009","C","20171009","20171009","D","20171009","20171009","E","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","F","20100401","20171009","G","20140401","20171009","H","20140401","20171009","I","01","02","03","04","05","06","07","08","09","10","J","20140401","20171009","K","20171009","20171009","L","20171009","20171009","M","20171009","20171009","N","O","P","1234","9999","20171009","20171009","2234","8888","20171009","20171009","7777","Q","3234","6666","R","4234","5555","S","5234","4444","T","T","T","U","3333","V","2222","20171009","20171009","W","08","20100402","20171009","X","20171009","20060331","1","20041001","20171009","1","20040331","20171009","Y","Z","Z","Z","1","2","2","20070702","20171009","3","20171009","20171009","4","5","6","001","1","002","1","003","1","004","1","005","1","006","1","007","1","008","1","009","1","010","1","011","1","012","1","013","1","014","1","015","1","016","1","017","1","018","1","019","1","020","1","021","1","022","1","023","1","024","1","025","1","026","1","027","1","028","1","029","1","030","1","031","1","032","1","033","1","034","1","035","1","036","1","037","1","038","1","039","1","040","1","7","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","8","A1","1","A2","1","A3","1","A4","1","A5","1","A6","1","A7","1","A8","1","A9","1","B0","1","B1","1","B2","1","B3","1","B4","1","B5","1","B6","1","B7","1","B8","1","B9","1","C0","1","9","00","1234567","","192202","20171008","20171009","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/09 18:23:21","clsComInstAtt" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900615","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009901806","1","20090401","","","","","1","20100401","","","","","1","NULL","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","8","","NULL","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901918","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","NULL","","","84","1","B999","177","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904136","1","20080701","","","","","","","","","","","1","NULL","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","1","1","1","1","10","","NULL","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv new file mode 100644 index 00000000..b867c731 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/db_com_inst_att_before_update.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"12345678999","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900631","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","NULL","","","6","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","1","20171009","20171009","2","2017","20171009","3","20171009","20171009","4","19940928","20171009","5","99.9","20171009","20171009","6","20120401","20171009","7","20171009","20171009","8","20171009","20171009","9","20121201","20171009","A","20090701","20171009","B","20061101","20171009","C","20171009","20171009","D","20171009","20171009","E","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","F","20100401","20171009","G","20140401","20171009","H","20140401","20171009","I","01","02","03","04","05","06","07","08","09","10","J","20140401","20171009","K","20171009","20171009","L","20171009","20171009","M","20171009","20171009","N","O","P","1234","9999","20171009","20171009","2234","8888","20171009","20171009","7777","Q","3234","6666","R","4234","5555","S","5234","4444","T","T","T","U","3333","V","2222","20171009","20171009","W","08","20100402","20171009","X","20171009","20060331","1","20041001","20171009","1","20040331","20171009","Y","Z","Z","Z","1","2","2","20070702","20171009","3","20171009","20171009","4","5","6","001","1","002","1","003","1","004","1","005","1","006","1","007","1","008","1","009","1","010","1","011","1","012","1","013","1","014","1","015","1","016","1","017","1","018","1","019","1","020","1","021","1","022","1","023","1","024","1","025","1","026","1","027","1","028","1","029","1","030","1","031","1","032","1","033","1","034","1","035","1","036","1","037","1","038","1","039","1","040","1","7","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","8","A1","1","A2","1","A3","1","A4","1","A5","1","A6","1","A7","1","A8","1","A9","1","B0","1","B1","1","B2","1","B3","1","B4","1","B5","1","B6","1","B7","1","B8","1","B9","1","C0","1","9","00","1234567","","192202","20171009","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/09 18:31:09","clsComInstAtt" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","aaaa","2023/05/09 10:10:10","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv new file mode 100644 index 00000000..9c17fa45 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_delete.csv @@ -0,0 +1,17 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2017/10/08 20:57:12","clsComInstAtt" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2017/10/11 20:39:02","clsComInstAtt" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv new file mode 100644 index 00000000..264abcbe --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_insert.csv @@ -0,0 +1,21 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","1","20080701","","","","","1","20100401","","","","","1","NULL","20011022","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","1","20130501","","","","20081130","1","20130501","","1","99","","","","","","","","","","","","","","","","","","","","1","20130501","","1","20140401","","1","20130501","","1","01","02","03","04","","","","","","","1","20130501","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","","","","20040229","1","20031030","","1","20050914","","1","1","","1","","","","","","1","20090401","","","","1","217","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195604","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900194","1","20060501","","","","","","","","","","","","NULL","","20111231","","","","","","","1","20130801","","1","20140501","","1","20120401","","","","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20091101","","1","20131101","","1","01","02","03","","","","","","","","1","20080601","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20130705","","","","","","","20110331","1","20040331","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198204","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900615","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900631","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20120401","","1","20060401","","1","19971001","","","1","1","3991","6","19990930","","","NULL","","","6","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009900700","1","20100701","","","","","1","20100401","","","","","1","NULL","20080514","","1","20080401","","","","","1","20140401","","1","20061101","","1","20080401","","1","20120601","","","","","1","20080601","","1","99","","","","","","","","","","","","","","","","","","","","1","20061101","","1","20061101","","1","20080401","","1","01","02","03","","","","","","","","1","20061101","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","4","","NULL","","","","","","20061118","1","20030401","","","","","1","20031030","","1","1","1","1","","","","","","","","","","","1","169","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","31","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195310","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901649","","","","1","2009","","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198004","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901806","1","20090401","","","","","1","20100401","","","","","1","NULL","20130806","","1","20080401","","","","","1","20131101","","1","20000401","","1","20080401","","","","","","","","1","20130901","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20020401","","1","20110701","","1","01","02","03","","","","","","","","1","19960401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","1","1","8","","NULL","","20010731","1","13","20140502","","","","20040229","1","20031030","","1","20031030","","1","1","","1","","","","","","","","","1","1","1","202","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195011","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901820","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","19981130","1","20030601","","","","","1","01","02","","","","","","","","","","","","1","20140301","","","","","","","","1","1","1","","NULL","","","4101","116","20090501","","116","1","B999","40","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","1","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","196405","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009901918","","","","","","","","","","","","","1","84.6","20020218","","","","","","","","1","20130901","","1","20051001","","1","20120101","","","","","","","","1","19780401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","20070531","","","","1","01","02","03","04","","","","","","","","","20070228","","","","","","","","","","1","1","1","I002","84","20120101","","","NULL","","","84","1","B999","177","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","11","20110506","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","3404537","","196601","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902043","1","20140401","","","","20140331","","","","","","","","NULL","","","","","","","","","1","20130501","","1","20100401","","1","20100401","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100601","","","","","1","20100401","","1","01","02","","","","","","","","","","","","","","","","","","","","","1","9","1","I002","48","20110401","","","NULL","","","48","1","B999","224","1","M999","40","1","K999","4","","","1","1","4","","NULL","","","","","","","","","","","","","1","20040331","","1","1","","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201004","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902175","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20111001","","1","20111001","","1","20111001","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","20110331","","","","","1","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","199704","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009902728","1","20090401","","","","","","","","","","","","NULL","","","","","","","","","1","20140401","","1","20140401","","1","20120801","","","","","1","20100401","","","","20040131","1","99","","","","","","","","","","","","","","","","","","","","1","20040214","","1","20100801","","1","20120401","","1","01","02","03","04","","","","","","","1","20030801","","","","","","","","","","","","","","","NULL","","20040430","","NULL","","20040430","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20121207","","","","","","","","1","20080919","","","1","1","","","","","","","","","","1","1","1","198","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","5303814","","198005","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009903500","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2","9","1","I001","26","20061001","","","NULL","","","26","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198912","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009904136","1","20080701","","","","","","","","","","","1","NULL","20111125","","1","20110401","","1","20130501","","1","20120601","","1","20110401","","1","20110401","","","","","","","","1","20110401","","1","99","","","","","","","","","","","","","","","","","","","","1","20110401","","1","20110801","","1","20110401","","1","01","02","03","04","","","","","","","1","20110401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","1","1","1","1","10","","NULL","","","1","13","20140307","","","","","1","19990401","","1","20040331","","1","1","1","1","","","","","","","","","1","","1","228","5","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195208","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009904439","1","20060401","","","","","","","20100331","","","","1","97.9","20041105","","","","","","","","1","20130401","","1","20140401","","1","20100701","","","","","","","","1","20020201","","1","99","","","","","","","","","","","","","","","","","","","","1","20140401","","1","20140401","","","","","1","01","02","03","","","","","","","","1","20131101","","","","","","","","","","","1","1","1","I001","54","20120401","","","NULL","","20040930","54","1","B999","450","","","NULL","","","NULL","","","","","NULL","1","21","20130901","","1","13","20130906","","","","","1","20041001","","","","","1","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","198812","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009906696","1","20060601","","","","","","","","","","","1","NULL","20100401","","1","20080401","","","","","1","20140401","","1","20020401","","1","20080701","","","","","","","","1","20090401","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20040501","","","","20081130","1","01","02","03","04","","","","","","","1","19970901","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140404","","","","","1","20031030","","1","20031027","","","1","1","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","00","8106522","","199708","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009908576","","","","","","","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","","","","","","","","","","","","","","","","","20070831","","","20070831","","","","2","9","1","I001","33","20130401","","","NULL","","","33","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","200704","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009910624","1","20030401","","","","","1","20120401","","1","19940201","","","NULL","","","1","20120401","","","","","","","","1","20121201","","1","20090701","","1","20061101","","","","","","","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","1","20140401","","1","20140401","","1","01","02","03","04","","","","","","","1","20140401","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","08","20100402","","","","20060331","1","20041001","","1","20040331","","1","1","1","","","1","2","20070702","","","","","1","1","1","002","1","006","1","051","4","004","1","100","2","165","1","035","1","168","1","118","1","101","1","182","","202","1","214","5","149","","197","1","198","","177","1","183","1","213","5","217","5","212","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","31","34","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","192202","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"009929798","1","20080701","","","","","","","","","","","","NULL","","","","","","","","","1","20100401","","1","20090301","","1","20100401","","","","20080531","","","","1","19971201","","","","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","1","20080401","","1","01","02","03","","","","","","","","","","","","","","","","","","","","","","","","NULL","","","","NULL","","","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","13","20140106","","","","","","","","1","20040331","","","1","1","","","","","","","","","","1","1","1","168","1","197","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","195305","20171008","20230509","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_inst_att_mapper","2017/10/08 20:57:12","com_inst_att_mapper" +"12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20230509","20230509","NULL","NULL","NULL","NULL","2023/05/09 10:10:10","com_inst_att_mapper","2023/05/09 10:10:10","com_inst_att_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv new file mode 100644 index 00000000..25a65dba --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","19971001","","","","","","","","","","","","","","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009990146","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2023/05/09 10:10:10","com_inst_att_mapper" +"99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","aaaa","2023/05/09 10:10:10","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py new file mode 100644 index 00000000..f54f641c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py @@ -0,0 +1,232 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_att_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstAttMapper: + """レイアウト区分111: COM_施設属性""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # smallint型のカラム群 + smallint_columns = [ + 'areasuphpintrate', + 'resthpbednum', + 'resthpcarebednum', + 'resthpsbednum', + 'nrmhpbedtotalnum', + 'menthpbednum', + 'tubhpbednum', + 'infhpbednum', + 'hospicebednum' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設属性テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_施設属性テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_att_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_att', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_施設属性テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_att_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_att', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_att_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_att', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_att_mapper.ComInstAttMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_att_mapper.ComInstAttMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.smallint_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + if actual_col_name == 'areasuphpintrate': + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 62ec4ddebb54de8eb07902ea33dced4ae05964ea Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 18:37:07 +0900 Subject: [PATCH 232/962] =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=81=A8=E3=81=8B?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 3 +- .../src/batch/vjsk/vjsk_data_load_manager.py | 4 + .../src/batch/vjsk/vjsk_importer.py | 151 ++++++++++-------- .../src/batch/vjsk/vjsk_recv_file_manager.py | 60 ------- 4 files changed, 89 insertions(+), 129 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 2ee93eb8..dde7cd46 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -110,8 +110,7 @@ class UltmarcBackupBucket(JskUltBackupBucket): _folder = environment.ULTMARC_BACKUP_FOLDER -class VjskBucket(S3Bucket): - # TODO:V実消化バケットから見たり取ってきたりする実装をやる +class VjskRecieveBucket(S3Bucket): _bucket_name = environment.JSKULT_DATA_BUCKET _recv_folder = environment.JSKULT_DATA_FOLDER_RECV diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 4b574dce..70f69344 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -12,6 +12,8 @@ class JjskDataLoadManager: pass def _import_to_db(src_file_name: str, condkey: str): + logger.debug(f"_import_to_db start (src_file_name : {src_file_name}, condkey : {condkey})") + db = Database.get_instance() table_name_org = mapper.get_org_table(condkey) upsert_sql = mapper.get_upsert_sql(condkey) @@ -40,6 +42,8 @@ class JjskDataLoadManager: raise e finally: db.disconnect() + + logger.debug("_import_to_db end") return @classmethod diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 8b4b5197..55e9a41b 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -1,4 +1,4 @@ -from src.aws.s3 import ConfigBucket, VjskBucket +from src.aws.s3 import ConfigBucket, VjskRecieveBucket from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_wholestocksaler_file import \ CalendarWholwSalerStockFile @@ -7,108 +7,116 @@ from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger -# from src.batch.datachange import emp_chg_inst_lau - -_logger = get_logger('V実消化データ取込') +logger = get_logger('V実消化データ取込') batch_context = BatchContext.get_instance() -vjsk_recv_bucket = VjskBucket() +vjsk_recv_bucket = VjskRecieveBucket() vjsk_mapper = VjskRecvFileMapper() -def _check_if_file_exists(src_list: list, key: str) -> bool: - pref = vjsk_mapper.get_file_prefix(key) - suff = vjsk_mapper.get_file_suffix(key) +def _check_if_file_exists(src_list: list, condkey: str) -> bool: + logger.debug(f"_check_if_file_exists start (src_list : {src_list} , condkey : {condkey})") + # ファイル接頭辞と拡張子が一致するかで判定する + ret = False + pref = vjsk_mapper.get_file_prefix(condkey) + suff = vjsk_mapper.get_file_suffix(condkey) + for idx, elem in enumerate(src_list): buf = elem.get("filename") filename = buf[buf.rfind("/") + 1:] if filename.startswith(pref) and filename.endswith(suff): - return True - return False + ret = True + break + + logger.debug(f"_check_if_file_exists end (return : {ret})") + return ret def _check_received_files(): - """V実消化連携データ存在確認処理""" - _logger.debug('V実消化連携データ存在確認処理:開始') + """V実消化連携データファイル受領確認処理""" + logger.debug('_check_received_files start') - # 実消化&アルトマーク V実消化データ受領バケットにあるファイル一覧を取得 - received_files = vjsk_recv_bucket.get_s3_file_list() - _logger.debug(f'ファイル一覧{received_files}') + # S3バケット「実消化&アルトマーク V実消化データ受領バケット」にある受領ファイル一覧を取得 + received_s3_files = vjsk_recv_bucket.get_s3_file_list() + logger.debug(f'ファイル一覧{received_s3_files}') # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) if batch_context.is_import_target_vjsk_stockslipdata: - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_STOCK_SLIP_DATA): - raise BatchOperationException(f'卸在庫データファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_STOCK_SLIP_DATA): + raise BatchOperationException(f'卸在庫データファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 卸販売データ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_SLIP_DATA): - raise BatchOperationException(f'卸販売データファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_SLIP_DATA): + raise BatchOperationException(f'卸販売データファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 卸組織変換マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_ORG_CNV_MST): - raise BatchOperationException(f'卸組織変換マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_ORG_CNV_MST): + raise BatchOperationException(f'卸組織変換マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 施設統合マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_VOP_HCO_MERGE): - raise BatchOperationException(f'施設統合マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_VOP_HCO_MERGE): + raise BatchOperationException(f'施設統合マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 卸マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_WHS_MST): - raise BatchOperationException(f'卸マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_WHS_MST): + raise BatchOperationException(f'卸マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 卸ホールディングスマスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_HLD_MST): - raise BatchOperationException(f'卸ホールディングスマスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_HLD_MST): + raise BatchOperationException(f'卸ホールディングスマスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 施設マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_FCL_MST): - raise BatchOperationException(f'施設マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_FCL_MST): + raise BatchOperationException(f'施設マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 メーカー卸組織展開表 - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_MKR_ORG_HORIZON): - raise BatchOperationException(f'メーカー卸組織展開表ファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_MKR_ORG_HORIZON): + raise BatchOperationException(f'メーカー卸組織展開表ファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 取引区分マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_TRAN_KBN_MST): - raise BatchOperationException(f'取引区分マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_TRAN_KBN_MST): + raise BatchOperationException(f'取引区分マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 製品マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_PHM_PRD_MST): - raise BatchOperationException(f'製品マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_PHM_PRD_MST): + raise BatchOperationException(f'製品マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 製品価格マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_PHM_PRICE_MST): - raise BatchOperationException(f'製品価格マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_PHM_PRICE_MST): + raise BatchOperationException(f'製品価格マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 卸得意先情報マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST): - raise BatchOperationException(f'卸得意先情報マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST): + raise BatchOperationException(f'卸得意先情報マスタファイルがありません ファイル一覧:{received_s3_files}') # ファイル存在確認 MDBコード変換マスタ - if not _check_if_file_exists(received_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): - raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_files}') + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): + raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_s3_files}') - _logger.debug('V実消化連携データ存在確認処理:終了') + logger.debug('_check_received_files end') return True def _import_file_to_db(): - _logger.debug('V実消化取込処理:開始') + """V実消化連携データ取込処理""" + logger.debug('_import_file_to_db start') - # 実消化&アルトマーク V実消化データ受領バケットにあるファイルパス一覧を取得 + # S3バケット「実消化&アルトマーク V実消化データ受領バケット」にある受領ファイル一覧を取得 received_s3_files = vjsk_recv_bucket.get_s3_file_list() - # ファイルパス一覧にマッピング情報を参照するためのキーを持たせて辞書可する + # S3バケット「実消化&アルトマーク V実消化データ受領バケット」の受領ファイルをローカルストレージにdownloadして辞書化する target_dict = {} for s3_file_path in received_s3_files: + # S3バケットにある受領ファイルをローカルストレージにdownloadする local_file_path = vjsk_recv_bucket.download_data_file(s3_file_path.get('filename')) + + # データファイル名に該当する辞書アクセス用のキーを取得する key = vjsk_mapper.get_condkey_by_s3_file_path(s3_file_path.get('filename')) + + # 想定されたデータファイルであれば辞書登録する if key is not None: target_dict[key] = {"condkey": key, "src_file_path": local_file_path} - _logger.debug(f'S3ファイルパス辞書{target_dict}') - - # TODO: diff_upsertに変わるやつを呼び出す - # TODO: emp_chg_inst_lau.batch_process() みたいに + logger.debug(f'取込対象データファイル辞書{target_dict}') # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) if batch_context.is_import_target_vjsk_stockslipdata: @@ -150,51 +158,60 @@ def _import_file_to_db(): # DB登録 MDBコード変換マスタ JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) - _logger.debug('V実消化取込処理:終了') + logger.debug('_import_file_to_db end') def _determine_today_is_stockslipdata_target(): - """設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日が該当していればTrueを返却する""" + """設定ファイル「V実消化卸在庫データ連携日ファイル」の内容を取得して、処理日付が該当していればTrueを返却する""" + logger.debug("_determine_today_is_stockslipdata_target start") try: + # 処理日付を取得する today = batch_context.syor_date - holiday_list_file_path = ConfigBucket().download_wholesaler_stock_list() - targetdays = CalendarWholwSalerStockFile(holiday_list_file_path) - ret = targetdays.compare_date(today) + # S3バケット上の設定ファイル「V実消化卸在庫データ連携日ファイル」をローカルストレージにdownloadする + config_file_path = ConfigBucket().download_wholesaler_stock_list() + + # 設定ファイル「V実消化卸在庫データ連携日ファイル」の定義内容を取得する + target_days = CalendarWholwSalerStockFile(config_file_path) + + # 処理日付が、設定ファイル「V実消化卸在庫データ連携日ファイル」の定義に該当するかを判定する + ret = target_days.compare_date(today) except Exception as e: - _logger.error(f'{e}') + logger.error(f'{e}') raise e + logger.debug("_determine_today_is_stockslipdata_target end") return ret def exec(): - """V実消化データ取込""" - _logger.info('Start Jitsusyouka Torikomi PGM.') + """V実消化データ取込処理""" + logger.info('Start Jitsusyouka Torikomi PGM.') # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる - _logger.debug('卸在庫データ取込対象日であるかを判定') + logger.debug('卸在庫データ取込対象日であるかを判定') batch_context.is_import_target_vjsk_stockslipdata = _determine_today_is_stockslipdata_target() - _logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') + logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') if batch_context.is_import_target_vjsk_stockslipdata: - _logger.info('卸在庫データ取込対象日です') + logger.info('卸在庫データ取込対象日です') # V実消化データファイル受領チェック - _logger.debug('V実消化データファイル受領チェック:開始') + logger.debug('V実消化データファイル受領チェック:開始') try: - # S3バケット上でV実消化データファイルの存在チェックをする + # S3バケットにある受領済のV実消化データファイルの存在チェックをする _check_received_files() except BatchOperationException as e: - _logger.error('受領したV実消化データファイルに欠落があります') + logger.error('受領したV実消化データファイルに未受領もものがあります') raise e - _logger.debug('V実消化データファイル受領チェック:終了') + logger.debug('V実消化データファイル受領チェック:終了') # データベース取込 - _logger.debug('V実消化データ取込:開始') + logger.debug('V実消化データ取込:開始') try: + # S3バケットにある受領済のV実消化データファイルをデータベースに登録する _import_file_to_db() except Exception as e: - _logger.error(f'データベース登録失敗 {e}') + logger.error(f'データベース登録失敗 {e}') raise e - _logger.debug('V実消化データ取込:終了') + logger.debug('V実消化データ取込:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py deleted file mode 100644 index 7ddbb766..00000000 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_manager.py +++ /dev/null @@ -1,60 +0,0 @@ -# import csv -# from io import TextIOWrapper - - -# class VjskRecvFileManager: -# layout_class: str -# records: list[str] - -# def __init__(self, dat_line: list[str]) -> None: -# self.layout_class = dat_line[0] -# self.records = dat_line - - -# class VjskDatFile: -# """V実消化データファイル""" - -# lines: list[VjskRecvFileManager] -# success_count: int = 0 -# error_count: int = 0 -# total_count: int = 0 -# __i: int = 0 - -# def __iter__(self): -# return self - -# def __next__(self) -> VjskRecvFileManager: -# if self.__i == len(self.lines): -# raise StopIteration() -# line = self.lines[self.__i] -# self.__i += 1 -# return line - -# def __init__(self, file: TextIOWrapper) -> None: -# reader = csv.reader(file) -# csv_rows = [VjskRecvFileManager(row) for row in reader] - -# self.lines = csv_rows -# self.total_count = len(csv_rows) - -# def count_up_success(self): -# self.success_count += 1 - -# def count_up_error(self): -# self.error_count += 1 - -# @classmethod -# def retrieve_from_file(cls, local_file_path: str): -# """V実消化データファイルを読み込み、新しいインスタンスを作成する - -# Args: -# local_file_path (str): ローカルのファイルパス - -# Returns: -# VjskDatFile: このクラスのインスタンス -# """ -# # cp932(Shift-JIS Windows拡張)でファイルを読み込む -# file = open(local_file_path, encoding='cp932') -# instance = cls(file) -# file.close() -# return instance From f299cb9379a564ba99fae33ce14b1def61d4656e Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 19:06:19 +0900 Subject: [PATCH 233/962] =?UTF-8?q?BIO=E3=81=AE2=E6=9C=AC=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_importer.py | 14 ++++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 55e9a41b..9c1b0d72 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -92,6 +92,14 @@ def _check_received_files(): if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_MDB_CONV_MST): raise BatchOperationException(f'MDBコード変換マスタファイルがありません ファイル一覧:{received_s3_files}') + # ファイル存在確認 生物由来データ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_BIO_SLIP_DATA): + raise BatchOperationException(f'生物由来データファイルがありません ファイル一覧:{received_s3_files}') + + # ファイル存在確認 製造ロット番号マスタ + if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_LOT_NUM_MST): + raise BatchOperationException(f'製造ロット番号マスタファイルがありません ファイル一覧:{received_s3_files}') + logger.debug('_check_received_files end') return True @@ -158,6 +166,12 @@ def _import_file_to_db(): # DB登録 MDBコード変換マスタ JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) + # DB登録 生物由来データ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) + + # DB登録 製造ロット番号マスタ + JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) + logger.debug('_import_file_to_db end') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index a6736e16..cfd73810 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -16,7 +16,7 @@ class VjskRecvFileMapper: CONDKEY_MDB_CONV_MST = "MDB_CONV_MST" # MDBコード変換表 CONDKEY_STOCK_SLIP_DATA = "STOCK_SLIP_DATA" # 卸在庫データ CONDKEY_BIO_SLIP_DATA = "BIO_SLIP_DATA" # 生物由来データ - CONDKEY_LOT_NUM_MS = "LOT_NUM_MS" # ロットマスタデータ + CONDKEY_LOT_NUM_MST = "LOT_NUM_MST" # ロットマスタデータ _KEY_FILE_PREFIX = "file_prefix" _KEY_FILE_SUFFIX = "file_suffix" @@ -1412,8 +1412,8 @@ class VjskRecvFileMapper: }, # ロットマスタデータ - CONDKEY_LOT_NUM_MS: { - _KEY_FILE_PREFIX: "lot_num_ms_", + CONDKEY_LOT_NUM_MST: { + _KEY_FILE_PREFIX: "lot_num_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.lot_num_mst", _KEY_SRC_TABLE: "src05.lot_num_mst", From 1bff52f8c7ea1aa7903aeae17bfeae7081b7f2d3 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 22:30:06 +0900 Subject: [PATCH 234/962] =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=81=A8=E3=81=8B?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3=E3=83=88=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 2 +- .../src/batch/vjsk/vjsk_importer.py | 16 ++++++++++------ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 5 +++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 70f69344..9653f858 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -57,5 +57,5 @@ class JjskDataLoadManager: # データベース登録 self._import_to_db(local_file_name, target["condkey"]) - logger.debug('JjskDataLoadManager#load end') + logger.debug('JjskDataLoadManager#load done') return diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 9c1b0d72..d667416e 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -27,7 +27,7 @@ def _check_if_file_exists(src_list: list, condkey: str) -> bool: ret = True break - logger.debug(f"_check_if_file_exists end (return : {ret})") + logger.debug(f"_check_if_file_exists done (return : {ret})") return ret @@ -100,7 +100,7 @@ def _check_received_files(): if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_LOT_NUM_MST): raise BatchOperationException(f'製造ロット番号マスタファイルがありません ファイル一覧:{received_s3_files}') - logger.debug('_check_received_files end') + logger.debug('_check_received_files done') return True @@ -115,11 +115,15 @@ def _import_file_to_db(): # S3バケット「実消化&アルトマーク V実消化データ受領バケット」の受領ファイルをローカルストレージにdownloadして辞書化する target_dict = {} for s3_file_path in received_s3_files: + file_name = s3_file_path.get('filename') + # S3バケットにある受領ファイルをローカルストレージにdownloadする - local_file_path = vjsk_recv_bucket.download_data_file(s3_file_path.get('filename')) + logger.debug(f"download s3 file start : {file_name}") + local_file_path = vjsk_recv_bucket.download_data_file(file_name) + logger.debug(f"download s3 file done : {file_name}") # データファイル名に該当する辞書アクセス用のキーを取得する - key = vjsk_mapper.get_condkey_by_s3_file_path(s3_file_path.get('filename')) + key = vjsk_mapper.get_condkey_by_s3_file_path(file_name) # 想定されたデータファイルであれば辞書登録する if key is not None: @@ -172,7 +176,7 @@ def _import_file_to_db(): # DB登録 製造ロット番号マスタ JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) - logger.debug('_import_file_to_db end') + logger.debug('_import_file_to_db done') def _determine_today_is_stockslipdata_target(): @@ -193,7 +197,7 @@ def _determine_today_is_stockslipdata_target(): except Exception as e: logger.error(f'{e}') raise e - logger.debug("_determine_today_is_stockslipdata_target end") + logger.debug("_determine_today_is_stockslipdata_target done") return ret diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index cfd73810..ec243433 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -325,7 +325,8 @@ class VjskRecvFileMapper: ,t.REC_STS_KBN ,t.INS_DT ,t.UPD_DT - ,SYSDATE() FROM org05.hld_mst_v AS t + ,SYSDATE() + FROM org05.hld_mst_v AS t ON DUPLICATE KEY UPDATE V_HLD_CD=t.V_HLD_CD ,SUB_NUM=t.SUB_NUM @@ -1122,7 +1123,7 @@ class VjskRecvFileMapper: ,t.INS_DT ,t.INS_USR ,SYSDATE() - FROM org05.whole_stock AS t + FROM org05.whole_stock AS t ON DUPLICATE KEY UPDATE REC_DATA=t.REC_DATA ,REC_WHS_CD=t.REC_WHS_CD From 7a1941a7bcdf2144151f3cefa8cd3afefe72836f Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 9 May 2023 22:31:50 +0900 Subject: [PATCH 235/962] =?UTF-8?q?transabtion=E5=BC=B5=E3=81=A3=E3=81=A6L?= =?UTF-8?q?OAD=E3=81=97=E3=81=9F=E3=81=82=E3=81=A8=E3=81=AEUPSERT=E3=81=8C?= =?UTF-8?q?=E3=82=B3=E3=82=B1=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB=E3=80=81?= =?UTF-8?q?org=E3=81=8C=E3=83=AD=E3=83=BC=E3=83=AB=E3=83=90=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 9653f858..86040640 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -19,8 +19,7 @@ class JjskDataLoadManager: upsert_sql = mapper.get_upsert_sql(condkey) try: - db.connect() # TODO:接続オプション local_infile = True が必要? - db.begin() + db.connect() # orgをtruncate db.execute(f"TRUNCATE TABLE {table_name_org};") @@ -32,18 +31,19 @@ class JjskDataLoadManager: logger.info(f'tsvデータをorgテーブルにLOAD : 件数({result.rowcount})') # org→srcにinsert select + db.begin() result = db.execute(upsert_sql) logger.info(f'orgテーブルをsrcテーブルにUPSERT : 件数({result.rowcount})') db.commit() - except Exception as e: # TODO:DB例外だけキャッチしたい + except Exception as e: db.rollback() logger.error(e) raise e finally: db.disconnect() - logger.debug("_import_to_db end") + logger.debug("_import_to_db done") return @classmethod From 288fa3ba922dbe1660c2aba4e8d2805599ac3b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 10 May 2023 08:38:41 +0900 Subject: [PATCH 236/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_cop_hp_mapper.py | 108 ++++++++ .../ultmarc/utmp_tables/tables/com_cop_hp.py | 36 +++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_cop_hp/__init__.py | 0 .../com_cop_hp/com_cop_hp_delete.csv | 3 + .../com_cop_hp/com_cop_hp_insert.csv | 7 + .../com_cop_hp/com_cop_hp_update.csv | 4 + .../db_com_cop_hp_before_delete.csv | 7 + .../db_com_cop_hp_before_update.csv | 9 + .../com_cop_hp/expect_com_cop_hp_delete.csv | 4 + .../com_cop_hp/expect_com_cop_hp_insert.csv | 8 + .../com_cop_hp/expect_com_cop_hp_update.csv | 9 + .../com_cop_hp/test_com_cop_hp_mapper.py | 248 ++++++++++++++++++ .../com_inst/test_com_inst_mapper.py | 4 +- 14 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py new file mode 100644 index 00000000..b1746e00 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_cop_hp_mapper.py @@ -0,0 +1,108 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_cop_hp import ComCopHp + + +class ComCopHpMapper(UltmarcTableMapper): + """レイアウト区分112: COM_臨床研修病院 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_cop_hp + ( + dcf_dsf_inst_cd, + cophp_cd, + openyear, + sortkey, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :cophp_code, + :open_year, + :sort_key, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_cop_hp + SET + sortkey = :sort_key, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cophp_cd = :cophp_code + AND + openyear = :open_year + """ + record: ComCopHp + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComCopHp) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + # 更新する値が空の場合は、更新処理を行わない + if self.record.sort_key == '': + return None + else: + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py new file mode 100644 index 00000000..886b9dad --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_cop_hp.py @@ -0,0 +1,36 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComCopHp(UltmarcTable): + """レイアウト区分112: COM_臨床研修病院""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + cophp_id: str # 協力型病院コード(ID) + cophp_code: str # 協力型病院コード(コード) + cophp_yobi: str # 協力型病院コード(予備) + open_year: str # 開始年度 + sort_key: str # ソートキー + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + cophp_code: str # 協力型病院コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3] + self.maint_flag = record[4] + self.cophp_id = record[5] + self.cophp_code = record[6] + self.cophp_yobi = record[7] + self.open_year = record[8] + self.adddel_div = record[9] + self.sort_key = record[12] + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) + # 協力型病院コード + self.cophp_code = ''.join([self.cophp_id, self.cophp_code, self.cophp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index c6c8bc68..29614f12 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -30,6 +30,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \ ComDrMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \ ComDrSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \ + ComCopHpMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -41,7 +43,7 @@ COM_TABLE_LIST = { # COM_施設属性 "111": NullMapper, # COM_臨床研修病院 - "112": NullMapper, + "112": ComCopHpMapper, # COM_医師 "501": ComDrMapper, # COM_施設 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv new file mode 100644 index 00000000..bc912e04 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_delete.csv @@ -0,0 +1,3 @@ +"112","00","9901649","","B","00","1101813","","2013","1","20170328","20170401","" +"112","00","9904439","","B","00","1101135","","2013","1","20170328","20170401","" +"112","00","9904439","","B","00","1101717","","2013","1","20170328","20170401","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv new file mode 100644 index 00000000..37706281 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_insert.csv @@ -0,0 +1,7 @@ +"112","00","9901649","","A","00","1101813","","2013","2","20141113","20141114","1" +"112","00","9901649","","A","00","1101813","","2014","2","20141113","20141114","1" +"112","00","9904439","","A","00","1101135","","2013","2","20141113","20141114","2" +"112","00","9904439","","A","00","1101135","","2014","2","20141113","20141114","2" +"112","00","9904439","","A","00","1101717","","2013","2","20141113","20141114","1" +"112","00","9904439","","A","00","1101717","","2014","2","20141113","20141114","1" +"112","99","9999999","99","A","11","1111111","11","2023","0","20141113","20141114","1" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv new file mode 100644 index 00000000..cecbf3a3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/com_cop_hp_update.csv @@ -0,0 +1,4 @@ +"112","00","9901649","","B","00","1101813","","2013","3","20141113","20141114","1" +"112","00","9901649","","B","00","1101813","","2014","4","20141113","20141114","1" +"112","99","9999999","99","B","11","1111111","11","2014","4","20141113","20141114","123" +"112","99","9999999","00","B","11","1111111","11","2014","4","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv new file mode 100644 index 00000000..536cd1c2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009901649","001101813","2014","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv new file mode 100644 index 00000000..42519300 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/db_com_cop_hp_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009901649","001101813","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999999","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999900","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv new file mode 100644 index 00000000..efcda970 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2014","NULL","1","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/11 21:20:37","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv new file mode 100644 index 00000000..8864ba3f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_insert.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009901649","001101813","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" +"99999999999","11111111111","2023","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2023/05/08 20:39:15","com_cop_hp_mapper","2023/05/08 20:39:15","com_cop_hp_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv new file mode 100644 index 00000000..0ab83cfa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/expect_com_cop_hp_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","cophp_cd","openyear","adddel_div","sortkey","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","001101813","2013","NULL","1","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:49:28","com_cop_hp_mapper" +"009901649","001101813","2014","NULL","1","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:49:28","com_cop_hp_mapper" +"009904439","001101135","2013","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101135","2014","NULL","2","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2013","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"009904439","001101717","2014","NULL","1","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" +"99999999999","11111111111","2014","NULL","123","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2023/05/10 07:57:12","com_cop_hp_mapper" +"99999999900","11111111111","2014","NULL","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComCopHp","2017/10/08 20:57:12","clsComCopHp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py new file mode 100644 index 00000000..29b840e2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py @@ -0,0 +1,248 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_cop_hp_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComCopHpMapper: + """レイアウト区分112: COM_臨床研修病院""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_臨床研修病院テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_臨床研修病院テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_cop_hp_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_cop_hp', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_臨床研修病院テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_cop_hp_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_cop_hp', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_cop_hp_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_cop_hp', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_cop_hp_mapper.ComCopHpMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_cop_hp_mapper.ComCopHpMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] + primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_cop_hp + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cophp_cd = :cophp_cd + AND + openyear = :openyear + """ + for param_dcf_pcf_dr_cd, param_cophp_cd, param_openyear in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cophp_cd, primary_keys_openyear): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_pcf_dr_cd, **param_cophp_cd, **param_openyear}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 84fc58e8..4c4058d8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -28,13 +28,13 @@ class TestComInstMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From c0042ca18b290f2d56e16183029e9e9e06369878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 10 May 2023 09:48:11 +0900 Subject: [PATCH 237/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 645 ++++++------------ .../utmp_tables/tables/com_inst_att.py | 18 +- .../expect_com_inst_att_update.csv | 5 +- .../com_inst_att/test_com_inst_att_mapper.py | 2 +- 4 files changed, 205 insertions(+), 465 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index 14a0dd59..a02f2965 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -683,6 +683,10 @@ class ComInstAttMapper(UltmarcTableMapper): return # 存在する場合はUpdate + self.queries.append(self.__make_update_query()) + return + + def __make_update_query(self): set_clauses = [] # DPC対象病院 if len(self.record.dpc_flag) > 0: @@ -690,9 +694,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('dpc_specday = :dpc_spec_day') set_clauses.append('dpc_cancelday = :dpc_cancel_day') if self.record.dpc_flag == '@': - self.query_parameter['dpc_flag'] = '' - self.query_parameter['dpc_spec_day'] = '' - self.query_parameter['dpc_cancel_day'] = '' + self.query_parameter['dpc_flag'] = None + self.query_parameter['dpc_spec_day'] = None + self.query_parameter['dpc_cancel_day'] = None # DPC準備病院 if len(self.record.predpc_flag) > 0: @@ -700,9 +704,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('predpc_specday = :predpc_spec_day') set_clauses.append('predpc_cancelday = :predpc_cancel_day') if self.record.predpc_flag == '@': - self.query_parameter['predpc_flag'] = '' - self.query_parameter['predpc_spec_day'] = '' - self.query_parameter['predpc_cancel_day'] = '' + self.query_parameter['predpc_flag'] = None + self.query_parameter['predpc_spec_day'] = None + self.query_parameter['predpc_cancel_day'] = None # がん診療連携拠点病院 if len(self.record.cancer_flag) > 0: @@ -710,9 +714,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('cancer_specday = :cancer_spec_day') set_clauses.append('cancer_cancelday = :cancer_cancel_day') if self.record.cancer_flag == '@': - self.query_parameter['cancer_flag'] = '' - self.query_parameter['cancer_spec_day'] = '' - self.query_parameter['cancer_cancel_day'] = '' + self.query_parameter['cancer_flag'] = None + self.query_parameter['cancer_spec_day'] = None + self.query_parameter['cancer_cancel_day'] = None # 特定機能病院 if len(self.record.funchp_flag) > 0: @@ -720,9 +724,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('funchpokdate = :funchp_ok_date') set_clauses.append('funchpcandate = :funchp_can_date') if self.record.funchp_flag == '@': - self.query_parameter['funchp_flag'] = '' - self.query_parameter['funchp_ok_date'] = '' - self.query_parameter['funchp_can_date'] = '' + self.query_parameter['funchp_flag'] = None + self.query_parameter['funchp_ok_date'] = None + self.query_parameter['funchp_can_date'] = None # 地域医療支援病院 if len(self.record.areasuphp_flag) > 0: @@ -731,10 +735,10 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('areasuphpokdate = :areasuphp_ok_date') set_clauses.append('areasuphpcandate = :areasuphp_can_date') if self.record.areasuphp_flag == '@': - self.query_parameter['areasuphp_flag'] = '' + self.query_parameter['areasuphp_flag'] = None self.query_parameter['areasuphp_intrate'] = None - self.query_parameter['areasuphp_ok_date'] = '' - self.query_parameter['areasuphp_can_date'] = '' + self.query_parameter['areasuphp_ok_date'] = None + self.query_parameter['areasuphp_can_date'] = None # 超急性期脳卒中加算 if len(self.record.acuthp_add_flag) > 0: @@ -742,9 +746,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('acuthpaddokdate = :acuthp_add_ok_date') set_clauses.append('acuthpaddcandate = :acuthp_add_can_date') if self.record.acuthp_add_flag == '@': - self.query_parameter['acuthp_add_flag'] = '' - self.query_parameter['acuthp_add_ok_date'] = '' - self.query_parameter['acuthp_add_can_date'] = '' + self.query_parameter['acuthp_add_flag'] = None + self.query_parameter['acuthp_add_ok_date'] = None + self.query_parameter['acuthp_add_can_date'] = None # 総合入院体制加算 if len(self.record.genadmisiion_flag) > 0: @@ -752,9 +756,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('genadmisiionfokdate = :genadmisiion_ok_date') set_clauses.append('genadmisiionfcandate = :genadmisiion_can_date') if self.record.genadmisiion_flag == '@': - self.query_parameter['genadmisiion_flag'] = '' - self.query_parameter['genadmisiion_ok_date'] = '' - self.query_parameter['genadmisiion_can_date'] = '' + self.query_parameter['genadmisiion_flag'] = None + self.query_parameter['genadmisiion_ok_date'] = None + self.query_parameter['genadmisiion_can_date'] = None # 医師事務作業補助体制加算 if len(self.record.assistance_flag) > 0: @@ -762,9 +766,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('assistanceokdate = :assistance_ok_date') set_clauses.append('assistancecandate = :assistance_can_date') if self.record.assistance_flag == '@': - self.query_parameter['assistance_flag'] = '' - self.query_parameter['assistance_ok_date'] = '' - self.query_parameter['assistance_can_date'] = '' + self.query_parameter['assistance_flag'] = None + self.query_parameter['assistance_ok_date'] = None + self.query_parameter['assistance_can_date'] = None # 診療録管理体制加算 if len(self.record.diagnosis_treatment_flag) > 0: @@ -772,9 +776,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('diagnosistreatment_specday = :diagnosis_treatment_spec_day') set_clauses.append('diagnosistreatment_cancelday = :diagnosis_treatment_cancel_day') if self.record.diagnosis_treatment_flag == '@': - self.query_parameter['diagnosis_treatment_flag'] = '' - self.query_parameter['diagnosis_treatment_spec_day'] = '' - self.query_parameter['diagnosis_treatment_cancel_day'] = '' + self.query_parameter['diagnosis_treatment_flag'] = None + self.query_parameter['diagnosis_treatment_spec_day'] = None + self.query_parameter['diagnosis_treatment_cancel_day'] = None # 医療安全対策加算 if len(self.record.safety_flag) > 0: @@ -782,9 +786,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('safety_specday = :safety_spec_day') set_clauses.append('safety_cancelday = :safety_cancel_day') if self.record.safety_flag == '@': - self.query_parameter['safety_flag'] = '' - self.query_parameter['safety_spec_day'] = '' - self.query_parameter['safety_cancel_day'] = '' + self.query_parameter['safety_flag'] = None + self.query_parameter['safety_spec_day'] = None + self.query_parameter['safety_cancel_day'] = None # 褥瘡ハイリスク患者ケア加算 if len(self.record.highrisk_flag) > 0: @@ -792,9 +796,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('highrisk_specday = :highrisk_spec_day') set_clauses.append('highrisk_cancelday = :highrisk_cancel_day') if self.record.highrisk_flag == '@': - self.query_parameter['highrisk_flag'] = '' - self.query_parameter['highrisk_spec_day'] = '' - self.query_parameter['highrisk_cancel_day'] = '' + self.query_parameter['highrisk_flag'] = None + self.query_parameter['highrisk_spec_day'] = None + self.query_parameter['highrisk_cancel_day'] = None # 地域連携小児夜間・休日診療料 if len(self.record.infant_and_holiday_flag) > 0: @@ -802,9 +806,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('infantandholiday_specday = :infant_and_holiday_spec_day') set_clauses.append('infantandholiday_cancelday = :infant_and_holiday_cancel_day') if self.record.infant_and_holiday_flag == '@': - self.query_parameter['infant_and_holiday_flag'] = '' - self.query_parameter['infant_and_holiday_spec_day'] = '' - self.query_parameter['infant_and_holiday_cancel_day'] = '' + self.query_parameter['infant_and_holiday_flag'] = None + self.query_parameter['infant_and_holiday_spec_day'] = None + self.query_parameter['infant_and_holiday_cancel_day'] = None # 開放型病院 if len(self.record.ophp_flag) > 0: @@ -812,55 +816,26 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('ophpokdate = :ophpok_date') set_clauses.append('ophpcandate = :ophpcan_date') if self.record.ophp_flag == '@': - self.query_parameter['ophp_flag'] = '' - self.query_parameter['ophpok_date'] = '' - self.query_parameter['ophpcan_date'] = '' + self.query_parameter['ophp_flag'] = None + self.query_parameter['ophpok_date'] = None + self.query_parameter['ophpcan_date'] = None # 地域連携クリティカルパス if len(self.record.critical_flag) > 0: set_clauses.append('critical_flag = :critical_flag') - set_clauses.append('critical_code01 = :critical_code01') - set_clauses.append('critical_code02 = :critical_code02') - set_clauses.append('critical_code03 = :critical_code03') - set_clauses.append('critical_code04 = :critical_code04') - set_clauses.append('critical_code05 = :critical_code05') - set_clauses.append('critical_code06 = :critical_code06') - set_clauses.append('critical_code07 = :critical_code07') - set_clauses.append('critical_code08 = :critical_code08') - set_clauses.append('critical_code09 = :critical_code09') - set_clauses.append('critical_code10 = :critical_code10') - set_clauses.append('critical_code11 = :critical_code11') - set_clauses.append('critical_code12 = :critical_code12') - set_clauses.append('critical_code13 = :critical_code13') - set_clauses.append('critical_code14 = :critical_code14') - set_clauses.append('critical_code15 = :critical_code15') - set_clauses.append('critical_code16 = :critical_code16') - set_clauses.append('critical_code17 = :critical_code17') - set_clauses.append('critical_code18 = :critical_code18') - set_clauses.append('critical_code19 = :critical_code19') - set_clauses.append('critical_code20 = :critical_code20') + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item = 'critical_code' + num + ' = :critical_code' + num + set_clauses.append(setting_item) + if self.record.critical_flag == '@': - self.query_parameter['critical_flag'] = '' - self.query_parameter['critical_code01'] = '' - self.query_parameter['critical_code02'] = '' - self.query_parameter['critical_code03'] = '' - self.query_parameter['critical_code04'] = '' - self.query_parameter['critical_code05'] = '' - self.query_parameter['critical_code06'] = '' - self.query_parameter['critical_code07'] = '' - self.query_parameter['critical_code08'] = '' - self.query_parameter['critical_code09'] = '' - self.query_parameter['critical_code10'] = '' - self.query_parameter['critical_code11'] = '' - self.query_parameter['critical_code12'] = '' - self.query_parameter['critical_code13'] = '' - self.query_parameter['critical_code14'] = '' - self.query_parameter['critical_code15'] = '' - self.query_parameter['critical_code16'] = '' - self.query_parameter['critical_code17'] = '' - self.query_parameter['critical_code18'] = '' - self.query_parameter['critical_code19'] = '' - self.query_parameter['critical_code20'] = '' + self.query_parameter['critical_flag'] = None + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) + setting_item = 'critical_code' + num + self.query_parameter[setting_item] = None # 薬剤管理指導料 if len(self.record.drgmgthp_flag) > 0: @@ -868,9 +843,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('drgmgthpokdate = :drgmgthp_ok_date') set_clauses.append('drgmgthpcandate = :drgmgthp_can_date') if self.record.drgmgthp_flag == '@': - self.query_parameter['drgmgthp_flag'] = '' - self.query_parameter['drgmgthp_ok_date'] = '' - self.query_parameter['drgmgthp_can_date'] = '' + self.query_parameter['drgmgthp_flag'] = None + self.query_parameter['drgmgthp_ok_date'] = None + self.query_parameter['drgmgthp_can_date'] = None # 画像診断管理加算 if len(self.record.image_diagnosis_flag) > 0: @@ -878,9 +853,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('imagediagnosis_specifiedday = :image_diagnosis_specified_day') set_clauses.append('imagediagnosis_cancelday = :image_diagnosis_cancel_day') if self.record.image_diagnosis_flag == '@': - self.query_parameter['image_diagnosis_flag'] = '' - self.query_parameter['image_diagnosis_specified_day'] = '' - self.query_parameter['image_diagnosis_cancel_day'] = '' + self.query_parameter['image_diagnosis_flag'] = None + self.query_parameter['image_diagnosis_specified_day'] = None + self.query_parameter['image_diagnosis_cancel_day'] = None # 外来化学療法加算 if len(self.record.chemotherapy_flag) > 0: @@ -888,9 +863,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('chemotherapy_specday = :chemotherapy_spec_day') set_clauses.append('chemotherapy_cancelday = :chemotherapy_cancel_day') if self.record.chemotherapy_flag == '@': - self.query_parameter['chemotherapy_flag'] = '' - self.query_parameter['chemotherapy_spec_day'] = '' - self.query_parameter['chemotherapy_cancel_day'] = '' + self.query_parameter['chemotherapy_flag'] = None + self.query_parameter['chemotherapy_spec_day'] = None + self.query_parameter['chemotherapy_cancel_day'] = None # 疾患別リハビリテーション料 if len(self.record.rehabilitation_flag) > 0: @@ -906,17 +881,17 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('rehabilitation_code09= :rehabilitation_code09') set_clauses.append('rehabilitation_code10= :rehabilitation_code10') if self.record.rehabilitation_flag == '@': - self.query_parameter['rehabilitation_flag'] = '' - self.query_parameter['rehabilitation_code01'] = '' - self.query_parameter['rehabilitation_code02'] = '' - self.query_parameter['rehabilitation_code03'] = '' - self.query_parameter['rehabilitation_code04'] = '' - self.query_parameter['rehabilitation_code05'] = '' - self.query_parameter['rehabilitation_code06'] = '' - self.query_parameter['rehabilitation_code07'] = '' - self.query_parameter['rehabilitation_code08'] = '' - self.query_parameter['rehabilitation_code09'] = '' - self.query_parameter['rehabilitation_code10'] = '' + self.query_parameter['rehabilitation_flag'] = None + self.query_parameter['rehabilitation_code01'] = None + self.query_parameter['rehabilitation_code02'] = None + self.query_parameter['rehabilitation_code03'] = None + self.query_parameter['rehabilitation_code04'] = None + self.query_parameter['rehabilitation_code05'] = None + self.query_parameter['rehabilitation_code06'] = None + self.query_parameter['rehabilitation_code07'] = None + self.query_parameter['rehabilitation_code08'] = None + self.query_parameter['rehabilitation_code09'] = None + self.query_parameter['rehabilitation_code10'] = None # 麻酔管理料 if len(self.record.anesthetizing_manage_flag) > 0: @@ -924,9 +899,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('anesthetizingmanage_specday = :anesthetizing_manage_spec_day') set_clauses.append('anesthetizingmanage_cancelday = :anesthetizing_manage_can_day') if self.record.anesthetizing_manage_flag == '@': - self.query_parameter['anesthetizing_manage_flag'] = '' - self.query_parameter['anesthetizing_manage_spec_day'] = '' - self.query_parameter['anesthetizing_manage_can_day'] = '' + self.query_parameter['anesthetizing_manage_flag'] = None + self.query_parameter['anesthetizing_manage_spec_day'] = None + self.query_parameter['anesthetizing_manage_can_day'] = None # 在宅療養支援病院・診療所 if len(self.record.home_recuperation_flag) > 0: @@ -934,9 +909,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('homerecuperation_specday = :home_recuperation_spec_day') set_clauses.append('homerecuperation_cancelday = :home_recuperation_cancel_day') if self.record.home_recuperation_flag == '@': - self.query_parameter['home_recuperation_flag'] = '' - self.query_parameter['home_recuperation_spec_day'] = '' - self.query_parameter['home_recuperation_cancel_day'] = '' + self.query_parameter['home_recuperation_flag'] = None + self.query_parameter['home_recuperation_spec_day'] = None + self.query_parameter['home_recuperation_cancel_day'] = None # 在宅時医学総合管理料 if len(self.record.synthesis_when_staying_flag) > 0: @@ -944,9 +919,9 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('synthesiswhenstaying_specday = :synthesis_when_staying_spec_day') set_clauses.append('synthesiswhenstaying_cancelday = :synthesis_when_staying_can_day') if self.record.synthesis_when_staying_flag == '@': - self.query_parameter['synthesis_when_staying_flag'] = '' - self.query_parameter['synthesis_when_staying_spec_day'] = '' - self.query_parameter['synthesis_when_staying_can_day'] = '' + self.query_parameter['synthesis_when_staying_flag'] = None + self.query_parameter['synthesis_when_staying_spec_day'] = None + self.query_parameter['synthesis_when_staying_can_day'] = None # 在宅末期医療総合診療料 if len(self.record.home_late_flag) > 0: @@ -954,21 +929,21 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('homelateokday = :home_late_ok_day') set_clauses.append('homelatecanday = :home_late_can_day') if self.record.home_late_flag == '@': - self.query_parameter['home_late_flag'] = '' - self.query_parameter['home_late_ok_day'] = '' - self.query_parameter['home_late_can_day'] = '' + self.query_parameter['home_late_flag'] = None + self.query_parameter['home_late_ok_day'] = None + self.query_parameter['home_late_can_day'] = None # ケアミックス区分 if len(self.record.caremix_kind) > 0: set_clauses.append('caremixkind = :caremix_kind') if self.record.caremix_kind == '@': - self.query_parameter['caremix_kind'] = '' + self.query_parameter['caremix_kind'] = None # 完全型・移行型区分 if len(self.record.fullmove_flag) > 0: set_clauses.append('fullmoveflag = :fullmove_flag') if self.record.fullmove_flag == '@': - self.query_parameter['fullmove_flag'] = '' + self.query_parameter['fullmove_flag'] = None # 療養型病床群 if sum(len(item) for item in self.record.resthp_items) > 0: @@ -983,15 +958,15 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('resthpcarecandate = :resthp_care_can_date') set_clauses.append('resthpsbednum = :resthp_sbed_num') if self.record.resthp_flag == '@': - self.query_parameter['resthp_flag'] = '' - self.query_parameter['resthp_care_kind'] = '' + self.query_parameter['resthp_flag'] = None + self.query_parameter['resthp_care_kind'] = None self.query_parameter['resthp_bed_num'] = None - self.query_parameter['resthp_ok_date'] = '' - self.query_parameter['resthp_can_date'] = '' - self.query_parameter['resthp_care_nrs_kind'] = '' + self.query_parameter['resthp_ok_date'] = None + self.query_parameter['resthp_can_date'] = None + self.query_parameter['resthp_care_nrs_kind'] = None self.query_parameter['resthp_care_bed_num'] = None - self.query_parameter['resthp_care_ok_date'] = '' - self.query_parameter['resthp_care_can_date'] = '' + self.query_parameter['resthp_care_ok_date'] = None + self.query_parameter['resthp_care_can_date'] = None self.query_parameter['resthp_sbed_num'] = None # 一般病棟 @@ -1000,8 +975,8 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('nrmhpcarekind = :nrmhp_care_kind') set_clauses.append('nrmhpbedtotalnum = :nrmhp_bed_total_num') if self.record.nrmhp_flag == '@': - self.query_parameter['nrmhp_flag'] = '' - self.query_parameter['nrmhp_care_kind'] = '' + self.query_parameter['nrmhp_flag'] = None + self.query_parameter['nrmhp_care_kind'] = None self.query_parameter['nrmhp_bed_total_num'] = None # 精神病棟 @@ -1010,8 +985,8 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('menthpcarekind = :menthp_care_kind') set_clauses.append('menthpbednum = :menthp_bed_num') if self.record.menthp_flag == '@': - self.query_parameter['menthp_flag'] = '' - self.query_parameter['menthp_care_kind'] = '' + self.query_parameter['menthp_flag'] = None + self.query_parameter['menthp_care_kind'] = None self.query_parameter['menthp_bed_num'] = None # 結核病棟 @@ -1020,8 +995,8 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('tubhpcarekind = :tubhp_care_kind') set_clauses.append('tubhpbednum = :tubhp_bed_num') if self.record.tubhp_flag == '@': - self.query_parameter['tubhp_flag'] = '' - self.query_parameter['tubhp_care_kind'] = '' + self.query_parameter['tubhp_flag'] = None + self.query_parameter['tubhp_care_kind'] = None self.query_parameter['tubhp_bed_num'] = None # 感染症指定医療機関 @@ -1030,16 +1005,16 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('infhpflag1 = :infhp_flag1') set_clauses.append('infhpflag2 = :infhp_flag2') if self.record.infhp_flag == '@': - self.query_parameter['infhp_flag'] = '' - self.query_parameter['infhp_flag1'] = '' - self.query_parameter['infhp_flag2'] = '' + self.query_parameter['infhp_flag'] = None + self.query_parameter['infhp_flag1'] = None + self.query_parameter['infhp_flag2'] = None # 感染症病床 if len(self.record.infhp_bed_flag) > 0: set_clauses.append('infhpbedflag = :infhp_bed_flag') set_clauses.append('infhpbednum = :infhp_bed_num') if self.record.infhp_bed_flag == '@': - self.query_parameter['infhp_bed_flag'] = '' + self.query_parameter['infhp_bed_flag'] = None self.query_parameter['infhp_bed_num'] = None # 緩和ケア病棟設置病院 @@ -1049,10 +1024,10 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('hospiceokdate = :hospice_ok_date') set_clauses.append('hospicecandate = :hospice_can_date') if self.record.hospice_flag == '@': - self.query_parameter['hospice_flag'] = '' + self.query_parameter['hospice_flag'] = None self.query_parameter['hospice_bed_num'] = None - self.query_parameter['hospice_ok_date'] = '' - self.query_parameter['hospice_can_date'] = '' + self.query_parameter['hospice_ok_date'] = None + self.query_parameter['hospice_can_date'] = None # 医療機能評価 if len(self.record.hpfunce_st_flag) > 0: @@ -1061,10 +1036,10 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('hpfuncestokdate = :hpfunce_st_ok_date') set_clauses.append('hpfuncestcandate = :hpfunce_st_can_date') if self.record.hpfunce_st_flag == '@': - self.query_parameter['hpfunce_st_flag'] = '' - self.query_parameter['hpfunce_st_kind'] = '' - self.query_parameter['hpfunce_st_ok_date'] = '' - self.query_parameter['hpfunce_st_can_date'] = '' + self.query_parameter['hpfunce_st_flag'] = None + self.query_parameter['hpfunce_st_kind'] = None + self.query_parameter['hpfunce_st_ok_date'] = None + self.query_parameter['hpfunce_st_can_date'] = None # 臨床研修指定病院 if sum(len(item) for item in self.record.cl_items) > 0: @@ -1078,21 +1053,21 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('cldephpokdate = :cldephp_ok_date') set_clauses.append('cldephpcandate = :cldephp_can_date') if self.record.clolyhp_kind == '@': - self.query_parameter['clolyhp_kind'] = '' - self.query_parameter['clolyhp_ok_date'] = '' - self.query_parameter['clolyhp_can_date'] = '' - self.query_parameter['clhp_kind'] = '' - self.query_parameter['clhp_ok_date'] = '' - self.query_parameter['clhp_can_date'] = '' - self.query_parameter['cldephp_kind'] = '' - self.query_parameter['cldephp_ok_date'] = '' - self.query_parameter['cldephp_can_date'] = '' + self.query_parameter['clolyhp_kind'] = None + self.query_parameter['clolyhp_ok_date'] = None + self.query_parameter['clolyhp_can_date'] = None + self.query_parameter['clhp_kind'] = None + self.query_parameter['clhp_ok_date'] = None + self.query_parameter['clhp_can_date'] = None + self.query_parameter['cldephp_kind'] = None + self.query_parameter['cldephp_ok_date'] = None + self.query_parameter['cldephp_can_date'] = None # 災害拠点病院 if len(self.record.disasthp_flag) > 0: set_clauses.append('disasthpflag = :disasthp_flag') if self.record.disasthp_flag == '@': - self.query_parameter['disasthp_flag'] = '' + self.query_parameter['disasthp_flag'] = None # 救急医療 if len(self.record.d1emerhp_flag) > 0: @@ -1100,15 +1075,15 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('d2emerhpflag = :d2emerhp_flag') set_clauses.append('d3emerhpflag = :d3emerhp_flag') if self.record.d1emerhp_flag == '@': - self.query_parameter['d1emerhp_flag'] = '' - self.query_parameter['d2emerhp_flag'] = '' - self.query_parameter['d3emerhp_flag'] = '' + self.query_parameter['d1emerhp_flag'] = None + self.query_parameter['d2emerhp_flag'] = None + self.query_parameter['d3emerhp_flag'] = None # 救急告示診療所 if len(self.record.emergency_clinic) > 0: set_clauses.append('emergencyclinic = :emergency_clinic') if self.record.emergency_clinic == '@': - self.query_parameter['emergency_clinic'] = '' + self.query_parameter['emergency_clinic'] = None # 治験中核病院 if len(self.record.trial_core_flag) > 0: @@ -1117,10 +1092,10 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('trialcoreokdate = :trial_core_ok_date') set_clauses.append('trialcorecandate = :trial_core_can_date') if self.record.trial_core_flag == '@': - self.query_parameter['trial_core_flag'] = '' - self.query_parameter['trial_core_div'] = '' - self.query_parameter['trial_core_ok_date'] = '' - self.query_parameter['trial_core_can_date'] = '' + self.query_parameter['trial_core_flag'] = None + self.query_parameter['trial_core_div'] = None + self.query_parameter['trial_core_ok_date'] = None + self.query_parameter['trial_core_can_date'] = None # 認知症疾患医療センター if len(self.record.dementia_flag) > 0: @@ -1128,319 +1103,85 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('dementiaokdate = :dementia_okd_ate') set_clauses.append('dementiacandate = :dementia_can_date') if self.record.dementia_flag == '@': - self.query_parameter['dementia_flag'] = '' - self.query_parameter['dementia_okd_ate'] = '' - self.query_parameter['dementia_can_date'] = '' + self.query_parameter['dementia_flag'] = None + self.query_parameter['dementia_okd_ate'] = None + self.query_parameter['dementia_can_date'] = None # 特定健康診査実施機関 if len(self.record.sphealth_exploration) > 0: set_clauses.append('sphealth_exploration = :sphealth_exploration') if self.record.sphealth_exploration == '@': - self.query_parameter['sphealth_exploration'] = '' + self.query_parameter['sphealth_exploration'] = None # 特定保健指導実施機関 if len(self.record.sphealth_guidance) > 0: set_clauses.append('sphealth_guidance = :sphealth_guidance') if self.record.sphealth_guidance == '@': - self.query_parameter['sphealth_guidance'] = '' + self.query_parameter['sphealth_guidance'] = None # 先進医療実施医療機関 if len(self.record.hiadhp_flag) > 0: set_clauses.append('hiadhpflag = :hiadhp_flag') - set_clauses.append('hiadhpcode1 = :hiadhp_code1') - set_clauses.append('hiadhpkind1 = :hiadhp_kind1') - set_clauses.append('hiadhpcode2 = :hiadhp_code2') - set_clauses.append('hiadhpkind2 = :hiadhp_kind2') - set_clauses.append('hiadhpcode3 = :hiadhp_code3') - set_clauses.append('hiadhpkind3 = :hiadhp_kind3') - set_clauses.append('hiadhpcode4 = :hiadhp_code4') - set_clauses.append('hiadhpkind4 = :hiadhp_kind4') - set_clauses.append('hiadhpcode5 = :hiadhp_code5') - set_clauses.append('hiadhpkind5 = :hiadhp_kind5') - set_clauses.append('hiadhpcode6 = :hiadhp_code6') - set_clauses.append('hiadhpkind6 = :hiadhp_kind6') - set_clauses.append('hiadhpcode7 = :hiadhp_code7') - set_clauses.append('hiadhpkind7 = :hiadhp_kind7') - set_clauses.append('hiadhpcode8 = :hiadhp_code8') - set_clauses.append('hiadhpkind8 = :hiadhp_kind8') - set_clauses.append('hiadhpcode9 = :hiadhp_code9') - set_clauses.append('hiadhpkind9 = :hiadhp_kind9') - set_clauses.append('hiadhpcode10 = :hiadhp_code10') - set_clauses.append('hiadhpkind10 = :hiadhp_kind10') - set_clauses.append('hiadhpcode11 = :hiadhp_code11') - set_clauses.append('hiadhpkind11 = :hiadhp_kind11') - set_clauses.append('hiadhpcode12 = :hiadhp_code12') - set_clauses.append('hiadhpkind12 = :hiadhp_kind12') - set_clauses.append('hiadhpcode13 = :hiadhp_code13') - set_clauses.append('hiadhpkind13 = :hiadhp_kind13') - set_clauses.append('hiadhpcode14 = :hiadhp_code14') - set_clauses.append('hiadhpkind14 = :hiadhp_kind14') - set_clauses.append('hiadhpcode15 = :hiadhp_code15') - set_clauses.append('hiadhpkind15 = :hiadhp_kind15') - set_clauses.append('hiadhpcode16 = :hiadhp_code16') - set_clauses.append('hiadhpkind16 = :hiadhp_kind16') - set_clauses.append('hiadhpcode17 = :hiadhp_code17') - set_clauses.append('hiadhpkind17 = :hiadhp_kind17') - set_clauses.append('hiadhpcode18 = :hiadhp_code18') - set_clauses.append('hiadhpkind18 = :hiadhp_kind18') - set_clauses.append('hiadhpcode19 = :hiadhp_code19') - set_clauses.append('hiadhpkind19 = :hiadhp_kind19') - set_clauses.append('hiadhpcode20 = :hiadhp_code20') - set_clauses.append('hiadhpkind20 = :hiadhp_kind20') - set_clauses.append('hiadhpcode21 = :hiadhp_code21') - set_clauses.append('hiadhpkind21 = :hiadhp_kind21') - set_clauses.append('hiadhpcode22 = :hiadhp_code22') - set_clauses.append('hiadhpkind22 = :hiadhp_kind22') - set_clauses.append('hiadhpcode23 = :hiadhp_code23') - set_clauses.append('hiadhpkind23 = :hiadhp_kind23') - set_clauses.append('hiadhpcode24 = :hiadhp_code24') - set_clauses.append('hiadhpkind24 = :hiadhp_kind24') - set_clauses.append('hiadhpcode25 = :hiadhp_code25') - set_clauses.append('hiadhpkind25 = :hiadhp_kind25') - set_clauses.append('hiadhpcode26 = :hiadhp_code26') - set_clauses.append('hiadhpkind26 = :hiadhp_kind26') - set_clauses.append('hiadhpcode27 = :hiadhp_code27') - set_clauses.append('hiadhpkind27 = :hiadhp_kind27') - set_clauses.append('hiadhpcode28 = :hiadhp_code28') - set_clauses.append('hiadhpkind28 = :hiadhp_kind28') - set_clauses.append('hiadhpcode29 = :hiadhp_code29') - set_clauses.append('hiadhpkind29 = :hiadhp_kind29') - set_clauses.append('hiadhpcode30 = :hiadhp_code30') - set_clauses.append('hiadhpkind30 = :hiadhp_kind30') - set_clauses.append('hiadhpcode31 = :hiadhp_code31') - set_clauses.append('hiadhpkind31 = :hiadhp_kind31') - set_clauses.append('hiadhpcode32 = :hiadhp_code32') - set_clauses.append('hiadhpkind32 = :hiadhp_kind32') - set_clauses.append('hiadhpcode33 = :hiadhp_code33') - set_clauses.append('hiadhpkind33 = :hiadhp_kind33') - set_clauses.append('hiadhpcode34 = :hiadhp_code34') - set_clauses.append('hiadhpkind34 = :hiadhp_kind34') - set_clauses.append('hiadhpcode35 = :hiadhp_code35') - set_clauses.append('hiadhpkind35 = :hiadhp_kind35') - set_clauses.append('hiadhpcode36 = :hiadhp_code36') - set_clauses.append('hiadhpkind36 = :hiadhp_kind36') - set_clauses.append('hiadhpcode37 = :hiadhp_code37') - set_clauses.append('hiadhpkind37 = :hiadhp_kind37') - set_clauses.append('hiadhpcode38 = :hiadhp_code38') - set_clauses.append('hiadhpkind38 = :hiadhp_kind38') - set_clauses.append('hiadhpcode39 = :hiadhp_code39') - set_clauses.append('hiadhpkind39 = :hiadhp_kind39') - set_clauses.append('hiadhpcode40 = :hiadhp_code40') - set_clauses.append('hiadhpkind40 = :hiadhp_kind40') + # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 41): + num = str(i) + setting_item = 'hiadhpcode' + num + ' = :hiadhp_code' + num + set_clauses.append(setting_item) + setting_item = 'hiadhpkind' + num + ' = :hiadhp_kind' + num + set_clauses.append(setting_item) + if self.record.hiadhp_flag == '@': - self.query_parameter['hiadhp_flag'] = '' - self.query_parameter['hiadhp_code1'] = '' - self.query_parameter['hiadhp_kind1'] = '' - self.query_parameter['hiadhp_code2'] = '' - self.query_parameter['hiadhp_kind2'] = '' - self.query_parameter['hiadhp_code3'] = '' - self.query_parameter['hiadhp_kind3'] = '' - self.query_parameter['hiadhp_code4'] = '' - self.query_parameter['hiadhp_kind4'] = '' - self.query_parameter['hiadhp_code5'] = '' - self.query_parameter['hiadhp_kind5'] = '' - self.query_parameter['hiadhp_code6'] = '' - self.query_parameter['hiadhp_kind6'] = '' - self.query_parameter['hiadhp_code7'] = '' - self.query_parameter['hiadhp_kind7'] = '' - self.query_parameter['hiadhp_code8'] = '' - self.query_parameter['hiadhp_kind8'] = '' - self.query_parameter['hiadhp_code9'] = '' - self.query_parameter['hiadhp_kind9'] = '' - self.query_parameter['hiadhp_code10'] = '' - self.query_parameter['hiadhp_kind10'] = '' - self.query_parameter['hiadhp_code11'] = '' - self.query_parameter['hiadhp_kind11'] = '' - self.query_parameter['hiadhp_code12'] = '' - self.query_parameter['hiadhp_kind12'] = '' - self.query_parameter['hiadhp_code13'] = '' - self.query_parameter['hiadhp_kind13'] = '' - self.query_parameter['hiadhp_code14'] = '' - self.query_parameter['hiadhp_kind14'] = '' - self.query_parameter['hiadhp_code15'] = '' - self.query_parameter['hiadhp_kind15'] = '' - self.query_parameter['hiadhp_code16'] = '' - self.query_parameter['hiadhp_kind16'] = '' - self.query_parameter['hiadhp_code17'] = '' - self.query_parameter['hiadhp_kind17'] = '' - self.query_parameter['hiadhp_code18'] = '' - self.query_parameter['hiadhp_kind18'] = '' - self.query_parameter['hiadhp_code19'] = '' - self.query_parameter['hiadhp_kind19'] = '' - self.query_parameter['hiadhp_code20'] = '' - self.query_parameter['hiadhp_kind20'] = '' - self.query_parameter['hiadhp_code21'] = '' - self.query_parameter['hiadhp_kind21'] = '' - self.query_parameter['hiadhp_code22'] = '' - self.query_parameter['hiadhp_kind22'] = '' - self.query_parameter['hiadhp_code23'] = '' - self.query_parameter['hiadhp_kind23'] = '' - self.query_parameter['hiadhp_code24'] = '' - self.query_parameter['hiadhp_kind24'] = '' - self.query_parameter['hiadhp_code25'] = '' - self.query_parameter['hiadhp_kind25'] = '' - self.query_parameter['hiadhp_code26'] = '' - self.query_parameter['hiadhp_kind26'] = '' - self.query_parameter['hiadhp_code27'] = '' - self.query_parameter['hiadhp_kind27'] = '' - self.query_parameter['hiadhp_code28'] = '' - self.query_parameter['hiadhp_kind28'] = '' - self.query_parameter['hiadhp_code29'] = '' - self.query_parameter['hiadhp_kind29'] = '' - self.query_parameter['hiadhp_code30'] = '' - self.query_parameter['hiadhp_kind30'] = '' - self.query_parameter['hiadhp_code31'] = '' - self.query_parameter['hiadhp_kind31'] = '' - self.query_parameter['hiadhp_code32'] = '' - self.query_parameter['hiadhp_kind32'] = '' - self.query_parameter['hiadhp_code33'] = '' - self.query_parameter['hiadhp_kind33'] = '' - self.query_parameter['hiadhp_code34'] = '' - self.query_parameter['hiadhp_kind34'] = '' - self.query_parameter['hiadhp_code35'] = '' - self.query_parameter['hiadhp_kind35'] = '' - self.query_parameter['hiadhp_code36'] = '' - self.query_parameter['hiadhp_kind36'] = '' - self.query_parameter['hiadhp_code37'] = '' - self.query_parameter['hiadhp_kind37'] = '' - self.query_parameter['hiadhp_code38'] = '' - self.query_parameter['hiadhp_kind38'] = '' - self.query_parameter['hiadhp_code39'] = '' - self.query_parameter['hiadhp_kind39'] = '' - self.query_parameter['hiadhp_code40'] = '' - self.query_parameter['hiadhp_kind40'] = '' + self.query_parameter['hiadhp_flag'] = None + + # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 41): + num = str(i) + setting_item = 'hiadhp_code' + num + self.query_parameter[setting_item] = None + setting_item = 'hiadhp_kind' + num + self.query_parameter[setting_item] = None # 先端医療実施医療機関 if len(self.record.hitechhp_flag) > 0: set_clauses.append('hitechhpflag = :hitechhp_flag') - set_clauses.append('hitechhpkind1 = :hitechhp_kind1') - set_clauses.append('hitechhpkind2 = :hitechhp_kind2') - set_clauses.append('hitechhpkind3 = :hitechhp_kind3') - set_clauses.append('hitechhpkind4 = :hitechhp_kind4') - set_clauses.append('hitechhpkind5 = :hitechhp_kind5') - set_clauses.append('hitechhpkind6 = :hitechhp_kind6') - set_clauses.append('hitechhpkind7 = :hitechhp_kind7') - set_clauses.append('hitechhpkind8 = :hitechhp_kind8') - set_clauses.append('hitechhpkind9 = :hitechhp_kind9') - set_clauses.append('hitechhpkind10 = :hitechhp_kind10') - set_clauses.append('hitechhpkind11 = :hitechhp_kind11') - set_clauses.append('hitechhpkind12 = :hitechhp_kind12') - set_clauses.append('hitechhpkind13 = :hitechhp_kind13') - set_clauses.append('hitechhpkind14 = :hitechhp_kind14') - set_clauses.append('hitechhpkind15 = :hitechhp_kind15') - set_clauses.append('hitechhpkind16 = :hitechhp_kind16') - set_clauses.append('hitechhpkind17 = :hitechhp_kind17') - set_clauses.append('hitechhpkind18 = :hitechhp_kind18') - set_clauses.append('hitechhpkind19 = :hitechhp_kind19') - set_clauses.append('hitechhpkind20 = :hitechhp_kind20') + + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i) + setting_item = 'hitechhpkind' + num + ' = :hitechhp_kind' + num + set_clauses.append(setting_item) + if self.record.hitechhp_flag == '@': - self.query_parameter['hitechhp_flag'] = '' - self.query_parameter['hitechhp_kind1'] = '' - self.query_parameter['hitechhp_kind2'] = '' - self.query_parameter['hitechhp_kind3'] = '' - self.query_parameter['hitechhp_kind4'] = '' - self.query_parameter['hitechhp_kind5'] = '' - self.query_parameter['hitechhp_kind6'] = '' - self.query_parameter['hitechhp_kind7'] = '' - self.query_parameter['hitechhp_kind8'] = '' - self.query_parameter['hitechhp_kind9'] = '' - self.query_parameter['hitechhp_kind10'] = '' - self.query_parameter['hitechhp_kind11'] = '' - self.query_parameter['hitechhp_kind12'] = '' - self.query_parameter['hitechhp_kind13'] = '' - self.query_parameter['hitechhp_kind14'] = '' - self.query_parameter['hitechhp_kind15'] = '' - self.query_parameter['hitechhp_kind16'] = '' - self.query_parameter['hitechhp_kind17'] = '' - self.query_parameter['hitechhp_kind18'] = '' - self.query_parameter['hitechhp_kind19'] = '' - self.query_parameter['hitechhp_kind20'] = '' + self.query_parameter['hitechhp_flag'] = None + + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i) + setting_item = 'hitechhp_kind' + num + self.query_parameter[setting_item] = None # 政策医療 if len(self.record.policy_medical_flag) > 0: set_clauses.append('policymedical_flag = :policy_medical_flag') - set_clauses.append('policymedical_code01 = :policy_medical_code01') - set_clauses.append('policymedical_content01 = :policy_medical_content01') - set_clauses.append('policymedical_code02 = :policy_medical_code02') - set_clauses.append('policymedical_content02 = :policy_medical_content02') - set_clauses.append('policymedical_code03 = :policy_medical_code03') - set_clauses.append('policymedical_content03 = :policy_medical_content03') - set_clauses.append('policymedical_code04 = :policy_medical_code04') - set_clauses.append('policymedical_content04 = :policy_medical_content04') - set_clauses.append('policymedical_code05 = :policy_medical_code05') - set_clauses.append('policymedical_content05 = :policy_medical_content05') - set_clauses.append('policymedical_code06 = :policy_medical_code06') - set_clauses.append('policymedical_content06 = :policy_medical_content06') - set_clauses.append('policymedical_code07 = :policy_medical_code07') - set_clauses.append('policymedical_content07 = :policy_medical_content07') - set_clauses.append('policymedical_code08 = :policy_medical_code08') - set_clauses.append('policymedical_content08 = :policy_medical_content08') - set_clauses.append('policymedical_code09 = :policy_medical_code09') - set_clauses.append('policymedical_content09 = :policy_medical_content09') - set_clauses.append('policymedical_code10 = :policy_medical_code10') - set_clauses.append('policymedical_content10 = :policy_medical_content10') - set_clauses.append('policymedical_code11 = :policy_medical_code11') - set_clauses.append('policymedical_content11 = :policy_medical_content11') - set_clauses.append('policymedical_code12 = :policy_medical_code12') - set_clauses.append('policymedical_content12 = :policy_medical_content12') - set_clauses.append('policymedical_code13 = :policy_medical_code13') - set_clauses.append('policymedical_content13 = :policy_medical_content13') - set_clauses.append('policymedical_code14 = :policy_medical_code14') - set_clauses.append('policymedical_content14 = :policy_medical_content14') - set_clauses.append('policymedical_code15 = :policy_medical_code15') - set_clauses.append('policymedical_content15 = :policy_medical_content15') - set_clauses.append('policymedical_code16 = :policy_medical_code16') - set_clauses.append('policymedical_content16 = :policy_medical_content16') - set_clauses.append('policymedical_code17 = :policy_medical_code17') - set_clauses.append('policymedical_content17 = :policy_medical_content17') - set_clauses.append('policymedical_code18 = :policy_medical_code18') - set_clauses.append('policymedical_content18 = :policy_medical_content18') - set_clauses.append('policymedical_code19 = :policy_medical_code19') - set_clauses.append('policymedical_content19 = :policy_medical_content19') - set_clauses.append('policymedical_code20 = :policy_medical_code20') - set_clauses.append('policymedical_content20 = :policy_medical_content20') + + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item = 'policymedical_code' + num + ' = :policy_medical_code' + num + set_clauses.append(setting_item) + setting_item = 'policymedical_content' + num + ' = :policy_medical_content' + num + set_clauses.append(setting_item) + if self.record.policy_medical_flag == '@': - self.query_parameter['policy_medical_flag'] = '' - self.query_parameter['policy_medical_code01'] = '' - self.query_parameter['policy_medical_content01'] = '' - self.query_parameter['policy_medical_code02'] = '' - self.query_parameter['policy_medical_content02'] = '' - self.query_parameter['policy_medical_code03'] = '' - self.query_parameter['policy_medical_content03'] = '' - self.query_parameter['policy_medical_code04'] = '' - self.query_parameter['policy_medical_content04'] = '' - self.query_parameter['policy_medical_code05'] = '' - self.query_parameter['policy_medical_content05'] = '' - self.query_parameter['policy_medical_code06'] = '' - self.query_parameter['policy_medical_content06'] = '' - self.query_parameter['policy_medical_code07'] = '' - self.query_parameter['policy_medical_content07'] = '' - self.query_parameter['policy_medical_code08'] = '' - self.query_parameter['policy_medical_content08'] = '' - self.query_parameter['policy_medical_code09'] = '' - self.query_parameter['policy_medical_content09'] = '' - self.query_parameter['policy_medical_code10'] = '' - self.query_parameter['policy_medical_content10'] = '' - self.query_parameter['policy_medical_code11'] = '' - self.query_parameter['policy_medical_content11'] = '' - self.query_parameter['policy_medical_code12'] = '' - self.query_parameter['policy_medical_content12'] = '' - self.query_parameter['policy_medical_code13'] = '' - self.query_parameter['policy_medical_content13'] = '' - self.query_parameter['policy_medical_code14'] = '' - self.query_parameter['policy_medical_content14'] = '' - self.query_parameter['policy_medical_code15'] = '' - self.query_parameter['policy_medical_content15'] = '' - self.query_parameter['policy_medical_code16'] = '' - self.query_parameter['policy_medical_content16'] = '' - self.query_parameter['policy_medical_code17'] = '' - self.query_parameter['policy_medical_content17'] = '' - self.query_parameter['policy_medical_code18'] = '' - self.query_parameter['policy_medical_content18'] = '' - self.query_parameter['policy_medical_code19'] = '' - self.query_parameter['policy_medical_content19'] = '' - self.query_parameter['policy_medical_code20'] = '' - self.query_parameter['policy_medical_content20'] = '' + self.query_parameter['policy_medical_flag'] = None + + # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 21): + num = str(i).zfill(2) # 2桁で0埋め + setting_item = 'policy_medical_code' + num + self.query_parameter[setting_item] = None + setting_item = 'policy_medical_content' + num + self.query_parameter[setting_item] = None # 訪問看護ステーション if len(self.record.visitcarest_flag) > 0: @@ -1449,27 +1190,25 @@ class ComInstAttMapper(UltmarcTableMapper): set_clauses.append('visitcarestation_code = :visitcarestation_code') set_clauses.append('visitcarestation_yobi = :visitcarestation_yobi') if self.record.visitcarest_flag == '@': - self.query_parameter['visitcarest_flag'] = '' - self.query_parameter['visitcarestation_id'] = '' - self.query_parameter['visitcarestation_code'] = '' - self.query_parameter['visitcarestation_yobi'] = '' + self.query_parameter['visitcarest_flag'] = None + self.query_parameter['visitcarestation_id'] = None + self.query_parameter['visitcarestation_code'] = None + self.query_parameter['visitcarestation_yobi'] = None # 開設年月 if len(self.record.open_date) > 0: set_clauses.append('opendate = :open_date') if self.record.open_date == '@': - self.query_parameter['open_date'] = '' + self.query_parameter['open_date'] = None update_columns = ','.join(set_clauses) # 何も更新項目が無い場合はNoneとする(更新処理は行わない) if len(update_columns) == 0: - self.queries.append(None) + return None else: # 末尾にカンマを付けてSET句を完成させる update_columns += ',' update_query = self.UPDATE_QUERY.format( update_columns=update_columns ) - self.queries.append(update_query) - - return + return update_query diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py index 77ec6cf6..90f02cd2 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py @@ -19,7 +19,7 @@ class ComInstAtt(UltmarcTable): funchp_ok_date: str # 特定機能病院承認年月日 funchp_can_date: str # 特定機能病院取消年月日 areasuphp_flag: str # 地域医療支援病院フラグ - areasuphp_intrate: str # 地域医療支援病院紹介率 ※ + areasuphp_intrate: str # 地域医療支援病院紹介率 areasuphp_ok_date: str # 地域医療支援病院承認年月日 areasuphp_can_date: str # 地域医療支援病院取消年月日 acuthp_add_flag: str # 超急性期脳卒中加算フラグ @@ -103,30 +103,30 @@ class ComInstAtt(UltmarcTable): fullmove_flag: str # 完全型・移行型区分 resthp_flag: str # 療養型病床群フラグ resthp_care_kind: str # 療養型病床群_医療型(看護種別) - resthp_bed_num: str # 療養型病床群_医療型(病床数) ※ + resthp_bed_num: str # 療養型病床群_医療型(病床数) resthp_ok_date: str # 療養型病床群_医療型(承認年月日) resthp_can_date: str # 療養型病床群_医療型(取消年月日) resthp_care_nrs_kind: str # 療養型病床群_介護型(看護種別) - resthp_care_bed_num: str # 療養型病床群_介護型(病床数) ※ + resthp_care_bed_num: str # 療養型病床群_介護型(病床数) resthp_care_ok_date: str # 療養型病床群_介護型(承認年月日) resthp_care_can_date: str # 療養型病床群_介護型(取消年月日) - resthp_sbed_num: str # 療養型病床群_稼動数合計(病床数) ※ + resthp_sbed_num: str # 療養型病床群_稼動数合計(病床数) nrmhp_flag: str # 一般病棟フラグ nrmhp_care_kind: str # 一般病棟看護種別 - nrmhp_bed_total_num: str # 一般病棟病床数 ※ + nrmhp_bed_total_num: str # 一般病棟病床数 menthp_flag: str # 精神病棟フラグ menthp_care_kind: str # 精神病棟看護種別 - menthp_bed_num: str # 精神病棟病床数 ※ + menthp_bed_num: str # 精神病棟病床数 tubhp_flag: str # 結核病棟フラグ tubhp_care_kind: str # 結核病棟看護種別 - tubhp_bed_num: str # 結核病棟病床数 ※ + tubhp_bed_num: str # 結核病棟病床数 infhp_flag: str # 感染症特定 infhp_flag1: str # 感染症1種 infhp_flag2: str # 感染症2種 infhp_bed_flag: str # 感染症病床フラグ - infhp_bed_num: str # 感染症病床病床数 ※ + infhp_bed_num: str # 感染症病床病床数 hospice_flag: str # 緩和ケア病棟設置病院フラグ - hospice_bed_num: str # 緩和ケア病棟設置病院病床数 ※ + hospice_bed_num: str # 緩和ケア病棟設置病院病床数 hospice_ok_date: str # 緩和ケア病棟設置病院承認年月日 hospice_can_date: str # 緩和ケア病棟設置病院取消年月日 hpfunce_st_flag: str # 医療機能評価フラグ diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv index 25a65dba..ecb59fbf 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/expect_com_inst_att_update.csv @@ -1,6 +1,7 @@ "dcf_dsf_inst_cd","dpc_flag","dpc_specday","dpc_cancelday","predpc_flag","predpc_specday","predpc_cancelday","cancer_flag","cancer_specday","cancer_cancelday","funchpflag","funchpokdate","funchpcandate","areasuphpflag","areasuphpintrate","areasuphpokdate","areasuphpcandate","acuthpaddflag","acuthpaddokdate","acuthpaddcandate","genadmisiionflag","genadmisiionfokdate","genadmisiionfcandate","assistanceflag","assistanceokdate","assistancecandate","diagnosistreatment_flag","diagnosistreatment_specday","diagnosistreatment_cancelday","safety_flag","safety_specday","safety_cancelday","highrisk_flag","highrisk_specday","highrisk_cancelday","infantandholiday_flag","infantandholiday_specday","infantandholiday_cancelday","ophpflag","ophpokdate","ophpcandate","critical_flag","critical_code01","critical_code02","critical_code03","critical_code04","critical_code05","critical_code06","critical_code07","critical_code08","critical_code09","critical_code10","critical_code11","critical_code12","critical_code13","critical_code14","critical_code15","critical_code16","critical_code17","critical_code18","critical_code19","critical_code20","drgmgthpflag","drgmgthpokdate","drgmgthpcandate","imagediagnosis_flag","imagediagnosis_specifiedday","imagediagnosis_cancelday","chemotherapy_flag","chemotherapy_specday","chemotherapy_cancelday","rehabilitation_flag","rehabilitation_code01","rehabilitation_code02","rehabilitation_code03","rehabilitation_code04","rehabilitation_code05","rehabilitation_code06","rehabilitation_code07","rehabilitation_code08","rehabilitation_code09","rehabilitation_code10","anesthetizingmanage_flag","anesthetizingmanage_specday","anesthetizingmanage_cancelday","homerecuperation_flag","homerecuperation_specday","homerecuperation_cancelday","synthesiswhenstaying_flag","synthesiswhenstaying_specday","synthesiswhenstaying_cancelday","homelateflag","homelateokday","homelatecanday","caremixkind","fullmoveflag","resthpflag","resthpcarekind","resthpbednum","resthpokdate","resthpcandate","resthpcarenrskind","resthpcarebednum","resthpcareokdate","resthpcarecandate","resthpsbednum","nrmhpflag","nrmhpcarekind","nrmhpbedtotalnum","menthpflag","menthpcarekind","menthpbednum","tubhpflag","tubhpcarekind","tubhpbednum","infhpflag","infhpflag1","infhpflag2","infhpbedflag","infhpbednum","hospiceflag","hospicebednum","hospiceokdate","hospicecandate","hpfuncestflag","hpfuncestkind","hpfuncestokdate","hpfuncestcandate","clolyhpkind","clolyhpokdate","clolyhpcandate","clhpkind","clhpokdate","clhpcandate","cldephpkind","cldephpokdate","cldephpcandate","disasthpflag","d1emerhpflag","d2emerhpflag","d3emerhpflag","emergencyclinic","trialcoreflag","trialcore_div","trialcoreokdate","trialcorecandate","dementiaflag","dementiaokdate","dementiacandate","sphealth_exploration","sphealth_guidance","hiadhpflag","hiadhpcode1","hiadhpkind1","hiadhpcode2","hiadhpkind2","hiadhpcode3","hiadhpkind3","hiadhpcode4","hiadhpkind4","hiadhpcode5","hiadhpkind5","hiadhpcode6","hiadhpkind6","hiadhpcode7","hiadhpkind7","hiadhpcode8","hiadhpkind8","hiadhpcode9","hiadhpkind9","hiadhpcode10","hiadhpkind10","hiadhpcode11","hiadhpkind11","hiadhpcode12","hiadhpkind12","hiadhpcode13","hiadhpkind13","hiadhpcode14","hiadhpkind14","hiadhpcode15","hiadhpkind15","hiadhpcode16","hiadhpkind16","hiadhpcode17","hiadhpkind17","hiadhpcode18","hiadhpkind18","hiadhpcode19","hiadhpkind19","hiadhpcode20","hiadhpkind20","hiadhpcode21","hiadhpkind21","hiadhpcode22","hiadhpkind22","hiadhpcode23","hiadhpkind23","hiadhpcode24","hiadhpkind24","hiadhpcode25","hiadhpkind25","hiadhpcode26","hiadhpkind26","hiadhpcode27","hiadhpkind27","hiadhpcode28","hiadhpkind28","hiadhpcode29","hiadhpkind29","hiadhpcode30","hiadhpkind30","hiadhpcode31","hiadhpkind31","hiadhpcode32","hiadhpkind32","hiadhpcode33","hiadhpkind33","hiadhpcode34","hiadhpkind34","hiadhpcode35","hiadhpkind35","hiadhpcode36","hiadhpkind36","hiadhpcode37","hiadhpkind37","hiadhpcode38","hiadhpkind38","hiadhpcode39","hiadhpkind39","hiadhpcode40","hiadhpkind40","hitechhpflag","hitechhpkind1","hitechhpkind2","hitechhpkind3","hitechhpkind4","hitechhpkind5","hitechhpkind6","hitechhpkind7","hitechhpkind8","hitechhpkind9","hitechhpkind10","hitechhpkind11","hitechhpkind12","hitechhpkind13","hitechhpkind14","hitechhpkind15","hitechhpkind16","hitechhpkind17","hitechhpkind18","hitechhpkind19","hitechhpkind20","policymedical_flag","policymedical_code01","policymedical_content01","policymedical_code02","policymedical_content02","policymedical_code03","policymedical_content03","policymedical_code04","policymedical_content04","policymedical_code05","policymedical_content05","policymedical_code06","policymedical_content06","policymedical_code07","policymedical_content07","policymedical_code08","policymedical_content08","policymedical_code09","policymedical_content09","policymedical_code10","policymedical_content10","policymedical_code11","policymedical_content11","policymedical_code12","policymedical_content12","policymedical_code13","policymedical_content13","policymedical_code14","policymedical_content14","policymedical_code15","policymedical_content15","policymedical_code16","policymedical_content16","policymedical_code17","policymedical_content17","policymedical_code18","policymedical_content18","policymedical_code19","policymedical_content19","policymedical_code20","policymedical_content20","visitcarestflag","visitcarestation_id","visitcarestation_code","visitcarestation_yobi","opendate","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","19971001","","","","","","","","","","","","","","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009900631","1","20171009","","1","2017","20171009","","","","","","","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","1","19971001","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","","NULL","","","NULL","","","NULL","","","","","NULL","","NULL","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","3","","","","","","","","","","","","","","","","","","","","1","1","2","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","0","12","","20","","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" "009901649","","","","1","2009","20171010","","","","","","","","NULL","","","","","","","","","1","20121201","","1","20080901","","","","20080331","","","","","","","1","20080701","","1","99","","","","","","","","","","","","","","","","","","","","1","20100401","","","","","","","","1","01","02","03","","","","","","","","1","19970701","","1","20130101","","1","20060401","","","","","1","9","1","I001","43","20061001","","","NULL","","","43","1","B999","120","","","NULL","","","NULL","","","","","NULL","","NULL","","","1","12","20131101","","","","","","","","","","","","1","1","","","","","","","","","","1","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1","11","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","201710","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" -"009990146","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171009","20171011","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" +"009990146","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComInstAtt","2023/05/09 10:39:02","com_inst_att_mapper" "12345678999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","clsComInstAtt","2023/05/09 10:10:10","com_inst_att_mapper" "99999999999","9","20230510","20230511","2","2023","20230514","5","20230516","20230517","8","20230519","20230520","1","22.1","20230523","20230524","5","20230526","20230527","8","20230529","20230530","1","20230502","20230503","4","20230505","20230506","7","20230508","20230509","0","20230501","20230402","3","20230404","20230405","6","20230407","20230408","9","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","0","20230701","20230702","3","20230704","20230705","6","20230707","20230708","9","80","81","82","83","84","85","86","87","88","89","0","20230901","20230902","3","20230904","20230905","6","20230907","20230908","9","20231001","20231011","2","3","4","105","106","20231007","20231008","109","110","20231101","20231102","113","4","0115","116","7","0118","119","0","0121","122","3","4","5","6","127","8","129","20230130","20230131","2","33","20230104","20230105","6","20230107","20230108","9","20230104","20230101","2","20230103","20230104","5","6","7","8","9","0","1","20230102","20230403","4","20230105","20230106","7","8","9","160","1","162","3","164","5","166","7","168","9","170","1","172","3","174","5","176","7","178","9","180","1","182","3","184","5","186","7","188","9","190","1","192","3","194","5","196","7","198","9","200","1","202","3","204","5","206","7","208","9","210","1","212","3","214","5","216","7","218","9","220","1","222","3","224","5","226","7","228","9","230","1","232","3","234","5","236","7","238","9","0","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","1","62","3","64","5","66","7","68","9","70","1","72","3","74","5","76","7","78","9","80","1","82","3","84","5","86","7","88","9","90","1","92","3","94","5","96","7","98","9","00","1","2","3","0000304","05","202303","20171009","20230509","NULL","NULL","NULL","NULL","2017/10/09 18:31:09","aaaa","2023/05/09 10:10:10","aaaa" + diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py index f54f641c..0721905d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py @@ -86,7 +86,7 @@ class TestComInstAttMapper: actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 From 80d4b0355761a21d9183982826e69c876767bc42 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 10 May 2023 10:26:22 +0900 Subject: [PATCH 238/962] =?UTF-8?q?feat:=20=E5=8F=82=E8=80=83=E3=80=81?= =?UTF-8?q?=E3=83=AB=E3=83=BC=E3=83=97=E3=81=A7=E9=80=A3=E7=95=AA=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E3=82=92=E5=87=A6=E7=90=86=E3=81=99=E3=82=8B=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=81=AE=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index a02f2965..70df59e1 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -823,19 +823,17 @@ class ComInstAttMapper(UltmarcTableMapper): # 地域連携クリティカルパス if len(self.record.critical_flag) > 0: set_clauses.append('critical_flag = :critical_flag') + # 項目クリア判断 + is_aggregate_item_clear = self.record.critical_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['critical_flag'] = None # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 21): num = str(i).zfill(2) # 2桁で0埋め - setting_item = 'critical_code' + num + ' = :critical_code' + num - set_clauses.append(setting_item) - - if self.record.critical_flag == '@': - self.query_parameter['critical_flag'] = None - # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) - for i in range(1, 21): - num = str(i).zfill(2) - setting_item = 'critical_code' + num - self.query_parameter[setting_item] = None + setting_item_name = f'critical_code{num}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None # 薬剤管理指導料 if len(self.record.drgmgthp_flag) > 0: From 6cbee0e8baca40d23cc7d8d3830871daae8ecb95 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 10 May 2023 13:22:40 +0900 Subject: [PATCH 239/962] =?UTF-8?q?=E6=97=A5=E4=BB=98=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=81=8Ctsv=E3=81=A7=E3=83=96=E3=83=A9=E3=83=B3?= =?UTF-8?q?=E3=82=AF=E3=81=A0=E3=81=A3=E3=81=9F=E3=81=A8=E3=81=8D=E3=80=81?= =?UTF-8?q?LOAD=E6=96=87=E3=81=A7'0000-00-00'=E3=81=AB=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=81=AE=E5=AF=BE=E5=87=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 8 +++++--- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 86040640..c63ac962 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -25,15 +25,17 @@ class JjskDataLoadManager: db.execute(f"TRUNCATE TABLE {table_name_org};") # orgにload ※warningは1148エラーになるらしい - sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org}" \ + sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org} " \ " FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" result = db.execute(sql, {"src_file_name": src_file_name}) logger.info(f'tsvデータをorgテーブルにLOAD : 件数({result.rowcount})') # org→srcにinsert select db.begin() - result = db.execute(upsert_sql) - logger.info(f'orgテーブルをsrcテーブルにUPSERT : 件数({result.rowcount})') + db.execute(upsert_sql) + # TODO: insert+select 実質10件なのに、resultのrowcountは20件になってしまう ※sqlalchemyの仕様 + # https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount + logger.info('orgテーブルをsrcテーブルにUPSERT') db.commit() except Exception as e: diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index ec243433..726e927c 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -815,7 +815,7 @@ class VjskRecvFileMapper: ,t.PKG_CD ,t.PKG_NAME ,t.CNV_NUM - ,t.JSK_START_DT + ,nullif(t.JSK_START_DT, 0) ,t.PRD_SALE_KBN ,t.JSK_PROC_KBN ,t.START_DATE @@ -846,7 +846,7 @@ class VjskRecvFileMapper: ,PKG_CD=t.PKG_CD ,PKG_NAME=t.PKG_NAME ,CNV_NUM=t.CNV_NUM - ,JSK_START_DT=t.JSK_START_DT + ,JSK_START_DT=nullif(t.JSK_START_DT, 0) ,PRD_SALE_KBN=t.PRD_SALE_KBN ,JSK_PROC_KBN=t.JSK_PROC_KBN ,START_DATE=t.START_DATE From a8a808682efbb65fdb334a715e7ad489c70cb40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 10 May 2023 14:38:33 +0900 Subject: [PATCH 240/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_prefc_med_base_mapper.py | 455 ++++++++++++++++++ .../utmp_tables/tables/com_prefc_med_base.py | 157 ++++++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_alma/test_com_alma_mapper.py | 4 +- .../com_prefc_med_base/__init__.py | 0 .../com_prefc_med_base_delete.csv | 3 + .../com_prefc_med_base_insert.csv | 6 + .../com_prefc_med_base_update.csv | 6 + .../db_com_prefc_med_base_before_delete.csv | 6 + .../db_com_prefc_med_base_before_update.csv | 9 + .../expect_com_prefc_med_base_delete.csv | 3 + .../expect_com_prefc_med_base_insert.csv | 7 + .../expect_com_prefc_med_base_update.csv | 9 + .../test_com_prefc_med_base_mapper.py | 196 ++++++++ 14 files changed, 862 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py new file mode 100644 index 00000000..7605fc30 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py @@ -0,0 +1,455 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_base import ComPrefcMedBase + + +class ComPrefcMedBaseMapper(UltmarcTableMapper): + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_base + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_base + ( + dcf_dsf_inst_cd, + info_date, + home_page, + hppre_flg, + expre_flg, + trial_flg, + trial_contcount, + trialwhet_from, + trialwhet_to, + equipment_flg, + cos_disease_flg, + cos_surgery, + specialclinic_flg, + establishment_flg, + critical_flg, + cop_system, + sys_exists_flg, + sys_inspection, + sys_prescription, + sys_reserv, + icduse_flg, + echart_flg, + fulltime_flg, + fulltime_count, + ge_patient_avg, + mt_patient_avg, + mc_patient_avg, + ca_patient_avg, + pys_patient_avg, + tub_patient_avg, + inf_patient_avg, + patient_avg_sum, + patient_avg_from, + patient_avg_to, + cl_patient_avg, + cl_patient_avg_from, + cl_patient_avg_to, + hm_patient_avg, + hm_patient_avg_from, + hm_patient_avg_to, + ge_patient_ex, + mt_patient_ex, + mc_patient_ex, + ca_patient_ex, + pys_patient_ex, + tub_patient_ex, + inf_patient_ex, + patient_ex_sum, + patient_ex_from, + patient_ex_to, + cl_patient_ex, + cl_patient_ex_from, + cl_patient_ex_to, + hm_patient_ex, + hm_patient_ex_from, + hm_patient_ex_to, + ge_stay_avg, + mt_stay_avg, + mc_stay_avg, + ca_stay_avg, + pys_stay_avg, + tub_stay_avg, + inf_stay_avg, + stay_avg_sum, + stay_avg_from, + stay_avg_to, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :info_date, + :home_page, + :hppre_flg, + :expre_flg, + :trial_flg, + :trial_cont_count, + :trial_whet_from, + :trial_whet_to, + :equipment_flg, + :cos_disease_flg, + :cos_surgery, + :specialclinic_flg, + :establishment_flg, + :critical_flg, + :cop_system, + :sys_exists_flg, + :sys_inspection, + :sys_prescription, + :sys_reserv, + :icduse_flg, + :echart_flg, + :fulltime_flg, + :fulltime_count, + :ge_patient_avg, + :mt_patient_avg, + :mc_patient_avg, + :ca_patient_avg, + :pys_patient_avg, + :tub_patient_avg, + :inf_patient_avg, + :patient_avg_sum, + :patient_avg_from, + :patient_avg_to, + :cl_patient_avg, + :cl_patient_avg_from, + :cl_patient_avg_to, + :hm_patient_avg, + :hm_patient_avg_from, + :hm_patient_avg_to, + :ge_patient_ex, + :mt_patient_ex, + :mc_patient_ex, + :ca_patient_ex, + :pys_patient_ex, + :tub_patient_ex, + :inf_patient_ex, + :patient_ex_sum, + :patient_ex_from, + :patient_ex_to, + :cl_patient_ex, + :cl_patient_ex_from, + :cl_patient_ex_to, + :hm_patient_ex, + :hm_patient_ex_from, + :hm_patient_ex_to, + :ge_stay_avg, + :mt_stay_avg, + :mc_stay_avg, + :ca_stay_avg, + :pys_stay_avg, + :tub_stay_avg, + :inf_stay_avg, + :stay_avg_sum, + :stay_avg_from, + :stay_avg_to, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_base + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_base + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + """ + + record: ComPrefcMedBase + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedBase) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.__make_update_query() + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # 情報年月日 + if len(self.record.info_date) > 0: + set_clauses.append('info_date = :info_date') + if self.record.info_date == '@': + self.query_parameter['info_date'] = None + + # 案内用ホームページアドレス + if len(self.record.home_page) > 0: + set_clauses.append('home_page = :home_page') + if self.record.home_page == '@': + self.query_parameter['home_page'] = None + + # 院内処方フラグ + if len(self.record.hppre_flg) > 0: + set_clauses.append('hppre_flg = :hppre_flg') + if self.record.hppre_flg == '@': + self.query_parameter['hppre_flg'] = None + + # 院外処方フラグ + if len(self.record.expre_flg) > 0: + set_clauses.append('expre_flg = :expre_flg') + if self.record.expre_flg == '@': + self.query_parameter['expre_flg'] = None + + # 治験の実施 + if len(self.record.trial_flg) > 0: + set_clauses.append('trial_flg = :trial_flg') + set_clauses.append('trial_contcount = :trial_cont_count') + set_clauses.append('trialwhet_from = :trial_whet_from') + set_clauses.append('trialwhet_to = :trial_whet_to') + if self.record.trial_flg == '@': + self.query_parameter['trial_flg'] = None + self.query_parameter['trial_cont_count'] = None + self.query_parameter['trial_whet_from'] = None + self.query_parameter['trial_whet_to'] = None + + # 保有する施設設備フラグ + if len(self.record.equipment_flg) > 0: + set_clauses.append('equipment_flg = :equipment_flg') + if self.record.equipment_flg == '@': + self.query_parameter['equipment_flg'] = None + + # 対応することができる疾患・治療の内容フラグ + if len(self.record.cos_disease_flg) > 0: + set_clauses.append('cos_disease_flg = :cos_disease_flg') + if self.record.cos_disease_flg == '@': + self.query_parameter['cos_disease_flg'] = None + + # 対応することができる短期滞在手術フラグ + if len(self.record.cos_surgery) > 0: + set_clauses.append('cos_surgery = :cos_surgery') + if self.record.cos_surgery == '@': + self.query_parameter['cos_surgery'] = None + + # 専門外来フラグ + if len(self.record.specialclinic_flg) > 0: + set_clauses.append('specialclinic_flg = :specialclinic_flg') + if self.record.specialclinic_flg == '@': + self.query_parameter['specialclinic_flg'] = None + + # 地域医療連携体制_窓口設置フラグ + if len(self.record.establishment_flg) > 0: + set_clauses.append('establishment_flg = :establishment_flg') + if self.record.establishment_flg == '@': + self.query_parameter['establishment_flg'] = None + + # 地域医療連携体制_地域連携パスフラグ + if len(self.record.critical_flg) > 0: + set_clauses.append('critical_flg = :critical_flg') + if self.record.critical_flg == '@': + self.query_parameter['critical_flg'] = None + + # 入院診療計画策定時における院内の連携体制 + if len(self.record.cop_system) > 0: + set_clauses.append('cop_system = :cop_system') + if self.record.cop_system == '@': + self.query_parameter['cop_system'] = None + + # オーダリングシステム + if len(self.record.sys_exists_flg) > 0: + set_clauses.append('sys_exists_flg = :sys_exists_flg') + set_clauses.append('sys_inspection = :sys_inspection') + set_clauses.append('sys_prescription = :sys_prescription') + set_clauses.append('sys_reserv = :sys_reserv') + if self.record.sys_exists_flg == '@': + self.query_parameter['sys_exists_flg'] = None + self.query_parameter['sys_inspection'] = None + self.query_parameter['sys_prescription'] = None + self.query_parameter['sys_reserv'] = None + + # ICDコード利用フラグ + if len(self.record.icduse_flg) > 0: + set_clauses.append('icduse_flg = :icduse_flg') + if self.record.icduse_flg == '@': + self.query_parameter['icduse_flg'] = None + + # 電子カルテフラク + if len(self.record.echart_flg) > 0: + set_clauses.append('echart_flg = :echart_flg') + if self.record.echart_flg == '@': + self.query_parameter['echart_flg'] = None + + # 専任従事者 + if len(self.record.fulltime_flg) > 0: + set_clauses.append('fulltime_flg = :fulltime_flg') + set_clauses.append('fulltime_count = :fulltime_count') + if self.record.fulltime_flg == '@': + self.query_parameter['fulltime_flg'] = None + self.query_parameter['fulltime_count'] = None + + # 病床患者数平均 + if len(self.record.ge_patient_avg) > 0: + set_clauses.append('ge_patient_avg = :ge_patient_avg') + set_clauses.append('mt_patient_avg = :mt_patient_avg') + set_clauses.append('mc_patient_avg = :mc_patient_avg') + set_clauses.append('ca_patient_avg = :ca_patient_avg') + set_clauses.append('pys_patient_avg = :pys_patient_avg') + set_clauses.append('tub_patient_avg = :inf_patient_avg') + set_clauses.append('inf_patient_avg = :tub_patient_avg') + set_clauses.append('patient_avg_sum = :patient_avg_sum') + set_clauses.append('patient_avg_from = :patient_avg_from') + set_clauses.append('patient_avg_to = :patient_avg_to') + if self.record.ge_patient_avg == '@': + self.query_parameter['ge_patient_avg'] = None + self.query_parameter['mt_patient_avg'] = None + self.query_parameter['mc_patient_avg'] = None + self.query_parameter['ca_patient_avg'] = None + self.query_parameter['pys_patient_avg'] = None + self.query_parameter['inf_patient_avg'] = None + self.query_parameter['tub_patient_avg'] = None + self.query_parameter['patient_avg_sum'] = None + self.query_parameter['patient_avg_from'] = None + self.query_parameter['patient_avg_to'] = None + + # 患者数平均 + if len(self.record.cl_patient_avg) > 0: + set_clauses.append('cl_patient_avg = :cl_patient_avg') + set_clauses.append('cl_patient_avg_from = :cl_patient_avg_from') + set_clauses.append('cl_patient_avg_to = :cl_patient_avg_to') + if self.record.cl_patient_avg == '@': + self.query_parameter['cl_patient_avg'] = None + self.query_parameter['cl_patient_avg_from'] = None + self.query_parameter['cl_patient_avg_to'] = None + + # 患者数平均 + if len(self.record.hm_patient_avg) > 0: + set_clauses.append('hm_patient_avg = :hm_patient_avg') + set_clauses.append('hm_patient_avg_from = :hm_patient_avg_from') + set_clauses.append('hm_patient_avg_to = :hm_patient_avg_to') + if self.record.hm_patient_avg == '@': + self.query_parameter['hm_patient_avg'] = None + self.query_parameter['hm_patient_avg_from'] = None + self.query_parameter['hm_patient_avg_to'] = None + + # 患者数延数 + if len(self.record.ge_patient_ex) > 0: + set_clauses.append('ge_patient_ex = :ge_patient_ex') + set_clauses.append('mt_patient_ex = :mt_patient_ex') + set_clauses.append('mc_patient_ex = :mc_patient_ex') + set_clauses.append('ca_patient_ex = :ca_patient_ex') + set_clauses.append('pys_patient_ex = :pys_patient_ex') + set_clauses.append('tub_patient_ex = :tub_patient_ex') + set_clauses.append('inf_patient_ex = :inf_patient_ex') + set_clauses.append('patient_ex_sum = :patient_ex_sum') + set_clauses.append('patient_ex_from = :patient_ex_from') + set_clauses.append('patient_ex_to = :patient_ex_to') + if self.record.ge_patient_ex == '@': + self.query_parameter['ge_patient_ex'] = None + self.query_parameter['mt_patient_ex'] = None + self.query_parameter['mc_patient_ex'] = None + self.query_parameter['ca_patient_ex'] = None + self.query_parameter['pys_patient_ex'] = None + self.query_parameter['tub_patient_ex'] = None + self.query_parameter['inf_patient_ex'] = None + self.query_parameter['patient_ex_sum'] = None + self.query_parameter['patient_ex_from'] = None + self.query_parameter['patient_ex_to'] = None + + # 患者数延数 + if len(self.record.cl_patient_ex) > 0: + set_clauses.append('cl_patient_ex = :cl_patient_ex') + set_clauses.append('cl_patient_ex_from = :cl_patient_ex_from') + set_clauses.append('cl_patient_ex_to = :cl_patient_ex_to') + if self.record.cl_patient_ex == '@': + self.query_parameter['cl_patient_ex'] = None + self.query_parameter['cl_patient_ex_from'] = None + self.query_parameter['cl_patient_ex_to'] = None + + # 患者数延数 + if len(self.record.hm_patient_ex) > 0: + set_clauses.append('hm_patient_ex = :hm_patient_ex') + set_clauses.append('hm_patient_ex_from = :hm_patient_ex_from') + set_clauses.append('hm_patient_ex_to = :hm_patient_ex_to') + if self.record.hm_patient_ex == '@': + self.query_parameter['hm_patient_ex'] = None + self.query_parameter['hm_patient_ex_from'] = None + self.query_parameter['hm_patient_ex_to'] = None + + # 平均在院日数 + if len(self.record.ge_stay_avg) > 0: + set_clauses.append('ge_stay_avg = :ge_stay_avg') + set_clauses.append('mt_stay_avg = :mt_stay_avg') + set_clauses.append('mc_stay_avg = :mc_stay_avg') + set_clauses.append('ca_stay_avg = :ca_stay_avg') + set_clauses.append('pys_stay_avg = :pys_stay_avg') + set_clauses.append('tub_stay_avg = :tub_stay_avg') + set_clauses.append('inf_stay_avg = :inf_stay_avg') + set_clauses.append('stay_avg_sum = :stay_avg_sum') + set_clauses.append('stay_avg_from = :stay_avg_from') + set_clauses.append('stay_avg_to = :stay_avg_to') + if self.record.ge_stay_avg == '@': + self.query_parameter['ge_stay_avg'] = None + self.query_parameter['mt_stay_avg'] = None + self.query_parameter['mc_stay_avg'] = None + self.query_parameter['ca_stay_avg'] = None + self.query_parameter['pys_stay_avg'] = None + self.query_parameter['tub_stay_avg'] = None + self.query_parameter['inf_stay_avg'] = None + self.query_parameter['stay_avg_sum'] = None + self.query_parameter['stay_avg_from'] = None + self.query_parameter['stay_avg_to'] = None + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py new file mode 100644 index 00000000..56b64a7b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py @@ -0,0 +1,157 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedBase(UltmarcTable): + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備)10/8asa + maint_flag: str # 修正区分 + adddel_div: str # 予備/追加削除区分 + maint_date: str # メンテナンス年月日 + trn_date: str # 予備/転送年月日 + info_date: str # 情報年月日 + home_page: str # 案内用ホームページアドレス + hppre_flg: str # 院内処方フラグ + expre_flg: str # 院外処方フラグ + trial_flg: str # 治験の実施フラグ + trial_cont_count: str # 治験の実施_契約件数 + trial_whet_from: str # 治験の実施_期間自 + trial_whet_to: str # 治験の実施_期間至 + equipment_flg: str # 保有する施設設備フラグ + cos_disease_flg: str # 対応することができる疾患・治療の内容フラグ + cos_surgery: str # 対応することができる短期滞在手術フラグ + specialclinic_flg: str # 専門外来フラグ + establishment_flg: str # 地域医療連携体制_窓口設置フラグ + critical_flg: str # 地域医療連携体制_地域連携パスフラグ + cop_system: str # 入院診療計画策定時における院内の連携体制 + sys_exists_flg: str # オーダリングシステム_有無フラグ + sys_inspection: str # オーダリングシステム_検査 + sys_prescription: str # オーダリングシステム_処方 + sys_reserv: str # オーダリングシステム_予約 + icduse_flg: str # ICDコード利用フラグ + echart_flg: str # 電子カルテフラク + fulltime_flg: str # 専任従事者フラグ + fulltime_count: str # 専任従事者数 + ge_patient_avg: str # 病床患者数平均(一般) + mt_patient_avg: str # 病床患者数平均(療養) + mc_patient_avg: str # 病床患者数平均(療養(医療)) + ca_patient_avg: str # 病床患者数平均(療養(介護)) + pys_patient_avg: str # 病床患者数平均(精神) + tub_patient_avg: str # 病床患者数平均(結核) + inf_patient_avg: str # 病床患者数平均(感染症) + patient_avg_sum: str # 病床患者数平均(全体) + patient_avg_from: str # 病床患者数平均_期間自(病床種別) + patient_avg_to: str # 病床患者数平均_期間至(病床種別) + cl_patient_avg: str # 患者数平均(外来) + cl_patient_avg_from: str # 病床患者数平均_期間自(外来) + cl_patient_avg_to: str # 病床患者数平均_期間至(外来) + hm_patient_avg: str # 患者数平均(在宅) + hm_patient_avg_from: str # 病床患者数平均_期間自(在宅) + hm_patient_avg_to: str # 病床患者数平均_期間至(在宅) + ge_patient_ex: str # 患者数延数(一般) + mt_patient_ex: str # 患者数延数(療養) + mc_patient_ex: str # 病床患者数平均(療養(医療)) + ca_patient_ex: str # 病床患者数平均(療養(介護)) + pys_patient_ex: str # 患者数延数(精神) + tub_patient_ex: str # 患者数延数(結核) + inf_patient_ex: str # 患者数延数(感染症) + patient_ex_sum: str # 患者数延数(全体) + patient_ex_from: str # 患者数延数_期間自(病床種別) + patient_ex_to: str # 患者数延数_期間至(病床種別) + cl_patient_ex: str # 患者数延数(外来) + cl_patient_ex_from: str # 患者数延数_期間自(外来) + cl_patient_ex_to: str # 患者数延数_期間至(外来) + hm_patient_ex: str # 患者数延数(在宅) + hm_patient_ex_from: str # 患者数延数_期間自(在宅) + hm_patient_ex_to: str # 患者数延数_期間至(在宅) + ge_stay_avg: str # 平均在院日数(一般) + mt_stay_avg: str # 平均在院日数(療養) + mc_stay_avg: str # 平均在院日数(療養(医療)) + ca_stay_avg: str # 平均在院日数(療養(介護)) + pys_stay_avg: str # 平均在院日数(精神) + tub_stay_avg: str # 平均在院日数(結核) + inf_stay_avg: str # 平均在院日数(感染症) + stay_avg_sum: str # 平均在院日数(全体) + stay_avg_from: str # 平均在院日数_期間自 + stay_avg_to: str # 平均在院日数_期間至 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.adddel_div = record[5].strip() + self.maint_date = record[6].strip() + self.trn_date = record[7].strip() + self.info_date = record[8].strip() + self.home_page = record[9].strip() + self.hppre_flg = record[10].strip() + self.expre_flg = record[11].strip() + self.trial_flg = record[12].strip() + self.trial_cont_count = record[13].strip() + self.trial_whet_from = record[14].strip() + self.trial_whet_to = record[15].strip() + self.equipment_flg = record[16].strip() + self.cos_disease_flg = record[17].strip() + self.cos_surgery = record[18].strip() + self.specialclinic_flg = record[19].strip() + self.establishment_flg = record[20].strip() + self.critical_flg = record[21].strip() + self.cop_system = record[22].strip() + self.sys_exists_flg = record[23].strip() + self.sys_inspection = record[24].strip() + self.sys_prescription = record[25].strip() + self.sys_reserv = record[26].strip() + self.icduse_flg = record[27].strip() + self.echart_flg = record[28].strip() + self.fulltime_flg = record[29].strip() + self.fulltime_count = record[30].strip() + self.ge_patient_avg = record[31].strip() + self.mt_patient_avg = record[32].strip() + self.mc_patient_avg = record[33].strip() + self.ca_patient_avg = record[34].strip() + self.pys_patient_avg = record[35].strip() + self.tub_patient_avg = record[36].strip() + self.inf_patient_avg = record[37].strip() + self.patient_avg_sum = record[38].strip() + self.patient_avg_from = record[39].strip() + self.patient_avg_to = record[40].strip() + self.cl_patient_avg = record[41].strip() + self.cl_patient_avg_from = record[42].strip() + self.cl_patient_avg_to = record[43].strip() + self.hm_patient_avg = record[44].strip() + self.hm_patient_avg_from = record[45].strip() + self.hm_patient_avg_to = record[46].strip() + self.ge_patient_ex = record[47].strip() + self.mt_patient_ex = record[48].strip() + self.mc_patient_ex = record[49].strip() + self.ca_patient_ex = record[50].strip() + self.pys_patient_ex = record[51].strip() + self.tub_patient_ex = record[52].strip() + self.inf_patient_ex = record[53].strip() + self.patient_ex_sum = record[54].strip() + self.patient_ex_from = record[55].strip() + self.patient_ex_to = record[56].strip() + self.cl_patient_ex = record[57].strip() + self.cl_patient_ex_from = record[58].strip() + self.cl_patient_ex_to = record[59].strip() + self.hm_patient_ex = record[60].strip() + self.hm_patient_ex_from = record[61].strip() + self.hm_patient_ex_to = record[62].strip() + self.ge_stay_avg = record[63].strip() + self.mt_stay_avg = record[64].strip() + self.mc_stay_avg = record[65].strip() + self.ca_stay_avg = record[66].strip() + self.pys_stay_avg = record[67].strip() + self.tub_stay_avg = record[68].strip() + self.inf_stay_avg = record[69].strip() + self.stay_avg_sum = record[70].strip() + self.stay_avg_from = record[71].strip() + self.stay_avg_to = record[72].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index c6c8bc68..95f6ecc7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -30,6 +30,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \ ComDrMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \ ComDrSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_base_mapper import \ + ComPrefcMedBaseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -53,7 +55,7 @@ COM_TABLE_LIST = { # COM_専門分野 "511": ComSpFieldMapper, # COM_都道府県医療機能情報(基本) - "132": NullMapper, + "132": ComPrefcMedBaseMapper, # COM_都道府県医療機能情報(施設設備) "133": NullMapper, # COM_都道府県医療機能情報(疾患治療) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 8390096f..375ed954 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -28,13 +28,13 @@ class TestComAlmaMapper: # setup self.db = database self.db.connect() - self.db.begin() + # self.db.begin() # testing yield # teardown - self.db.rollback() + # self.db.rollback() self.db.disconnect() def test_insert_record(self): diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv new file mode 100644 index 00000000..fc160243 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_delete.csv @@ -0,0 +1,3 @@ +"132","00","9900194","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","00","9901649","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","00","9929798","","B","1","20170406","20170408","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv new file mode 100644 index 00000000..81dd90b1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_insert.csv @@ -0,0 +1,6 @@ +"132","00","9900146","","A","2","20141113","20141114","20140624","","1","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20130401","20140331","49.8","20130401","20140331","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331" +"132","00","9900194","","A","2","20141113","20141114","20121101","http://www.hospital.misawa.aomori.jp/","1","1","1","0","20100401","20110331","1","1","1","1","1","1","1","1","1","1","1","1","1","1","3","205.4","","","","","","","","20100401","20110331","468.1","20100401","20110331","8.3","20100401","20110331","","","","","","","","","","","","","","","","","18.7","","","","","","0.0","","20100401","20110331" +"132","00","9901649","","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","00","9901679","","A","2","20141113","20141114","20140627","http://www.kai-sei-kai.com/","1","","","","","","1","1","1","1","1","","1","","","","","1","","1","2","58.5","229.2","102.3","131.3","","","","","20130401","20140331","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","20.4","641.3","533.2","749.2","","","","","20130401","20140331" +"132","00","9929798","","A","2","20141113","20141114","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331" +"132","99","9999999","99","A","2","20141113","20141114","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv new file mode 100644 index 00000000..7c7c790a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/com_prefc_med_base_update.csv @@ -0,0 +1,6 @@ +"132","00","9900146","","B","","20141113","20141114","@","http://yahoo.co.jp/","@","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","","55.5","66.6","","","","","","","" +"132","00","9900194","","B","","20141113","20141114","20121101","http://www.hospital.misawa.aomori.jp/","","","@","","","","","","","","@","","@","@","","","","","","","","@","","","","","","","","","","@","","","@","","","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","@","","","","","","","","","" +"132","00","9901679","","B","","20141113","20141114","20171009","","","","","","","","@","@","@","@","","","","","1","2","3","5","4","@","","@","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","@","","","","","","","","","" +"132","99","9999999","99","A","2","20141113","20141114","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","" +"132","99","9999999","00","A","2","20141113","20141114","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@","@" +"132","99","9999999","11","A","2","20141113","20141114","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv new file mode 100644 index 00000000..71ec28ac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_delete.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","NULL","NULL","NULL","NULL","1","1","1","1","NULL","1","NULL","NULL","NULL","NULL","NULL","1","1","1","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv new file mode 100644 index 00000000..36e197b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/db_com_prefc_med_base_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","20140624","","1","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20130401","20140331","49.8","20130401","20140331","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","1","0","20100401","20110331","1","1","1","1","1","1","1","1","1","1","1","1","1","1","3","205.4","","","","","","","","20100401","20110331","468.1","20100401","20110331","8.3","20100401","20110331","","","","","","","","","","","","","","","","","18.7","","","","","","0.0","","20100401","20110331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20140627","http://www.kai-sei-kai.com/","1","","","","","","1","1","1","1","1","","1","","","","","1","","1","2","58.5","229.2","102.3","131.3","","","","","20130401","20140331","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","20.4","641.3","533.2","749.2","","","","","20130401","20140331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"99999999900","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" +"99999999911","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv new file mode 100644 index 00000000..8c2f6318 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_delete.csv @@ -0,0 +1,3 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/11 21:20:37","clsComPrefcMedBase" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv new file mode 100644 index 00000000..306d8b30 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_insert.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","20140624","","1","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20130401","20140331","49.8","20130401","20140331","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","1","0","20100401","20110331","1","1","1","1","1","1","1","1","1","1","1","1","1","1","3","205.4","","","","","","","","20100401","20110331","468.1","20100401","20110331","8.3","20100401","20110331","","","","","","","","","","","","","","","","","18.7","","","","","","0.0","","20100401","20110331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009901679","20140627","http://www.kai-sei-kai.com/","1","","","","","","1","1","1","1","1","","1","","","","","1","","1","2","58.5","229.2","102.3","131.3","","","","","20130401","20140331","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","20.4","641.3","533.2","749.2","","","","","20130401","20140331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2023/05/09 20:39:15","com_prefc_med_base_mapper","2023/05/09 20:39:15","com_prefc_med_base_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv new file mode 100644 index 00000000..032b6891 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/expect_com_prefc_med_base_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","info_date","home_page","hppre_flg","expre_flg","trial_flg","trial_contcount","trialwhet_from","trialwhet_to","equipment_flg","cos_disease_flg","cos_surgery","specialclinic_flg","establishment_flg","critical_flg","cop_system","sys_exists_flg","sys_inspection","sys_prescription","sys_reserv","icduse_flg","echart_flg","fulltime_flg","fulltime_count","ge_patient_avg","mt_patient_avg","mc_patient_avg","ca_patient_avg","pys_patient_avg","tub_patient_avg","inf_patient_avg","patient_avg_sum","patient_avg_from","patient_avg_to","cl_patient_avg","cl_patient_avg_from","cl_patient_avg_to","hm_patient_avg","hm_patient_avg_from","hm_patient_avg_to","ge_patient_ex","mt_patient_ex","mc_patient_ex","ca_patient_ex","pys_patient_ex","tub_patient_ex","inf_patient_ex","patient_ex_sum","patient_ex_from","patient_ex_to","cl_patient_ex","cl_patient_ex_from","cl_patient_ex_to","hm_patient_ex","hm_patient_ex_from","hm_patient_ex_to","ge_stay_avg","mt_stay_avg","mc_stay_avg","ca_stay_avg","pys_stay_avg","tub_stay_avg","inf_stay_avg","stay_avg_sum","stay_avg_from","stay_avg_to","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","NULL","http://yahoo.co.jp/","NULL","","","","","","1","1","","","","","","","","","","","","","","18.8","","","","","","","","20171009","20171009","55.5","","","","","","","","","","","","","","","","","","","","","","39.3","","","","","","","","20130401","20140331","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 11:49:28","com_prefc_med_base_mapper" +"009900194","20121101","http://www.hospital.misawa.aomori.jp/","1","1","NULL","NULL","NULL","NULL","1","1","1","1","NULL","1","NULL","NULL","NULL","NULL","NULL","1","1","1","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","111","112","113","114","115","116","117","118","20170101","20171010","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 14:52:00","com_prefc_med_base_mapper" +"009901649","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"009901679","20171009","http://www.kai-sei-kai.com/","1","","","","","","NULL","NULL","NULL","NULL","1","","1","","","","","5","4","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","96.0","20130401","20140331","","","","","","","","","","","","","","","","","","","","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2023/05/09 11:49:28","com_prefc_med_base_mapper" +"009929798","20130611","http://www.urakawa.jrc.or.jp/","1","","","","","","1","1","1","1","1","","1","","","","","","","1","1","114.6","46.6","","","39.9","0.0","0.0","","20120401","20130331","481.6","20120401","20130331","16.2","20120401","20130331","","","","","","","","","","","","","","","","","15.6","555.3","","","169.4","0.0","0.0","","20120401","20130331","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2017/10/08 20:57:12","clsComPrefcMedBase" +"99999999900","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","20130331","20230510","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999911","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedBase","2000/05/09 20:39:15","com_prefc_med_base_mapper" +"99999999999","20130611","aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbz","1","2","3","4444","20150101","20160101","1","1","1","1","1","1","1","1","1","1","1","1","1","1","123","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","12345.6","20120401","20130331","12345.6","20120401","20130331","123467","123467","123467","123467","123467","123467","123467","123467","20200202","20200202","123467","20200202","20200202","123467","20200202","20200202","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","12345.6","20120401","20130331","20130331","NULL","NULL","NULL","NULL","NULL","2000/05/09 20:39:15","aaaaa","2000/05/09 20:39:15","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py new file mode 100644 index 00000000..ab6fca06 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py @@ -0,0 +1,196 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_base_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedBaseMapper: + """レイアウト区分132: COM_都道府県医療機能情報(基本)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_insert.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_base_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_base', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_update.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(基本)テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_base_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_base', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_base_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_base', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_base_mapper.ComPrefcMedBaseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_base_mapper.ComPrefcMedBaseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_delete.csv')) + primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From dbbe67bb7ed50789cd8da91c6bc6b5c9be3cb89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 10 May 2023 15:09:17 +0900 Subject: [PATCH 241/962] =?UTF-8?q?=E3=83=AB=E3=83=BC=E3=83=97=E3=81=AE?= =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 111 +++++++----------- 1 file changed, 45 insertions(+), 66 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index 70df59e1..a09f4361 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -868,28 +868,17 @@ class ComInstAttMapper(UltmarcTableMapper): # 疾患別リハビリテーション料 if len(self.record.rehabilitation_flag) > 0: set_clauses.append('rehabilitation_flag = :rehabilitation_flag') - set_clauses.append('rehabilitation_code01= :rehabilitation_code01') - set_clauses.append('rehabilitation_code02= :rehabilitation_code02') - set_clauses.append('rehabilitation_code03= :rehabilitation_code03') - set_clauses.append('rehabilitation_code04= :rehabilitation_code04') - set_clauses.append('rehabilitation_code05= :rehabilitation_code05') - set_clauses.append('rehabilitation_code06= :rehabilitation_code06') - set_clauses.append('rehabilitation_code07= :rehabilitation_code07') - set_clauses.append('rehabilitation_code08= :rehabilitation_code08') - set_clauses.append('rehabilitation_code09= :rehabilitation_code09') - set_clauses.append('rehabilitation_code10= :rehabilitation_code10') - if self.record.rehabilitation_flag == '@': + # 項目クリア判断 + is_aggregate_item_clear = self.record.rehabilitation_flag == '@' + if is_aggregate_item_clear: self.query_parameter['rehabilitation_flag'] = None - self.query_parameter['rehabilitation_code01'] = None - self.query_parameter['rehabilitation_code02'] = None - self.query_parameter['rehabilitation_code03'] = None - self.query_parameter['rehabilitation_code04'] = None - self.query_parameter['rehabilitation_code05'] = None - self.query_parameter['rehabilitation_code06'] = None - self.query_parameter['rehabilitation_code07'] = None - self.query_parameter['rehabilitation_code08'] = None - self.query_parameter['rehabilitation_code09'] = None - self.query_parameter['rehabilitation_code10'] = None + # 10個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) + for i in range(1, 11): + num = str(i).zfill(2) # 2桁で0埋め + setting_item_name = f'rehabilitation_code{num}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None # 麻酔管理料 if len(self.record.anesthetizing_manage_flag) > 0: @@ -1120,66 +1109,56 @@ class ComInstAttMapper(UltmarcTableMapper): # 先進医療実施医療機関 if len(self.record.hiadhp_flag) > 0: set_clauses.append('hiadhpflag = :hiadhp_flag') + # 項目クリア判断 + is_aggregate_item_clear = self.record.hiadhp_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['hiadhp_flag'] = None # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 41): - num = str(i) - setting_item = 'hiadhpcode' + num + ' = :hiadhp_code' + num - set_clauses.append(setting_item) - setting_item = 'hiadhpkind' + num + ' = :hiadhp_kind' + num - set_clauses.append(setting_item) - - if self.record.hiadhp_flag == '@': - self.query_parameter['hiadhp_flag'] = None - - # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) - for i in range(1, 41): - num = str(i) - setting_item = 'hiadhp_code' + num - self.query_parameter[setting_item] = None - setting_item = 'hiadhp_kind' + num - self.query_parameter[setting_item] = None + setting_db_name_code = f'hiadhpcode{i}' + setting_dn_name_kind = f'hiadhpkind{i}' + setting_item_name_code = f'hiadhp_code{i}' + setting_item_name_kind = f'hiadhp_kind{i}' + set_clauses.append(f'{setting_db_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_dn_name_kind} = :{setting_item_name_kind}') + if is_aggregate_item_clear: + self.query_parameter[setting_item_name_code] = None + self.query_parameter[setting_item_name_kind] = None # 先端医療実施医療機関 if len(self.record.hitechhp_flag) > 0: set_clauses.append('hitechhpflag = :hitechhp_flag') - + # 項目クリア判断 + is_aggregate_item_clear = self.record.hitechhp_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['hitechhp_flag'] = None # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 21): - num = str(i) - setting_item = 'hitechhpkind' + num + ' = :hitechhp_kind' + num - set_clauses.append(setting_item) - - if self.record.hitechhp_flag == '@': - self.query_parameter['hitechhp_flag'] = None - - # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) - for i in range(1, 21): - num = str(i) - setting_item = 'hitechhp_kind' + num - self.query_parameter[setting_item] = None + setting_db_name = f'hitechhpkind{i}' + setting_item_name = f'hitechhp_kind{i}' + set_clauses.append(f'{setting_db_name} = :{setting_item_name}') + if is_aggregate_item_clear: + self.query_parameter[setting_item_name] = None # 政策医療 if len(self.record.policy_medical_flag) > 0: set_clauses.append('policymedical_flag = :policy_medical_flag') - + # 項目クリア判断 + is_aggregate_item_clear = self.record.policy_medical_flag == '@' + if is_aggregate_item_clear: + self.query_parameter['policy_medical_flag'] = None # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 21): num = str(i).zfill(2) # 2桁で0埋め - setting_item = 'policymedical_code' + num + ' = :policy_medical_code' + num - set_clauses.append(setting_item) - setting_item = 'policymedical_content' + num + ' = :policy_medical_content' + num - set_clauses.append(setting_item) - - if self.record.policy_medical_flag == '@': - self.query_parameter['policy_medical_flag'] = None - - # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) - for i in range(1, 21): - num = str(i).zfill(2) # 2桁で0埋め - setting_item = 'policy_medical_code' + num - self.query_parameter[setting_item] = None - setting_item = 'policy_medical_content' + num - self.query_parameter[setting_item] = None + setting_db_name_code = f'policymedical_code{num}' + setting_db_name_content = f'policymedical_content{num}' + setting_item_name_code = f'policy_medical_code{num}' + setting_item_name_content = f'policy_medical_content{num}' + set_clauses.append(f'{setting_db_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_db_name_content} = :{setting_item_name_content}') + if is_aggregate_item_clear: + self.query_parameter[setting_item_name_code] = None + self.query_parameter[setting_item_name_content] = None # 訪問看護ステーション if len(self.record.visitcarest_flag) > 0: From ba04227f5fb04bb1dc4751269c7eddcbafb92587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 10 May 2023 15:11:31 +0900 Subject: [PATCH 242/962] =?UTF-8?q?=E6=96=87=E8=A8=80=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_inst_att_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index a09f4361..cbb80e20 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -4,7 +4,7 @@ from src.batch.ultmarc.utmp_tables.tables.com_inst_att import ComInstAtt class ComInstAttMapper(UltmarcTableMapper): - """レイアウト区分111: COM_施設属税 登録処理""" + """レイアウト区分111: COM_施設属性 登録処理""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ From 3a98128b11766e8eb081dcc53a41cb2335b20c2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 10 May 2023 15:34:16 +0900 Subject: [PATCH 243/962] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90(?= =?UTF-8?q?=E4=BB=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/create_dcf_inst_merge.py | 138 ++++++++++++++++++ .../batch/laundering/create_dcf_inst_merge.py | 15 -- 2 files changed, 138 insertions(+), 15 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py delete mode 100644 ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py new file mode 100644 index 00000000..f567ebae --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py @@ -0,0 +1,138 @@ +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ作成') + + +def exec(): + """DCF施設統合マスタ作成""" + + # アルトマーク取込が行われていない場合は処理をスキップする + # if not batch_context.is_ultmarc_imported: + # logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') + + db = Database.get_instance() + try: + db.connect() + db.begin() + logger.debug('DCF施設統合マスタ作成処理開始') + # COM施設からDCF施設統合マスタに登録 + _insert_dcf_inst_merge_from_com_ci(db) + db.commit() + logger.debug('DCF施設統合マスタ作成処理終了') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _insert_dcf_inst_merge_from_com_ci(db: Database): + # com_ciにdcf_inst_mergeにinsert + creater = 'batchuser' + enabledFlg = 'Y' + + try: + result = db.execute_select( + """ + SELECT + ci.dcf_dsf_inst_cd AS dcf_dsf_inst_cd, + ci.form_inst_name_kanji AS form_inst_name_kanji, + ci.dup_opp_cd AS dup_opp_cd, + ( + SELECT + dupci.form_inst_name_kanji + FROM + src05.com_inst AS dupci + WHERE + dupci.dcf_dsf_inst_cd = ci.dup_opp_cd + ) AS dup_inst_name_kanji, + DATE_FORMAT(DATE_ADD((SELECT syor_date FROM src05.hdke_tbl),INTERVAL 1 MONTH),'%Y%m') AS sys_update_date + FROM + src05.com_inst AS ci + WHERE + CHAR_LENGTH(ci.dup_opp_cd) > 0 + AND ci.delete_sche_reason_cd = 'D' + AND ci.abolish_ymd IS NULL + AND DATE_FORMAT(ci.sys_update_date, '%Y%m%d') BETWEEN (SELECT syor_date FROM src05.hdke_tbl) AND DATE_FORMAT(SYSDATE(), '%Y%m%d') + AND NOT EXISTS ( + SELECT + dim.dcf_inst_cd + FROM + src05.dcf_inst_merge AS dim + WHERE + dim.dcf_inst_cd = ci.dcf_dsf_inst_cd + ) + AND ( + EXISTS ( + SELECT + eci.inst_cd + FROM + src05.emp_chg_inst AS eci + WHERE + eci.inst_cd = ci.dcf_dsf_inst_cd + ) + OR ( + SELECT + sl.inst_cd + FROM + src05.sales_lau AS sl + WHERE + sl.inst_cd = ci.dcf_dsf_inst_cd + ) + ) + """ + ) + logger.debug('重複コードがあるデータの取得に成功') + except Exception as e: + logger.debug('重複コードがあるデータの取得に失敗') + raise e + + if len(result) == 0: + logger.info('重複コードがあるデータはありません') + return + + values_clauses = [] + params = {'enabledFlg': enabledFlg, 'creater': creater, "updater": creater} + clauses_no = 0 + for row in result: + dcfInstCdArr = f'dcfInstCd{clauses_no}' + dupOppCdArr = f'dupOppCd{clauses_no}' + tekiyoMonthArr = f'tekiyoMonth{clauses_no}' + placeholders = f'(:{dcfInstCdArr}, :{dupOppCdArr}, :{tekiyoMonthArr}, :enabledFlg, :creater, SYSDATE(), :updater, SYSDATE())' + values_clauses.append(placeholders) + params[dcfInstCdArr] = row['dcf_dsf_inst_cd'] + params[dupOppCdArr] = row['dup_opp_cd'] + params[tekiyoMonthArr] = row['sys_update_date'] + clauses_no += 1 + + insert_sql = f""" + INSERT INTO + src05.dcf_inst_merge ( + dcf_inst_cd, + dup_opp_cd, + tekiyo_month, + enabled_flg, + creater, + create_date, + updater, + update_date + ) VALUES + {','.join(values_clauses)} + """ + + try: + elapsed_time = ElapsedTime() + res = db.execute(insert_sql, params) + logging_sql(logger, insert_sql) + logger.info(f'COM施設からDCF施設統合マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('COM施設からDCF施設統合マスタの登録に失敗') + raise e + + return diff --git a/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py deleted file mode 100644 index 974aa329..00000000 --- a/ecs/jskult-batch-daily/src/batch/laundering/create_dcf_inst_merge.py +++ /dev/null @@ -1,15 +0,0 @@ -from src.batch.common.batch_context import BatchContext -from src.logging.get_logger import get_logger - -batch_context = BatchContext.get_instance() -logger = get_logger('DCF施設統合マスタ作成') - - -def exec(): - """DCF施設統合マスタ作成""" - - # アルトマーク取込が行われていない場合は処理をスキップする - if not batch_context.is_ultmarc_imported: - logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') - - pass From a0e858e93f141965c9351c71a8acbd1ea0664ae1 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 10 May 2023 16:50:44 +0900 Subject: [PATCH 244/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/calendar_wholestocksaler_file.py | 32 ------------ .../src/batch/vjsk/vjsk_data_load_manager.py | 15 ++++-- .../src/batch/vjsk/vjsk_importer.py | 50 ++++++++++--------- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 22 ++++++++ 4 files changed, 59 insertions(+), 60 deletions(-) delete mode 100644 ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py diff --git a/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py b/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py deleted file mode 100644 index ba687514..00000000 --- a/ecs/jskult-batch-daily/src/batch/common/calendar_wholestocksaler_file.py +++ /dev/null @@ -1,32 +0,0 @@ -from src.system_var import constants - - -class CalendarWholwSalerStockFile: - """V実消化卸在庫データ連携日ファイル""" - - __calendar_file_lines: list[str] - - def __init__(self, calendar_file_path): - with open(calendar_file_path) as f: - self.__calendar_file_lines: list[str] = f.readlines() - - def compare_date(self, date_str: str) -> bool: - """与えられた日付がV実消化卸在庫データ連携日ファイル内に含まれているかどうか - V実消化卸在庫データ連携日ファイル内の日付はyyyy/mm/ddで書かれている前提 - コメント(#)が含まれている行は無視される - - Args: - date_str (str): yyyy/mm/dd文字列 - - Returns: - bool: 含まれていればTrue - """ - for calendar_date in self.__calendar_file_lines: - # コメント行が含まれている場合はスキップ - if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: - continue - - if date_str in calendar_date: - return True - - return False diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index c63ac962..909bd041 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -7,7 +7,7 @@ logger = get_logger('V実消化データ取込(DB登録)') mapper = VjskRecvFileMapper() -class JjskDataLoadManager: +class VjskDataLoadManager: def __init__(self): pass @@ -15,7 +15,9 @@ class JjskDataLoadManager: logger.debug(f"_import_to_db start (src_file_name : {src_file_name}, condkey : {condkey})") db = Database.get_instance() + data_name = mapper.get_data_name(condkey) table_name_org = mapper.get_org_table(condkey) + table_name_src = mapper.get_src_table(condkey) upsert_sql = mapper.get_upsert_sql(condkey) try: @@ -28,14 +30,17 @@ class JjskDataLoadManager: sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org} " \ " FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" result = db.execute(sql, {"src_file_name": src_file_name}) - logger.info(f'tsvデータをorgテーブルにLOAD : 件数({result.rowcount})') + logger.debug(sql) + logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') # org→srcにinsert select db.begin() + logger.debug(upsert_sql) db.execute(upsert_sql) - # TODO: insert+select 実質10件なのに、resultのrowcountは20件になってしまう ※sqlalchemyの仕様 - # https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount - logger.info('orgテーブルをsrcテーブルにUPSERT') + # MEMO: insert+selectの結果件数は、LOAD結果と必ず等しいので、executeの結果件数はログ出力しない + # MEMO: insert+select 実質10件なのに、result.rowcountは20件になってしまう ※sqlalchemyの仕様 + # MEMO: https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount + logger.info(f'{table_name_org}を{table_name_src}にUPSERT') db.commit() except Exception as e: diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index d667416e..31c42874 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -1,8 +1,7 @@ from src.aws.s3 import ConfigBucket, VjskRecieveBucket from src.batch.common.batch_context import BatchContext -from src.batch.common.calendar_wholestocksaler_file import \ - CalendarWholwSalerStockFile -from src.batch.vjsk.vjsk_data_load_manager import JjskDataLoadManager +from src.batch.common.calendar_file import CalendarFile +from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -102,7 +101,7 @@ def _check_received_files(): logger.debug('_check_received_files done') - return True + return def _import_file_to_db(): @@ -132,49 +131,49 @@ def _import_file_to_db(): # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) if batch_context.is_import_target_vjsk_stockslipdata: - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) # DB登録 卸販売データ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) # DB登録 卸組織変換マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) # DB登録 施設統合マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) # DB登録 卸マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) # DB登録 卸ホールディングスマスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) # DB登録 施設マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) # DB登録 メーカー卸組織展開表 - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) # DB登録 取引区分マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) # DB登録 製品マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) # DB登録 製品価格マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) # DB登録 卸得意先情報マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) # DB登録 MDBコード変換マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) # DB登録 生物由来データ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) # DB登録 製造ロット番号マスタ - JjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) + VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) logger.debug('_import_file_to_db done') @@ -187,10 +186,10 @@ def _determine_today_is_stockslipdata_target(): today = batch_context.syor_date # S3バケット上の設定ファイル「V実消化卸在庫データ連携日ファイル」をローカルストレージにdownloadする - config_file_path = ConfigBucket().download_wholesaler_stock_list() + wholesaler_stock_list_file_path = ConfigBucket().download_wholesaler_stock_list() # 設定ファイル「V実消化卸在庫データ連携日ファイル」の定義内容を取得する - target_days = CalendarWholwSalerStockFile(config_file_path) + target_days = CalendarFile(wholesaler_stock_list_file_path) # 処理日付が、設定ファイル「V実消化卸在庫データ連携日ファイル」の定義に該当するかを判定する ret = target_days.compare_date(today) @@ -205,6 +204,11 @@ def exec(): """V実消化データ取込処理""" logger.info('Start Jitsusyouka Torikomi PGM.') + # 非営業日なら何もせず終了 + if batch_context.is_not_business_day: + logger.debug('非営業日なので処理をスキップ') + return + # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる logger.debug('卸在庫データ取込対象日であるかを判定') batch_context.is_import_target_vjsk_stockslipdata = _determine_today_is_stockslipdata_target() @@ -219,7 +223,7 @@ def exec(): _check_received_files() except BatchOperationException as e: - logger.error('受領したV実消化データファイルに未受領もものがあります') + logger.debug('受領したV実消化データファイルに未受領もものがあります') raise e logger.debug('V実消化データファイル受領チェック:終了') @@ -229,7 +233,7 @@ def exec(): # S3バケットにある受領済のV実消化データファイルをデータベースに登録する _import_file_to_db() except Exception as e: - logger.error(f'データベース登録失敗 {e}') + logger.debug(f'データベース登録失敗 {e}') raise e logger.debug('V実消化データ取込:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 726e927c..2ba87909 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -18,6 +18,7 @@ class VjskRecvFileMapper: CONDKEY_BIO_SLIP_DATA = "BIO_SLIP_DATA" # 生物由来データ CONDKEY_LOT_NUM_MST = "LOT_NUM_MST" # ロットマスタデータ + _KEY_DATA_NAME = "data_name" _KEY_FILE_PREFIX = "file_prefix" _KEY_FILE_SUFFIX = "file_suffix" _KEY_ORG_TABLE = "org_table" @@ -26,6 +27,7 @@ class VjskRecvFileMapper: _VJSK_INTERFACE_MAPPING = { # 販売実績データ CONDKEY_SLIP_DATA: { + _KEY_DATA_NAME: "販売実績データ", _KEY_FILE_PREFIX: "slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.sales", @@ -294,6 +296,7 @@ class VjskRecvFileMapper: # V卸ホールディングスマスタ CONDKEY_HLD_MST: { + _KEY_DATA_NAME: "V卸ホールディングスマスタ", _KEY_FILE_PREFIX: "hld_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.hld_mst_v", @@ -346,6 +349,7 @@ class VjskRecvFileMapper: # V卸マスタ CONDKEY_WHS_MST: { + _KEY_DATA_NAME: "V卸マスタ", _KEY_FILE_PREFIX: "whs_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whs_mst_v", @@ -413,6 +417,7 @@ class VjskRecvFileMapper: # Vメーカー卸組織展開表 CONDKEY_MKR_ORG_HORIZON: { + _KEY_DATA_NAME: "Vメーカー卸組織展開表", _KEY_FILE_PREFIX: "mkr_org_horizon_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", @@ -570,6 +575,7 @@ class VjskRecvFileMapper: # V卸組織変換マスタ CONDKEY_ORG_CNV_MST: { + _KEY_DATA_NAME: "V卸組織変換マスタ", _KEY_FILE_PREFIX: "org_cnv_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.org_cnv_mst_v", @@ -622,6 +628,7 @@ class VjskRecvFileMapper: # V取引区分マスタ CONDKEY_TRAN_KBN_MST: { + _KEY_DATA_NAME: "V取引区分マスタ", _KEY_FILE_PREFIX: "tran_kbn_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", @@ -668,6 +675,7 @@ class VjskRecvFileMapper: # V施設マスタ CONDKEY_FCL_MST: { + _KEY_DATA_NAME: "V施設マスタ", _KEY_FILE_PREFIX: "fcl_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.fcl_mst_v", @@ -759,6 +767,7 @@ class VjskRecvFileMapper: # V製品マスタ CONDKEY_PHM_PRD_MST: { + _KEY_DATA_NAME: "V製品マスタ", _KEY_FILE_PREFIX: "phm_prd_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.phm_prd_mst_v", @@ -862,6 +871,7 @@ class VjskRecvFileMapper: # V製品価格マスタ CONDKEY_PHM_PRICE_MST: { + _KEY_DATA_NAME: "V製品価格マスタ", _KEY_FILE_PREFIX: "phm_price_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.phm_price_mst_v", @@ -911,6 +921,7 @@ class VjskRecvFileMapper: # V施設統合マスタ CONDKEY_VOP_HCO_MERGE: { + _KEY_DATA_NAME: "V施設統合マスタ", _KEY_FILE_PREFIX: "vop_hco_merge_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.vop_hco_merge_v", @@ -942,6 +953,7 @@ class VjskRecvFileMapper: # V卸得意先情報マスタ CONDKEY_WHS_CUSTOMER_MST: { + _KEY_DATA_NAME: "V卸得意先情報マスタ", _KEY_FILE_PREFIX: "whs_customer_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whs_customer_mst_v", @@ -1012,6 +1024,7 @@ class VjskRecvFileMapper: # MDBコード変換表 CONDKEY_MDB_CONV_MST: { + _KEY_DATA_NAME: "MDBコード変換表", _KEY_FILE_PREFIX: "mdb_conv_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", @@ -1055,6 +1068,7 @@ class VjskRecvFileMapper: # 卸在庫データ CONDKEY_STOCK_SLIP_DATA: { + _KEY_DATA_NAME: "卸在庫データ", _KEY_FILE_PREFIX: "stock_slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.whole_stock", @@ -1161,6 +1175,7 @@ class VjskRecvFileMapper: # 生物由来データ CONDKEY_BIO_SLIP_DATA: { + _KEY_DATA_NAME: "生物由来データ", _KEY_FILE_PREFIX: "bio_slip_data_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.bio_sales", @@ -1414,6 +1429,7 @@ class VjskRecvFileMapper: # ロットマスタデータ CONDKEY_LOT_NUM_MST: { + _KEY_DATA_NAME: "ロットマスタデータ", _KEY_FILE_PREFIX: "lot_num_mst_", _KEY_FILE_SUFFIX: ".tsv", _KEY_ORG_TABLE: "org05.lot_num_mst", @@ -1450,6 +1466,12 @@ class VjskRecvFileMapper: }, } + def get_data_name(self, condkey: str) -> str: + ret = None + if condkey in self._VJSK_INTERFACE_MAPPING: + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_DATA_NAME) + return ret + def get_file_prefix(self, condkey: str) -> str: ret = None if condkey in self._VJSK_INTERFACE_MAPPING: From 3215a92e70a5f755670c88fa9ef830494e2ceb24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 10 May 2023 18:31:59 +0900 Subject: [PATCH 245/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/create_dcf_inst_merge.py | 53 +++++++++++++++---- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py index f567ebae..301c9337 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 @@ -13,8 +13,8 @@ def exec(): """DCF施設統合マスタ作成""" # アルトマーク取込が行われていない場合は処理をスキップする - # if not batch_context.is_ultmarc_imported: - # logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') db = Database.get_instance() try: @@ -22,8 +22,10 @@ def exec(): db.begin() logger.debug('DCF施設統合マスタ作成処理開始') # COM施設からDCF施設統合マスタに登録 - _insert_dcf_inst_merge_from_com_ci(db) - db.commit() + (success, result) = _insert_dcf_inst_merge_from_com_ci(db) + # DCF施設統合マスタが追加ログを出力する + if success: + _output_dcf_inst_merge_log(result) logger.debug('DCF施設統合マスタ作成処理終了') except Exception as e: db.rollback() @@ -32,11 +34,8 @@ def exec(): db.disconnect() -def _insert_dcf_inst_merge_from_com_ci(db: Database): +def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: # com_ciにdcf_inst_mergeにinsert - creater = 'batchuser' - enabledFlg = 'Y' - try: result = db.execute_select( """ @@ -95,16 +94,16 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database): if len(result) == 0: logger.info('重複コードがあるデータはありません') - return + return False, None values_clauses = [] - params = {'enabledFlg': enabledFlg, 'creater': creater, "updater": creater} + params = {} clauses_no = 0 for row in result: dcfInstCdArr = f'dcfInstCd{clauses_no}' dupOppCdArr = f'dupOppCd{clauses_no}' tekiyoMonthArr = f'tekiyoMonth{clauses_no}' - placeholders = f'(:{dcfInstCdArr}, :{dupOppCdArr}, :{tekiyoMonthArr}, :enabledFlg, :creater, SYSDATE(), :updater, SYSDATE())' + placeholders = f'(:{dcfInstCdArr}, :{dupOppCdArr}, :{tekiyoMonthArr}, "Y", CURRENT_USER(), SYSDATE(), CURRENT_USER(), SYSDATE())' values_clauses.append(placeholders) params[dcfInstCdArr] = row['dcf_dsf_inst_cd'] params[dupOppCdArr] = row['dup_opp_cd'] @@ -130,9 +129,41 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database): 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施設統合マスタの登録に失敗') raise e + return (True, result) + + +def _output_dcf_inst_merge_log(result: list[dict]): + sys_update_date = result[0]['sys_update_date'] + setYearMonth = '{set_year}年{set_month}月'.format( + set_year=sys_update_date[0:4], + set_month=sys_update_date[-2:] + ) + + add_dct_inst_list = [] + for row in result: + add_dct_inst_list.append("""DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}""".format( + dcf_dsf_inst_cd=row['dcf_dsf_inst_cd'], + form_inst_name_kanji=row['form_inst_name_kanji'], + dup_opp_cd=row['dup_opp_cd'], + dup_inst_name_kanji=row['dup_inst_name_kanji'] + ) + ) + + add_dct_inst_list = '\n'.join(add_dct_inst_list) + logger.info( + f"""[NOTICE]DCF施設統合マスタが追加されました。 +********************************************************** +適用月度{setYearMonth} +********************************************************** +{add_dct_inst_list} +********************************************************** +合計 {len(result)}件 + """ + ) return From fe8d0fd14295ed63eaafd937eb5bb0167aca16d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 08:39:34 +0900 Subject: [PATCH 246/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E6=96=BD=E8=A8=AD=E8=A8=AD=E5=82=99=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_prefc_med_equpment_mapper.py | 104 ++++++++ .../utmp_tables/tables/com_prefc_med_base.py | 2 +- .../tables/com_prefc_med_equpment.py | 30 +++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_prefc_med_equpment/__init__.py | 0 .../com_prefc_med_equpment_delete.csv | 3 + .../com_prefc_med_equpment_insert.csv | 6 + .../com_prefc_med_equpment_update.csv | 7 + ...b_com_prefc_med_equpment_before_delete.csv | 7 + ...b_com_prefc_med_equpment_before_update.csv | 8 + .../expect_com_prefc_med_equpment_delete.csv | 4 + .../expect_com_prefc_med_equpment_insert.csv | 7 + .../expect_com_prefc_med_equpment_update.csv | 8 + .../test_com_prefc_med_equpment_mapper.py | 250 ++++++++++++++++++ 14 files changed, 438 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py new file mode 100644 index 00000000..dcfd8114 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py @@ -0,0 +1,104 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_equpment import ComPrefcMedEqupment + + +class ComPrefcMedEqupmentMapper(UltmarcTableMapper): + """レイアウト区分132: COM_都道府県医療機能情報(施設設備)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_equpment + ( + dcf_dsf_inst_cd, + equipment_code, + bednum, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :equipment_code, + :bed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_equpment + SET + bednum = :bed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + equipment_code = :equipment_code + """ + + record: ComPrefcMedEqupment + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedEqupment) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + # 病床数が空の場合は更新しない + if self.record.bed_num is not None: + if self.record.bed_num == '@': + self.query_parameter['bed_num'] = None + return self.UPDATE_QUERY + else: + return None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py index 56b64a7b..fd9342ff 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_base.py @@ -5,7 +5,7 @@ class ComPrefcMedBase(UltmarcTable): """レイアウト区分132: COM_都道府県医療機能情報(基本)""" dcfhp_id: str # DCFコード(レコードID) dcfhp_code: str # DCFコード(施設コード) - dcfhp_yobi: str # DCFコード(予備)10/8asa + dcfhp_yobi: str # DCFコード(予備) maint_flag: str # 修正区分 adddel_div: str # 予備/追加削除区分 maint_date: str # メンテナンス年月日 diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py new file mode 100644 index 00000000..7b592b9d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py @@ -0,0 +1,30 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedEqupment(UltmarcTable): + """レイアウト区分132: COM_都道府県医療機能情報(施設設備)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + equipment_code: str # 施設設備コード + bed_num: str # 病床数 + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4] + self.equipment_code = record[5].strip() + self.adddel_div = record[6] + self.bed_num = record[9] + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.bed_num = self.bed_num if len(self.bed_num) > 0 else None + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 95f6ecc7..f3fbcef1 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -32,6 +32,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper i ComDrSosietyMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_base_mapper import \ ComPrefcMedBaseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_equpment_mapper import \ + ComPrefcMedEqupmentMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -57,7 +59,7 @@ COM_TABLE_LIST = { # COM_都道府県医療機能情報(基本) "132": ComPrefcMedBaseMapper, # COM_都道府県医療機能情報(施設設備) - "133": NullMapper, + "133": ComPrefcMedEqupmentMapper, # COM_都道府県医療機能情報(疾患治療) "134": NullMapper, # COM_都道府県医療機能情報(短期滞在手術) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv new file mode 100644 index 00000000..826055ac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_delete.csv @@ -0,0 +1,3 @@ +"133","00","9900194","","B","008","1","20141211","20141213","" +"133","00","9901649","","B","009","1","20141211","20141213","" +"133","00","9901679","","B","015","1","20141211","20141213","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv new file mode 100644 index 00000000..b5882b97 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_insert.csv @@ -0,0 +1,6 @@ +"133","00","9900146","","A","012","2","20141113","20141114","0" +"133","00","9900194","","A","008","2","20141113","20141114","32" +"133","00","9901649","","A","009","2","20141113","20141114","3" +"133","00","9901679","","A","015","2","20141113","20141114","" +"133","00","9904439","","A","006","2","20141113","20141114","" +"133","00","9929798","","A","010","2","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv new file mode 100644 index 00000000..24111866 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/com_prefc_med_equpment_update.csv @@ -0,0 +1,7 @@ +"133","99","9999999","99","B","111","2","20141113","20141114","" +"133","00","9900146","","B","012","2","20141113","20141114","@" +"133","00","9900194","","B","008","2","20141113","20141114","@" +"133","00","9901649","","B","009","2","20141113","20141114","6" +"133","00","9901679","","B","015","2","20141113","20141114","@" +"133","00","9904439","","B","006","2","20141113","20141114","10" +"133","00","9929798","","B","010","2","20141113","20141114","9" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv new file mode 100644 index 00000000..94330b4f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009900194","008","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009901649","009","6","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009901679","015","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009904439","006","10","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009929798","010","9","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv new file mode 100644 index 00000000..c75a3f89 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/db_com_prefc_med_equpment_before_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009900194","008","32","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009901649","009","3","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009901679","015","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009904439","006","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"009929798","010","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" +"99999999999","111","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv new file mode 100644 index 00000000..32074199 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009904439","006","10","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" +"009929798","010","9","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/11 21:20:37","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv new file mode 100644 index 00000000..caad9918 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_insert.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","0","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009900194","008","32","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009901649","009","3","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009901679","015","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009904439","006","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" +"009929798","010","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 10:57:12","com_prefc_med_equpment_mapper","2023/05/10 10:57:12","com_prefc_med_equpment_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv new file mode 100644 index 00000000..88bc0809 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/expect_com_prefc_med_equpment_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","equipment_code","bednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","012","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009900194","008","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009901649","009","6","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009901679","015","NULL","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009904439","006","10","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"009929798","010","9","20171008","20230510","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2023/05/10 11:49:28","com_prefc_med_equpment_mapper" +"99999999999","111","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedEquipment","2017/10/08 20:57:12","clsPrefcMedEquipment" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py new file mode 100644 index 00000000..78d33244 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py @@ -0,0 +1,250 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_equpment_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedEqupmentMapper: + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_equpment_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_equpment', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(施設設備)テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_equpment_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_equpment', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_equpment_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_equpment', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_equpment_mapper.ComPrefcMedEqupmentMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_equpment + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + equipment_code = :equipment_code + """ + for param_dcf_dsf_inst_cd, param_equipment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_equipment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_equipment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['bednum', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name == 'bednum': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 6e9c43ecd8a291ffd48efc9cf0d6b1ba62342174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 09:30:16 +0900 Subject: [PATCH 247/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E7=96=BE=E6=82=A3=E6=B2=BB=E7=99=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_prefc_med_dis_treat_mapper.py | 104 ++++++++ .../tables/com_prefc_med_dis_treat.py | 30 +++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_prefc_med_dis_treat/__init__.py | 0 .../com_prefc_med_dis_treat_delete.csv | 4 + .../com_prefc_med_dis_treat_insert.csv | 8 + .../com_prefc_med_dis_treat_update.csv | 7 + ..._com_prefc_med_dis_treat_before_delete.csv | 8 + ..._com_prefc_med_dis_treat_before_update.csv | 9 + .../expect_com_prefc_med_dis_treat_delete.csv | 4 + .../expect_com_prefc_med_dis_treat_insert.csv | 10 + .../expect_com_prefc_med_dis_treat_update.csv | 9 + .../test_com_prefc_med_dis_treat_mapper.py | 251 ++++++++++++++++++ 13 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py new file mode 100644 index 00000000..42193466 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py @@ -0,0 +1,104 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_dis_treat import ComPrefcMedDisTreat + + +class ComPrefcMedDisTreatMapper(UltmarcTableMapper): + """レイアウト区分133: COM_都道府県医療機能情報(疾患治療)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_dis_treat + ( + dcf_dsf_inst_cd, + treatment_code, + pre_num, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :treatment_code, + :pre_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_dis_treat + SET + pre_num = :pre_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + treatment_code = :treatment_code + """ + + record: ComPrefcMedDisTreat + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedDisTreat) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + # 病床数が空の場合は更新しない + if self.record.pre_num is not None: + if self.record.pre_num == '@': + self.query_parameter['pre_num'] = None + return self.UPDATE_QUERY + else: + return None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py new file mode 100644 index 00000000..4e458fe0 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py @@ -0,0 +1,30 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedDisTreat(UltmarcTable): + """レイアウト区分133: COM_都道府県医療機能情報(疾患治療)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + treatment_code: str # 疾患治療コード + pre_num: str # 前年比 + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1] + self.dcfhp_code = record[2] + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4] + self.treatment_code = record[5].strip() + self.adddel_div = record[6] + self.pre_num = record[9] + + # smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.pre_num = self.pre_num if len(self.pre_num) > 0 else None + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index f3fbcef1..38dc1f27 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -34,6 +34,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_base_mapp ComPrefcMedBaseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_equpment_mapper import \ ComPrefcMedEqupmentMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_dis_treat_mapper import \ + ComPrefcMedDisTreatMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -61,7 +63,7 @@ COM_TABLE_LIST = { # COM_都道府県医療機能情報(施設設備) "133": ComPrefcMedEqupmentMapper, # COM_都道府県医療機能情報(疾患治療) - "134": NullMapper, + "134": ComPrefcMedDisTreatMapper, # COM_都道府県医療機能情報(短期滞在手術) "135": NullMapper, # COM_都道府県医療機能情報(専門外来) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv new file mode 100644 index 00000000..7c1bb46d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_delete.csv @@ -0,0 +1,4 @@ +"134","00","9901679","","B","2201","1","20141205","20141213","" +"134","00","9901679","","B","2203","1","20141205","20141213","" +"134","00","9901679","","B","2205","1","20141205","20141213","" +"134","00","9901679","","B","2206","1","20141205","20141213","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv new file mode 100644 index 00000000..037c46c2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_insert.csv @@ -0,0 +1,8 @@ +"134","00","9901649","","A","1001","2","20141113","20141114","" +"134","00","9901679","","A","2201","2","20141113","20141114","" +"134","00","9901679","","A","2203","2","20141113","20141114","2789" +"134","00","9901679","","A","2205","2","20141113","20141114","2033" +"134","00","9901679","","A","2206","2","20141113","20141114","0" +"134","00","9929798","","A","0902","2","20141113","20141114","" +"134","00","9929798","","A","0915","2","20141113","20141114","" +"134","99","9999999","99","A","1234","2","20141113","20141114","123456" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv new file mode 100644 index 00000000..4def216a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/com_prefc_med_dis_treat_update.csv @@ -0,0 +1,7 @@ +"134","00","9901649","","B","1001","2","20141113","20141114","0" +"134","00","9901679","","B","2203","2","20141113","20141114","@" +"134","00","9901679","","B","2205","2","20141113","20141114","1987" +"134","00","9901679","","B","2206","2","20141113","20141114","@" +"134","00","9929798","","B","0902","2","20141113","20141114","0" +"134","00","9929798","","B","0915","2","20141113","20141114","543" +"134","99","9999999","99","B","1234","2","20141113","20141114","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv new file mode 100644 index 00000000..ee268b92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_delete.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2205","1987","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009901679","2206","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0902","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0915","543","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv new file mode 100644 index 00000000..aad1b86e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/db_com_prefc_med_dis_treat_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","2789","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2205","2033","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2206","0","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009929798","0902","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009929798","0915","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"99999999999","1234","1111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv new file mode 100644 index 00000000..d1d53673 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_delete.csv @@ -0,0 +1,4 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0902","0","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" +"009929798","0915","543","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/11 21:20:37","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv new file mode 100644 index 00000000..819aa6dc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_insert.csv @@ -0,0 +1,10 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2201","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2203","2789","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2205","2033","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009901679","2206","0","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0902","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0915","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"009929798","0915","NULL","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" +"99999999999","1234","123456","20230510","NULL","NULL","NULL","NULL","NULL","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper","2023/05/10 20:57:12","com_prefc_med_dis_treat_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv new file mode 100644 index 00000000..baecab69 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/expect_com_prefc_med_dis_treat_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","treatment_code","pre_num","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","1001","0","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2201","NULL","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" +"009901679","2203","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2205","1987","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009901679","2206","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009929798","0902","0","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"009929798","0915","543","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2023/05/11 08:49:28","com_prefc_med_dis_treat_mapper" +"99999999999","1234","1111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedDisTreat","2017/10/08 20:57:12","clsPrefcMedDisTreat" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py new file mode 100644 index 00000000..a0597df9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py @@ -0,0 +1,251 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_dis_treat_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedDisTreatMapper: + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_dis_treat_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_dis_treat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(疾患治療)テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_dis_treat_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_dis_treat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_dis_treat_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_dis_treat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_dis_treat_mapper.ComPrefcMedDisTreatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_dis_treat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + treatment_code = :treatment_code + """ + for param_dcf_dsf_inst_cd, param_treatment_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_treatment_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_treatment_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['pre_num', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name == 'pre_num': + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 83fcca6bbc42a31fbd81879b07546464d8900a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 09:51:51 +0900 Subject: [PATCH 248/962] =?UTF-8?q?=E3=83=AB=E3=83=BC=E3=83=97=E5=87=A6?= =?UTF-8?q?=E7=90=86=E4=BF=AE=E6=AD=A3=EF=BC=88=E5=A4=89=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_att_mapper.py | 305 +++++----- .../utmp_tables/tables/com_inst_att.py | 560 +++++++++--------- 2 files changed, 430 insertions(+), 435 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index cbb80e20..f1b52afd 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -478,148 +478,148 @@ class ComInstAttMapper(UltmarcTableMapper): :sphealth_exploration, :sphealth_guidance, :hiadhp_flag, - :hiadhp_code1, - :hiadhp_kind1, - :hiadhp_code2, - :hiadhp_kind2, - :hiadhp_code3, - :hiadhp_kind3, - :hiadhp_code4, - :hiadhp_kind4, - :hiadhp_code5, - :hiadhp_kind5, - :hiadhp_code6, - :hiadhp_kind6, - :hiadhp_code7, - :hiadhp_kind7, - :hiadhp_code8, - :hiadhp_kind8, - :hiadhp_code9, - :hiadhp_kind9, - :hiadhp_code10, - :hiadhp_kind10, - :hiadhp_code11, - :hiadhp_kind11, - :hiadhp_code12, - :hiadhp_kind12, - :hiadhp_code13, - :hiadhp_kind13, - :hiadhp_code14, - :hiadhp_kind14, - :hiadhp_code15, - :hiadhp_kind15, - :hiadhp_code16, - :hiadhp_kind16, - :hiadhp_code17, - :hiadhp_kind17, - :hiadhp_code18, - :hiadhp_kind18, - :hiadhp_code19, - :hiadhp_kind19, - :hiadhp_code20, - :hiadhp_kind20, - :hiadhp_code21, - :hiadhp_kind21, - :hiadhp_code22, - :hiadhp_kind22, - :hiadhp_code23, - :hiadhp_kind23, - :hiadhp_code24, - :hiadhp_kind24, - :hiadhp_code25, - :hiadhp_kind25, - :hiadhp_code26, - :hiadhp_kind26, - :hiadhp_code27, - :hiadhp_kind27, - :hiadhp_code28, - :hiadhp_kind28, - :hiadhp_code29, - :hiadhp_kind29, - :hiadhp_code30, - :hiadhp_kind30, - :hiadhp_code31, - :hiadhp_kind31, - :hiadhp_code32, - :hiadhp_kind32, - :hiadhp_code33, - :hiadhp_kind33, - :hiadhp_code34, - :hiadhp_kind34, - :hiadhp_code35, - :hiadhp_kind35, - :hiadhp_code36, - :hiadhp_kind36, - :hiadhp_code37, - :hiadhp_kind37, - :hiadhp_code38, - :hiadhp_kind38, - :hiadhp_code39, - :hiadhp_kind39, - :hiadhp_code40, - :hiadhp_kind40, + :hiadhpcode1, + :hiadhpkind1, + :hiadhpcode2, + :hiadhpkind2, + :hiadhpcode3, + :hiadhpkind3, + :hiadhpcode4, + :hiadhpkind4, + :hiadhpcode5, + :hiadhpkind5, + :hiadhpcode6, + :hiadhpkind6, + :hiadhpcode7, + :hiadhpkind7, + :hiadhpcode8, + :hiadhpkind8, + :hiadhpcode9, + :hiadhpkind9, + :hiadhpcode10, + :hiadhpkind10, + :hiadhpcode11, + :hiadhpkind11, + :hiadhpcode12, + :hiadhpkind12, + :hiadhpcode13, + :hiadhpkind13, + :hiadhpcode14, + :hiadhpkind14, + :hiadhpcode15, + :hiadhpkind15, + :hiadhpcode16, + :hiadhpkind16, + :hiadhpcode17, + :hiadhpkind17, + :hiadhpcode18, + :hiadhpkind18, + :hiadhpcode19, + :hiadhpkind19, + :hiadhpcode20, + :hiadhpkind20, + :hiadhpcode21, + :hiadhpkind21, + :hiadhpcode22, + :hiadhpkind22, + :hiadhpcode23, + :hiadhpkind23, + :hiadhpcode24, + :hiadhpkind24, + :hiadhpcode25, + :hiadhpkind25, + :hiadhpcode26, + :hiadhpkind26, + :hiadhpcode27, + :hiadhpkind27, + :hiadhpcode28, + :hiadhpkind28, + :hiadhpcode29, + :hiadhpkind29, + :hiadhpcode30, + :hiadhpkind30, + :hiadhpcode31, + :hiadhpkind31, + :hiadhpcode32, + :hiadhpkind32, + :hiadhpcode33, + :hiadhpkind33, + :hiadhpcode34, + :hiadhpkind34, + :hiadhpcode35, + :hiadhpkind35, + :hiadhpcode36, + :hiadhpkind36, + :hiadhpcode37, + :hiadhpkind37, + :hiadhpcode38, + :hiadhpkind38, + :hiadhpcode39, + :hiadhpkind39, + :hiadhpcode40, + :hiadhpkind40, :hitechhp_flag, - :hitechhp_kind1, - :hitechhp_kind2, - :hitechhp_kind3, - :hitechhp_kind4, - :hitechhp_kind5, - :hitechhp_kind6, - :hitechhp_kind7, - :hitechhp_kind8, - :hitechhp_kind9, - :hitechhp_kind10, - :hitechhp_kind11, - :hitechhp_kind12, - :hitechhp_kind13, - :hitechhp_kind14, - :hitechhp_kind15, - :hitechhp_kind16, - :hitechhp_kind17, - :hitechhp_kind18, - :hitechhp_kind19, - :hitechhp_kind20, + :hitechhpkind1, + :hitechhpkind2, + :hitechhpkind3, + :hitechhpkind4, + :hitechhpkind5, + :hitechhpkind6, + :hitechhpkind7, + :hitechhpkind8, + :hitechhpkind9, + :hitechhpkind10, + :hitechhpkind11, + :hitechhpkind12, + :hitechhpkind13, + :hitechhpkind14, + :hitechhpkind15, + :hitechhpkind16, + :hitechhpkind17, + :hitechhpkind18, + :hitechhpkind19, + :hitechhpkind20, :policy_medical_flag, - :policy_medical_code01, - :policy_medical_content01, - :policy_medical_code02, - :policy_medical_content02, - :policy_medical_code03, - :policy_medical_content03, - :policy_medical_code04, - :policy_medical_content04, - :policy_medical_code05, - :policy_medical_content05, - :policy_medical_code06, - :policy_medical_content06, - :policy_medical_code07, - :policy_medical_content07, - :policy_medical_code08, - :policy_medical_content08, - :policy_medical_code09, - :policy_medical_content09, - :policy_medical_code10, - :policy_medical_content10, - :policy_medical_code11, - :policy_medical_content11, - :policy_medical_code12, - :policy_medical_content12, - :policy_medical_code13, - :policy_medical_content13, - :policy_medical_code14, - :policy_medical_content14, - :policy_medical_code15, - :policy_medical_content15, - :policy_medical_code16, - :policy_medical_content16, - :policy_medical_code17, - :policy_medical_content17, - :policy_medical_code18, - :policy_medical_content18, - :policy_medical_code19, - :policy_medical_content19, - :policy_medical_code20, - :policy_medical_content20, + :policymedical_code01, + :policymedical_content01, + :policymedical_code02, + :policymedical_content02, + :policymedical_code03, + :policymedical_content03, + :policymedical_code04, + :policymedical_content04, + :policymedical_code05, + :policymedical_content05, + :policymedical_code06, + :policymedical_content06, + :policymedical_code07, + :policymedical_content07, + :policymedical_code08, + :policymedical_content08, + :policymedical_code09, + :policymedical_content09, + :policymedical_code10, + :policymedical_content10, + :policymedical_code11, + :policymedical_content11, + :policymedical_code12, + :policymedical_content12, + :policymedical_code13, + :policymedical_content13, + :policymedical_code14, + :policymedical_content14, + :policymedical_code15, + :policymedical_content15, + :policymedical_code16, + :policymedical_content16, + :policymedical_code17, + :policymedical_content17, + :policymedical_code18, + :policymedical_content18, + :policymedical_code19, + :policymedical_content19, + :policymedical_code20, + :policymedical_content20, :visitcarest_flag, :visitcarestation_id, :visitcarestation_code, @@ -1115,12 +1115,10 @@ class ComInstAttMapper(UltmarcTableMapper): self.query_parameter['hiadhp_flag'] = None # 40個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 41): - setting_db_name_code = f'hiadhpcode{i}' - setting_dn_name_kind = f'hiadhpkind{i}' - setting_item_name_code = f'hiadhp_code{i}' - setting_item_name_kind = f'hiadhp_kind{i}' - set_clauses.append(f'{setting_db_name_code} = :{setting_item_name_code}') - set_clauses.append(f'{setting_dn_name_kind} = :{setting_item_name_kind}') + setting_item_name_code = f'hiadhpcode{i}' + setting_item_name_kind = f'hiadhpkind{i}' + set_clauses.append(f'{setting_item_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_item_name_kind} = :{setting_item_name_kind}') if is_aggregate_item_clear: self.query_parameter[setting_item_name_code] = None self.query_parameter[setting_item_name_kind] = None @@ -1134,9 +1132,8 @@ class ComInstAttMapper(UltmarcTableMapper): self.query_parameter['hitechhp_flag'] = None # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 21): - setting_db_name = f'hitechhpkind{i}' - setting_item_name = f'hitechhp_kind{i}' - set_clauses.append(f'{setting_db_name} = :{setting_item_name}') + setting_item_name = f'hitechhpkind{i}' + set_clauses.append(f'{setting_item_name} = :{setting_item_name}') if is_aggregate_item_clear: self.query_parameter[setting_item_name] = None @@ -1150,12 +1147,10 @@ class ComInstAttMapper(UltmarcTableMapper): # 20個分の項目設定(rangeの第2引数の数字はループに含まれないため、+1を指定する) for i in range(1, 21): num = str(i).zfill(2) # 2桁で0埋め - setting_db_name_code = f'policymedical_code{num}' - setting_db_name_content = f'policymedical_content{num}' - setting_item_name_code = f'policy_medical_code{num}' - setting_item_name_content = f'policy_medical_content{num}' - set_clauses.append(f'{setting_db_name_code} = :{setting_item_name_code}') - set_clauses.append(f'{setting_db_name_content} = :{setting_item_name_content}') + setting_item_name_code = f'policymedical_code{num}' + setting_item_name_content = f'policymedical_content{num}' + set_clauses.append(f'{setting_item_name_code} = :{setting_item_name_code}') + set_clauses.append(f'{setting_item_name_content} = :{setting_item_name_content}') if is_aggregate_item_clear: self.query_parameter[setting_item_name_code] = None self.query_parameter[setting_item_name_content] = None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py index 90f02cd2..695b247f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_att.py @@ -157,148 +157,148 @@ class ComInstAtt(UltmarcTable): sphealth_exploration: str # 特定健康診査実施機 sphealth_guidance: str # 特定保健指導実施機 hiadhp_flag: str # 先端医療・高度医療技術実施医療機関フラグ - hiadhp_code1: str # 先端医療・高度医療技術実施医療機関1(コード) - hiadhp_kind1: str # 先端医療・高度医療技術実施医療機関1(区分) - hiadhp_code2: str # 先端医療・高度医療技術実施医療機関2(コード) - hiadhp_kind2: str # 先端医療・高度医療技術実施医療機関2(区分) - hiadhp_code3: str # 先端医療・高度医療技術実施医療機関3(コード) - hiadhp_kind3: str # 先端医療・高度医療技術実施医療機関3(区分) - hiadhp_code4: str # 先端医療・高度医療技術実施医療機関4(コード) - hiadhp_kind4: str # 先端医療・高度医療技術実施医療機関4(区分) - hiadhp_code5: str # 先端医療・高度医療技術実施医療機関5(コード) - hiadhp_kind5: str # 先端医療・高度医療技術実施医療機関5(区分) - hiadhp_code6: str # 先端医療・高度医療技術実施医療機関6(コード) - hiadhp_kind6: str # 先端医療・高度医療技術実施医療機関6(区分) - hiadhp_code7: str # 先端医療・高度医療技術実施医療機関7(コード) - hiadhp_kind7: str # 先端医療・高度医療技術実施医療機関7(区分) - hiadhp_code8: str # 先端医療・高度医療技術実施医療機関8(コード) - hiadhp_kind8: str # 先端医療・高度医療技術実施医療機関8(区分) - hiadhp_code9: str # 先端医療・高度医療技術実施医療機関9(コード) - hiadhp_kind9: str # 先端医療・高度医療技術実施医療機関9(区分) - hiadhp_code10: str # 先端医療・高度医療技術実施医療機関10(コード) - hiadhp_kind10: str # 先端医療・高度医療技術実施医療機関10(区分) - hiadhp_code11: str # 先端医療・高度医療技術実施医療機関11(コード) - hiadhp_kind11: str # 先端医療・高度医療技術実施医療機関11(区分) - hiadhp_code12: str # 先端医療・高度医療技術実施医療機関12(コード) - hiadhp_kind12: str # 先端医療・高度医療技術実施医療機関12(区分) - hiadhp_code13: str # 先端医療・高度医療技術実施医療機関13(コード) - hiadhp_kind13: str # 先端医療・高度医療技術実施医療機関13(区分) - hiadhp_code14: str # 先端医療・高度医療技術実施医療機関14(コード) - hiadhp_kind14: str # 先端医療・高度医療技術実施医療機関14(区分) - hiadhp_code15: str # 先端医療・高度医療技術実施医療機関15(コード) - hiadhp_kind15: str # 先端医療・高度医療技術実施医療機関15(区分) - hiadhp_code16: str # 先端医療・高度医療技術実施医療機関16(コード) - hiadhp_kind16: str # 先端医療・高度医療技術実施医療機関16(区分) - hiadhp_code17: str # 先端医療・高度医療技術実施医療機関17(コード) - hiadhp_kind17: str # 先端医療・高度医療技術実施医療機関17(区分) - hiadhp_code18: str # 先端医療・高度医療技術実施医療機関18(コード) - hiadhp_kind18: str # 先端医療・高度医療技術実施医療機関18(区分) - hiadhp_code19: str # 先端医療・高度医療技術実施医療機関19(コード) - hiadhp_kind19: str # 先端医療・高度医療技術実施医療機関19(区分) - hiadhp_code20: str # 先端医療・高度医療技術実施医療機関20(コード) - hiadhp_kind20: str # 先端医療・高度医療技術実施医療機関20(区分) - hiadhp_code21: str # 先端医療・高度医療技術実施医療機関21(コード) - hiadhp_kind21: str # 先端医療・高度医療技術実施医療機関21(区分) - hiadhp_code22: str # 先端医療・高度医療技術実施医療機関22(コード) - hiadhp_kind22: str # 先端医療・高度医療技術実施医療機関22(区分) - hiadhp_code23: str # 先端医療・高度医療技術実施医療機関23(コード) - hiadhp_kind23: str # 先端医療・高度医療技術実施医療機関23(区分) - hiadhp_code24: str # 先端医療・高度医療技術実施医療機関24(コード) - hiadhp_kind24: str # 先端医療・高度医療技術実施医療機関24(区分) - hiadhp_code25: str # 先端医療・高度医療技術実施医療機関25(コード) - hiadhp_kind25: str # 先端医療・高度医療技術実施医療機関25(区分) - hiadhp_code26: str # 先端医療・高度医療技術実施医療機関26(コード) - hiadhp_kind26: str # 先端医療・高度医療技術実施医療機関26(区分) - hiadhp_code27: str # 先端医療・高度医療技術実施医療機関27(コード) - hiadhp_kind27: str # 先端医療・高度医療技術実施医療機関27(区分) - hiadhp_code28: str # 先端医療・高度医療技術実施医療機関28(コード) - hiadhp_kind28: str # 先端医療・高度医療技術実施医療機関28(区分) - hiadhp_code29: str # 先端医療・高度医療技術実施医療機関29(コード) - hiadhp_kind29: str # 先端医療・高度医療技術実施医療機関29(区分) - hiadhp_code30: str # 先端医療・高度医療技術実施医療機関30(コード) - hiadhp_kind30: str # 先端医療・高度医療技術実施医療機関30(区分) - hiadhp_code31: str # 先端医療・高度医療技術実施医療機関31(コード) - hiadhp_kind31: str # 先端医療・高度医療技術実施医療機関31(区分) - hiadhp_code32: str # 先端医療・高度医療技術実施医療機関32(コード) - hiadhp_kind32: str # 先端医療・高度医療技術実施医療機関32(区分) - hiadhp_code33: str # 先端医療・高度医療技術実施医療機関33(コード) - hiadhp_kind33: str # 先端医療・高度医療技術実施医療機関33(区分) - hiadhp_code34: str # 先端医療・高度医療技術実施医療機関34(コード) - hiadhp_kind34: str # 先端医療・高度医療技術実施医療機関34(区分) - hiadhp_code35: str # 先端医療・高度医療技術実施医療機関35(コード) - hiadhp_kind35: str # 先端医療・高度医療技術実施医療機関35(区分) - hiadhp_code36: str # 先端医療・高度医療技術実施医療機関36(コード) - hiadhp_kind36: str # 先端医療・高度医療技術実施医療機関36(区分) - hiadhp_code37: str # 先端医療・高度医療技術実施医療機関37(コード) - hiadhp_kind37: str # 先端医療・高度医療技術実施医療機関37(区分) - hiadhp_code38: str # 先端医療・高度医療技術実施医療機関38(コード) - hiadhp_kind38: str # 先端医療・高度医療技術実施医療機関38(区分) - hiadhp_code39: str # 先端医療・高度医療技術実施医療機関39(コード) - hiadhp_kind39: str # 先端医療・高度医療技術実施医療機関39(区分) - hiadhp_code40: str # 先端医療・高度医療技術実施医療機関40(コード) - hiadhp_kind40: str # 先端医療・高度医療技術実施医療機関40(区分) + hiadhpcode1: str # 先端医療・高度医療技術実施医療機関1(コード) + hiadhpkind1: str # 先端医療・高度医療技術実施医療機関1(区分) + hiadhpcode2: str # 先端医療・高度医療技術実施医療機関2(コード) + hiadhpkind2: str # 先端医療・高度医療技術実施医療機関2(区分) + hiadhpcode3: str # 先端医療・高度医療技術実施医療機関3(コード) + hiadhpkind3: str # 先端医療・高度医療技術実施医療機関3(区分) + hiadhpcode4: str # 先端医療・高度医療技術実施医療機関4(コード) + hiadhpkind4: str # 先端医療・高度医療技術実施医療機関4(区分) + hiadhpcode5: str # 先端医療・高度医療技術実施医療機関5(コード) + hiadhpkind5: str # 先端医療・高度医療技術実施医療機関5(区分) + hiadhpcode6: str # 先端医療・高度医療技術実施医療機関6(コード) + hiadhpkind6: str # 先端医療・高度医療技術実施医療機関6(区分) + hiadhpcode7: str # 先端医療・高度医療技術実施医療機関7(コード) + hiadhpkind7: str # 先端医療・高度医療技術実施医療機関7(区分) + hiadhpcode8: str # 先端医療・高度医療技術実施医療機関8(コード) + hiadhpkind8: str # 先端医療・高度医療技術実施医療機関8(区分) + hiadhpcode9: str # 先端医療・高度医療技術実施医療機関9(コード) + hiadhpkind9: str # 先端医療・高度医療技術実施医療機関9(区分) + hiadhpcode10: str # 先端医療・高度医療技術実施医療機関10(コード) + hiadhpkind10: str # 先端医療・高度医療技術実施医療機関10(区分) + hiadhpcode11: str # 先端医療・高度医療技術実施医療機関11(コード) + hiadhpkind11: str # 先端医療・高度医療技術実施医療機関11(区分) + hiadhpcode12: str # 先端医療・高度医療技術実施医療機関12(コード) + hiadhpkind12: str # 先端医療・高度医療技術実施医療機関12(区分) + hiadhpcode13: str # 先端医療・高度医療技術実施医療機関13(コード) + hiadhpkind13: str # 先端医療・高度医療技術実施医療機関13(区分) + hiadhpcode14: str # 先端医療・高度医療技術実施医療機関14(コード) + hiadhpkind14: str # 先端医療・高度医療技術実施医療機関14(区分) + hiadhpcode15: str # 先端医療・高度医療技術実施医療機関15(コード) + hiadhpkind15: str # 先端医療・高度医療技術実施医療機関15(区分) + hiadhpcode16: str # 先端医療・高度医療技術実施医療機関16(コード) + hiadhpkind16: str # 先端医療・高度医療技術実施医療機関16(区分) + hiadhpcode17: str # 先端医療・高度医療技術実施医療機関17(コード) + hiadhpkind17: str # 先端医療・高度医療技術実施医療機関17(区分) + hiadhpcode18: str # 先端医療・高度医療技術実施医療機関18(コード) + hiadhpkind18: str # 先端医療・高度医療技術実施医療機関18(区分) + hiadhpcode19: str # 先端医療・高度医療技術実施医療機関19(コード) + hiadhpkind19: str # 先端医療・高度医療技術実施医療機関19(区分) + hiadhpcode20: str # 先端医療・高度医療技術実施医療機関20(コード) + hiadhpkind20: str # 先端医療・高度医療技術実施医療機関20(区分) + hiadhpcode21: str # 先端医療・高度医療技術実施医療機関21(コード) + hiadhpkind21: str # 先端医療・高度医療技術実施医療機関21(区分) + hiadhpcode22: str # 先端医療・高度医療技術実施医療機関22(コード) + hiadhpkind22: str # 先端医療・高度医療技術実施医療機関22(区分) + hiadhpcode23: str # 先端医療・高度医療技術実施医療機関23(コード) + hiadhpkind23: str # 先端医療・高度医療技術実施医療機関23(区分) + hiadhpcode24: str # 先端医療・高度医療技術実施医療機関24(コード) + hiadhpkind24: str # 先端医療・高度医療技術実施医療機関24(区分) + hiadhpcode25: str # 先端医療・高度医療技術実施医療機関25(コード) + hiadhpkind25: str # 先端医療・高度医療技術実施医療機関25(区分) + hiadhpcode26: str # 先端医療・高度医療技術実施医療機関26(コード) + hiadhpkind26: str # 先端医療・高度医療技術実施医療機関26(区分) + hiadhpcode27: str # 先端医療・高度医療技術実施医療機関27(コード) + hiadhpkind27: str # 先端医療・高度医療技術実施医療機関27(区分) + hiadhpcode28: str # 先端医療・高度医療技術実施医療機関28(コード) + hiadhpkind28: str # 先端医療・高度医療技術実施医療機関28(区分) + hiadhpcode29: str # 先端医療・高度医療技術実施医療機関29(コード) + hiadhpkind29: str # 先端医療・高度医療技術実施医療機関29(区分) + hiadhpcode30: str # 先端医療・高度医療技術実施医療機関30(コード) + hiadhpkind30: str # 先端医療・高度医療技術実施医療機関30(区分) + hiadhpcode31: str # 先端医療・高度医療技術実施医療機関31(コード) + hiadhpkind31: str # 先端医療・高度医療技術実施医療機関31(区分) + hiadhpcode32: str # 先端医療・高度医療技術実施医療機関32(コード) + hiadhpkind32: str # 先端医療・高度医療技術実施医療機関32(区分) + hiadhpcode33: str # 先端医療・高度医療技術実施医療機関33(コード) + hiadhpkind33: str # 先端医療・高度医療技術実施医療機関33(区分) + hiadhpcode34: str # 先端医療・高度医療技術実施医療機関34(コード) + hiadhpkind34: str # 先端医療・高度医療技術実施医療機関34(区分) + hiadhpcode35: str # 先端医療・高度医療技術実施医療機関35(コード) + hiadhpkind35: str # 先端医療・高度医療技術実施医療機関35(区分) + hiadhpcode36: str # 先端医療・高度医療技術実施医療機関36(コード) + hiadhpkind36: str # 先端医療・高度医療技術実施医療機関36(区分) + hiadhpcode37: str # 先端医療・高度医療技術実施医療機関37(コード) + hiadhpkind37: str # 先端医療・高度医療技術実施医療機関37(区分) + hiadhpcode38: str # 先端医療・高度医療技術実施医療機関38(コード) + hiadhpkind38: str # 先端医療・高度医療技術実施医療機関38(区分) + hiadhpcode39: str # 先端医療・高度医療技術実施医療機関39(コード) + hiadhpkind39: str # 先端医療・高度医療技術実施医療機関39(区分) + hiadhpcode40: str # 先端医療・高度医療技術実施医療機関40(コード) + hiadhpkind40: str # 先端医療・高度医療技術実施医療機関40(区分) hitechhp_flag: str # 先端医療機器フラグ - hitechhp_kind1: str # 先端医療機器1 - hitechhp_kind2: str # 先端医療機器2 - hitechhp_kind3: str # 先端医療機器3 - hitechhp_kind4: str # 先端医療機器4 - hitechhp_kind5: str # 先端医療機器5 - hitechhp_kind6: str # 先端医療機器6 - hitechhp_kind7: str # 先端医療機器7 - hitechhp_kind8: str # 先端医療機器8 - hitechhp_kind9: str # 先端医療機器9 - hitechhp_kind10: str # 先端医療機器10 - hitechhp_kind11: str # 先端医療機器11 - hitechhp_kind12: str # 先端医療機器12 - hitechhp_kind13: str # 先端医療機器13 - hitechhp_kind14: str # 先端医療機器14 - hitechhp_kind15: str # 先端医療機器15 - hitechhp_kind16: str # 先端医療機器16 - hitechhp_kind17: str # 先端医療機器17 - hitechhp_kind18: str # 先端医療機器18 - hitechhp_kind19: str # 先端医療機器19 - hitechhp_kind20: str # 先端医療機器20 + hitechhpkind1: str # 先端医療機器1 + hitechhpkind2: str # 先端医療機器2 + hitechhpkind3: str # 先端医療機器3 + hitechhpkind4: str # 先端医療機器4 + hitechhpkind5: str # 先端医療機器5 + hitechhpkind6: str # 先端医療機器6 + hitechhpkind7: str # 先端医療機器7 + hitechhpkind8: str # 先端医療機器8 + hitechhpkind9: str # 先端医療機器9 + hitechhpkind10: str # 先端医療機器10 + hitechhpkind11: str # 先端医療機器11 + hitechhpkind12: str # 先端医療機器12 + hitechhpkind13: str # 先端医療機器13 + hitechhpkind14: str # 先端医療機器14 + hitechhpkind15: str # 先端医療機器15 + hitechhpkind16: str # 先端医療機器16 + hitechhpkind17: str # 先端医療機器17 + hitechhpkind18: str # 先端医療機器18 + hitechhpkind19: str # 先端医療機器19 + hitechhpkind20: str # 先端医療機器20 policy_medical_flag: str # 政策医療フラグ - policy_medical_code01: str # 政策医療1(コード) - policy_medical_content01: str # 政策医療1(区分) - policy_medical_code02: str # 政策医療2(コード) - policy_medical_content02: str # 政策医療2(区分) - policy_medical_code03: str # 政策医療3(コード) - policy_medical_content03: str # 政策医療3(区分) - policy_medical_code04: str # 政策医療4(コード) - policy_medical_content04: str # 政策医療4(区分) - policy_medical_code05: str # 政策医療5(コード) - policy_medical_content05: str # 政策医療5(区分) - policy_medical_code06: str # 政策医療6(コード) - policy_medical_content06: str # 政策医療6(区分) - policy_medical_code07: str # 政策医療7(コード) - policy_medical_content07: str # 政策医療7(区分) - policy_medical_code08: str # 政策医療8(コード) - policy_medical_content08: str # 政策医療8(区分) - policy_medical_code09: str # 政策医療9(コード) - policy_medical_content09: str # 政策医療9(区分) - policy_medical_code10: str # 政策医療10(コード) - policy_medical_content10: str # 政策医療10(区分) - policy_medical_code11: str # 政策医療11(コード) - policy_medical_content11: str # 政策医療11(区分) - policy_medical_code12: str # 政策医療12(コード) - policy_medical_content12: str # 政策医療12(区分) - policy_medical_code13: str # 政策医療13(コード) - policy_medical_content13: str # 政策医療13(区分) - policy_medical_code14: str # 政策医療14(コード) - policy_medical_content14: str # 政策医療14(区分) - policy_medical_code15: str # 政策医療15(コード) - policy_medical_content15: str # 政策医療15(区分) - policy_medical_code16: str # 政策医療16(コード) - policy_medical_content16: str # 政策医療16(区分) - policy_medical_code17: str # 政策医療17(コード) - policy_medical_content17: str # 政策医療17(区分) - policy_medical_code18: str # 政策医療18(コード) - policy_medical_content18: str # 政策医療18(区分) - policy_medical_code19: str # 政策医療19(コード) - policy_medical_content19: str # 政策医療19(区分) - policy_medical_code20: str # 政策医療20(コード) - policy_medical_content20: str # 政策医療20(区分) + policymedical_code01: str # 政策医療1(コード) + policymedical_content01: str # 政策医療1(区分) + policymedical_code02: str # 政策医療2(コード) + policymedical_content02: str # 政策医療2(区分) + policymedical_code03: str # 政策医療3(コード) + policymedical_content03: str # 政策医療3(区分) + policymedical_code04: str # 政策医療4(コード) + policymedical_content04: str # 政策医療4(区分) + policymedical_code05: str # 政策医療5(コード) + policymedical_content05: str # 政策医療5(区分) + policymedical_code06: str # 政策医療6(コード) + policymedical_content06: str # 政策医療6(区分) + policymedical_code07: str # 政策医療7(コード) + policymedical_content07: str # 政策医療7(区分) + policymedical_code08: str # 政策医療8(コード) + policymedical_content08: str # 政策医療8(区分) + policymedical_code09: str # 政策医療9(コード) + policymedical_content09: str # 政策医療9(区分) + policymedical_code10: str # 政策医療10(コード) + policymedical_content10: str # 政策医療10(区分) + policymedical_code11: str # 政策医療11(コード) + policymedical_content11: str # 政策医療11(区分) + policymedical_code12: str # 政策医療12(コード) + policymedical_content12: str # 政策医療12(区分) + policymedical_code13: str # 政策医療13(コード) + policymedical_content13: str # 政策医療13(区分) + policymedical_code14: str # 政策医療14(コード) + policymedical_content14: str # 政策医療14(区分) + policymedical_code15: str # 政策医療15(コード) + policymedical_content15: str # 政策医療15(区分) + policymedical_code16: str # 政策医療16(コード) + policymedical_content16: str # 政策医療16(区分) + policymedical_code17: str # 政策医療17(コード) + policymedical_content17: str # 政策医療17(区分) + policymedical_code18: str # 政策医療18(コード) + policymedical_content18: str # 政策医療18(区分) + policymedical_code19: str # 政策医療19(コード) + policymedical_content19: str # 政策医療19(区分) + policymedical_code20: str # 政策医療20(コード) + policymedical_content20: str # 政策医療20(区分) visitcarest_flag: str # 訪問看護ステーションフラグ visitcarestation_id: str # 訪問看護ステーション_施設コード(レコードID) visitcarestation_code: str # 訪問看護ステーション_施設コード(施設コード) @@ -509,150 +509,150 @@ class ComInstAtt(UltmarcTable): self.sphealth_guidance = record[157].strip() self.hiadhp_flag = record[158].strip() - self.hiadhp_code1 = record[159].strip() - self.hiadhp_kind1 = record[160].strip() - self.hiadhp_code2 = record[161].strip() - self.hiadhp_kind2 = record[162].strip() - self.hiadhp_code3 = record[163].strip() - self.hiadhp_kind3 = record[164].strip() - self.hiadhp_code4 = record[165].strip() - self.hiadhp_kind4 = record[166].strip() - self.hiadhp_code5 = record[167].strip() - self.hiadhp_kind5 = record[168].strip() - self.hiadhp_code6 = record[169].strip() - self.hiadhp_kind6 = record[170].strip() - self.hiadhp_code7 = record[171].strip() - self.hiadhp_kind7 = record[172].strip() - self.hiadhp_code8 = record[173].strip() - self.hiadhp_kind8 = record[174].strip() - self.hiadhp_code9 = record[175].strip() - self.hiadhp_kind9 = record[176].strip() - self.hiadhp_code10 = record[177].strip() - self.hiadhp_kind10 = record[178].strip() - self.hiadhp_code11 = record[179].strip() - self.hiadhp_kind11 = record[180].strip() - self.hiadhp_code12 = record[181].strip() - self.hiadhp_kind12 = record[182].strip() - self.hiadhp_code13 = record[183].strip() - self.hiadhp_kind13 = record[184].strip() - self.hiadhp_code14 = record[185].strip() - self.hiadhp_kind14 = record[186].strip() - self.hiadhp_code15 = record[187].strip() - self.hiadhp_kind15 = record[188].strip() - self.hiadhp_code16 = record[189].strip() - self.hiadhp_kind16 = record[190].strip() - self.hiadhp_code17 = record[191].strip() - self.hiadhp_kind17 = record[192].strip() - self.hiadhp_code18 = record[193].strip() - self.hiadhp_kind18 = record[194].strip() - self.hiadhp_code19 = record[195].strip() - self.hiadhp_kind19 = record[196].strip() - self.hiadhp_code20 = record[197].strip() - self.hiadhp_kind20 = record[198].strip() - self.hiadhp_code21 = record[199].strip() - self.hiadhp_kind21 = record[200].strip() - self.hiadhp_code22 = record[201].strip() - self.hiadhp_kind22 = record[202].strip() - self.hiadhp_code23 = record[203].strip() - self.hiadhp_kind23 = record[204].strip() - self.hiadhp_code24 = record[205].strip() - self.hiadhp_kind24 = record[206].strip() - self.hiadhp_code25 = record[207].strip() - self.hiadhp_kind25 = record[208].strip() - self.hiadhp_code26 = record[209].strip() - self.hiadhp_kind26 = record[210].strip() - self.hiadhp_code27 = record[211].strip() - self.hiadhp_kind27 = record[212].strip() - self.hiadhp_code28 = record[213].strip() - self.hiadhp_kind28 = record[214].strip() - self.hiadhp_code29 = record[215].strip() - self.hiadhp_kind29 = record[216].strip() - self.hiadhp_code30 = record[217].strip() - self.hiadhp_kind30 = record[218].strip() - self.hiadhp_code31 = record[219].strip() - self.hiadhp_kind31 = record[220].strip() - self.hiadhp_code32 = record[221].strip() - self.hiadhp_kind32 = record[222].strip() - self.hiadhp_code33 = record[223].strip() - self.hiadhp_kind33 = record[224].strip() - self.hiadhp_code34 = record[225].strip() - self.hiadhp_kind34 = record[226].strip() - self.hiadhp_code35 = record[227].strip() - self.hiadhp_kind35 = record[228].strip() - self.hiadhp_code36 = record[229].strip() - self.hiadhp_kind36 = record[230].strip() - self.hiadhp_code37 = record[231].strip() - self.hiadhp_kind37 = record[232].strip() - self.hiadhp_code38 = record[233].strip() - self.hiadhp_kind38 = record[234].strip() - self.hiadhp_code39 = record[235].strip() - self.hiadhp_kind39 = record[236].strip() - self.hiadhp_code40 = record[237].strip() - self.hiadhp_kind40 = record[238].strip() + self.hiadhpcode1 = record[159].strip() + self.hiadhpkind1 = record[160].strip() + self.hiadhpcode2 = record[161].strip() + self.hiadhpkind2 = record[162].strip() + self.hiadhpcode3 = record[163].strip() + self.hiadhpkind3 = record[164].strip() + self.hiadhpcode4 = record[165].strip() + self.hiadhpkind4 = record[166].strip() + self.hiadhpcode5 = record[167].strip() + self.hiadhpkind5 = record[168].strip() + self.hiadhpcode6 = record[169].strip() + self.hiadhpkind6 = record[170].strip() + self.hiadhpcode7 = record[171].strip() + self.hiadhpkind7 = record[172].strip() + self.hiadhpcode8 = record[173].strip() + self.hiadhpkind8 = record[174].strip() + self.hiadhpcode9 = record[175].strip() + self.hiadhpkind9 = record[176].strip() + self.hiadhpcode10 = record[177].strip() + self.hiadhpkind10 = record[178].strip() + self.hiadhpcode11 = record[179].strip() + self.hiadhpkind11 = record[180].strip() + self.hiadhpcode12 = record[181].strip() + self.hiadhpkind12 = record[182].strip() + self.hiadhpcode13 = record[183].strip() + self.hiadhpkind13 = record[184].strip() + self.hiadhpcode14 = record[185].strip() + self.hiadhpkind14 = record[186].strip() + self.hiadhpcode15 = record[187].strip() + self.hiadhpkind15 = record[188].strip() + self.hiadhpcode16 = record[189].strip() + self.hiadhpkind16 = record[190].strip() + self.hiadhpcode17 = record[191].strip() + self.hiadhpkind17 = record[192].strip() + self.hiadhpcode18 = record[193].strip() + self.hiadhpkind18 = record[194].strip() + self.hiadhpcode19 = record[195].strip() + self.hiadhpkind19 = record[196].strip() + self.hiadhpcode20 = record[197].strip() + self.hiadhpkind20 = record[198].strip() + self.hiadhpcode21 = record[199].strip() + self.hiadhpkind21 = record[200].strip() + self.hiadhpcode22 = record[201].strip() + self.hiadhpkind22 = record[202].strip() + self.hiadhpcode23 = record[203].strip() + self.hiadhpkind23 = record[204].strip() + self.hiadhpcode24 = record[205].strip() + self.hiadhpkind24 = record[206].strip() + self.hiadhpcode25 = record[207].strip() + self.hiadhpkind25 = record[208].strip() + self.hiadhpcode26 = record[209].strip() + self.hiadhpkind26 = record[210].strip() + self.hiadhpcode27 = record[211].strip() + self.hiadhpkind27 = record[212].strip() + self.hiadhpcode28 = record[213].strip() + self.hiadhpkind28 = record[214].strip() + self.hiadhpcode29 = record[215].strip() + self.hiadhpkind29 = record[216].strip() + self.hiadhpcode30 = record[217].strip() + self.hiadhpkind30 = record[218].strip() + self.hiadhpcode31 = record[219].strip() + self.hiadhpkind31 = record[220].strip() + self.hiadhpcode32 = record[221].strip() + self.hiadhpkind32 = record[222].strip() + self.hiadhpcode33 = record[223].strip() + self.hiadhpkind33 = record[224].strip() + self.hiadhpcode34 = record[225].strip() + self.hiadhpkind34 = record[226].strip() + self.hiadhpcode35 = record[227].strip() + self.hiadhpkind35 = record[228].strip() + self.hiadhpcode36 = record[229].strip() + self.hiadhpkind36 = record[230].strip() + self.hiadhpcode37 = record[231].strip() + self.hiadhpkind37 = record[232].strip() + self.hiadhpcode38 = record[233].strip() + self.hiadhpkind38 = record[234].strip() + self.hiadhpcode39 = record[235].strip() + self.hiadhpkind39 = record[236].strip() + self.hiadhpcode40 = record[237].strip() + self.hiadhpkind40 = record[238].strip() self.hitechhp_flag = record[239].strip() - self.hitechhp_kind1 = record[240].strip() - self.hitechhp_kind2 = record[241].strip() - self.hitechhp_kind3 = record[242].strip() - self.hitechhp_kind4 = record[243].strip() - self.hitechhp_kind5 = record[244].strip() - self.hitechhp_kind6 = record[245].strip() - self.hitechhp_kind7 = record[246].strip() - self.hitechhp_kind8 = record[247].strip() - self.hitechhp_kind9 = record[248].strip() - self.hitechhp_kind10 = record[249].strip() - self.hitechhp_kind11 = record[250].strip() - self.hitechhp_kind12 = record[251].strip() - self.hitechhp_kind13 = record[252].strip() - self.hitechhp_kind14 = record[253].strip() - self.hitechhp_kind15 = record[254].strip() - self.hitechhp_kind16 = record[255].strip() - self.hitechhp_kind17 = record[256].strip() - self.hitechhp_kind18 = record[257].strip() - self.hitechhp_kind19 = record[258].strip() - self.hitechhp_kind20 = record[259].strip() + self.hitechhpkind1 = record[240].strip() + self.hitechhpkind2 = record[241].strip() + self.hitechhpkind3 = record[242].strip() + self.hitechhpkind4 = record[243].strip() + self.hitechhpkind5 = record[244].strip() + self.hitechhpkind6 = record[245].strip() + self.hitechhpkind7 = record[246].strip() + self.hitechhpkind8 = record[247].strip() + self.hitechhpkind9 = record[248].strip() + self.hitechhpkind10 = record[249].strip() + self.hitechhpkind11 = record[250].strip() + self.hitechhpkind12 = record[251].strip() + self.hitechhpkind13 = record[252].strip() + self.hitechhpkind14 = record[253].strip() + self.hitechhpkind15 = record[254].strip() + self.hitechhpkind16 = record[255].strip() + self.hitechhpkind17 = record[256].strip() + self.hitechhpkind18 = record[257].strip() + self.hitechhpkind19 = record[258].strip() + self.hitechhpkind20 = record[259].strip() self.policy_medical_flag = record[260].strip() - self.policy_medical_code01 = record[261].strip() - self.policy_medical_content01 = record[262].strip() - self.policy_medical_code02 = record[263].strip() - self.policy_medical_content02 = record[264].strip() - self.policy_medical_code03 = record[265].strip() - self.policy_medical_content03 = record[266].strip() - self.policy_medical_code04 = record[267].strip() - self.policy_medical_content04 = record[268].strip() - self.policy_medical_code05 = record[269].strip() - self.policy_medical_content05 = record[270].strip() - self.policy_medical_code06 = record[271].strip() - self.policy_medical_content06 = record[272].strip() - self.policy_medical_code07 = record[273].strip() - self.policy_medical_content07 = record[274].strip() - self.policy_medical_code08 = record[275].strip() - self.policy_medical_content08 = record[276].strip() - self.policy_medical_code09 = record[277].strip() - self.policy_medical_content09 = record[278].strip() - self.policy_medical_code10 = record[279].strip() - self.policy_medical_content10 = record[280].strip() - self.policy_medical_code11 = record[281].strip() - self.policy_medical_content11 = record[282].strip() - self.policy_medical_code12 = record[283].strip() - self.policy_medical_content12 = record[284].strip() - self.policy_medical_code13 = record[285].strip() - self.policy_medical_content13 = record[286].strip() - self.policy_medical_code14 = record[287].strip() - self.policy_medical_content14 = record[288].strip() - self.policy_medical_code15 = record[289].strip() - self.policy_medical_content15 = record[290].strip() - self.policy_medical_code16 = record[291].strip() - self.policy_medical_content16 = record[292].strip() - self.policy_medical_code17 = record[293].strip() - self.policy_medical_content17 = record[294].strip() - self.policy_medical_code18 = record[295].strip() - self.policy_medical_content18 = record[296].strip() - self.policy_medical_code19 = record[297].strip() - self.policy_medical_content19 = record[298].strip() - self.policy_medical_code20 = record[299].strip() - self.policy_medical_content20 = record[300].strip() + self.policymedical_code01 = record[261].strip() + self.policymedical_content01 = record[262].strip() + self.policymedical_code02 = record[263].strip() + self.policymedical_content02 = record[264].strip() + self.policymedical_code03 = record[265].strip() + self.policymedical_content03 = record[266].strip() + self.policymedical_code04 = record[267].strip() + self.policymedical_content04 = record[268].strip() + self.policymedical_code05 = record[269].strip() + self.policymedical_content05 = record[270].strip() + self.policymedical_code06 = record[271].strip() + self.policymedical_content06 = record[272].strip() + self.policymedical_code07 = record[273].strip() + self.policymedical_content07 = record[274].strip() + self.policymedical_code08 = record[275].strip() + self.policymedical_content08 = record[276].strip() + self.policymedical_code09 = record[277].strip() + self.policymedical_content09 = record[278].strip() + self.policymedical_code10 = record[279].strip() + self.policymedical_content10 = record[280].strip() + self.policymedical_code11 = record[281].strip() + self.policymedical_content11 = record[282].strip() + self.policymedical_code12 = record[283].strip() + self.policymedical_content12 = record[284].strip() + self.policymedical_code13 = record[285].strip() + self.policymedical_content13 = record[286].strip() + self.policymedical_code14 = record[287].strip() + self.policymedical_content14 = record[288].strip() + self.policymedical_code15 = record[289].strip() + self.policymedical_content15 = record[290].strip() + self.policymedical_code16 = record[291].strip() + self.policymedical_content16 = record[292].strip() + self.policymedical_code17 = record[293].strip() + self.policymedical_content17 = record[294].strip() + self.policymedical_code18 = record[295].strip() + self.policymedical_content18 = record[296].strip() + self.policymedical_code19 = record[297].strip() + self.policymedical_content19 = record[298].strip() + self.policymedical_code20 = record[299].strip() + self.policymedical_content20 = record[300].strip() self.visitcarest_flag = record[301].strip() self.visitcarestation_id = record[302].strip() From 2be8461f5aadb5d4cc9d987405d8561d58b724bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 11 May 2023 09:59:06 +0900 Subject: [PATCH 249/962] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/create_dcf_inst_merge.py | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py index 301c9337..de00baea 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 @@ -22,10 +22,10 @@ def exec(): db.begin() logger.debug('DCF施設統合マスタ作成処理開始') # COM施設からDCF施設統合マスタに登録 - (success, result) = _insert_dcf_inst_merge_from_com_ci(db) - # DCF施設統合マスタが追加ログを出力する - if success: - _output_dcf_inst_merge_log(result) + (is_add_dcf_inst, result) = _insert_dcf_inst_merge_from_com_ci(db) + # DCF施設統合マスタの追加のログを出力する + if is_add_dcf_inst: + _output_add_dcf_inst_log(result) logger.debug('DCF施設統合マスタ作成処理終了') except Exception as e: db.rollback() @@ -35,10 +35,10 @@ def exec(): def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: - # com_ciにdcf_inst_mergeにinsert + # com_ciからdcf_inst_mergeにinsert + # 重複コードがあるデータを取得する(処理日~システム日付を対象) try: - result = db.execute_select( - """ + sql = """ SELECT ci.dcf_dsf_inst_cd AS dcf_dsf_inst_cd, ci.form_inst_name_kanji AS form_inst_name_kanji, @@ -85,9 +85,10 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: sl.inst_cd = ci.dcf_dsf_inst_cd ) ) - """ - ) - logger.debug('重複コードがあるデータの取得に成功') + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('重複コードがあるデータの取得に成功') except Exception as e: logger.debug('重複コードがあるデータの取得に失敗') raise e @@ -96,9 +97,10 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: logger.info('重複コードがあるデータはありません') return False, None + # DCF施設統合マスタ追加 values_clauses = [] params = {} - clauses_no = 0 + clauses_no = 1 for row in result: dcfInstCdArr = f'dcfInstCd{clauses_no}' dupOppCdArr = f'dupOppCd{clauses_no}' @@ -138,32 +140,26 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: return (True, result) -def _output_dcf_inst_merge_log(result: list[dict]): +def _output_add_dcf_inst_log(result: list[dict]): sys_update_date = result[0]['sys_update_date'] setYearMonth = '{set_year}年{set_month}月'.format( set_year=sys_update_date[0:4], set_month=sys_update_date[-2:] ) + add_dct_inst = 'DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}' add_dct_inst_list = [] for row in result: - add_dct_inst_list.append("""DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}""".format( - dcf_dsf_inst_cd=row['dcf_dsf_inst_cd'], - form_inst_name_kanji=row['form_inst_name_kanji'], - dup_opp_cd=row['dup_opp_cd'], - dup_inst_name_kanji=row['dup_inst_name_kanji'] - ) - ) - + add_dct_inst_list.append(add_dct_inst.format(**row)) add_dct_inst_list = '\n'.join(add_dct_inst_list) + logger.info( f"""[NOTICE]DCF施設統合マスタが追加されました。 ********************************************************** -適用月度{setYearMonth} +適用月度 {setYearMonth} ********************************************************** {add_dct_inst_list} ********************************************************** -合計 {len(result)}件 - """ +合計 {len(result)}件""" ) return From b2e365871322852163f4b9b607cffe46619296ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 13:56:27 +0900 Subject: [PATCH 250/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E7=9F=AD=E6=9C=9F=E6=BB=9E=E5=9C=A8=E6=89=8B=E8=A1=93?= =?UTF-8?q?=EF=BC=89=EF=BC=88=E5=B0=82=E9=96=80=E5=A4=96=E6=9D=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_prefc_med_dis_treat_mapper.py | 2 +- .../com_prefc_med_sojourn_ope_mapper.py | 95 +++++++ .../com_prefc_med_sp_outpat_mapper.py | 125 +++++++++ .../tables/com_prefc_med_sojourn_ope.py | 25 ++ .../tables/com_prefc_med_sp_outpat.py | 29 +++ .../ultmarc_table_mapper_factory.py | 8 +- .../com_prefc_med_sojourn_ope/__init__.py | 0 .../com_prefc_med_sojourn_ope_delete.csv | 3 + .../com_prefc_med_sojourn_ope_insert.csv | 7 + .../com_prefc_med_sojourn_ope_update.csv | 4 + ...om_prefc_med_sojourn_ope_before_delete.csv | 10 + ...om_prefc_med_sojourn_ope_before_update.csv | 8 + ...xpect_com_prefc_med_sojourn_ope_delete.csv | 7 + ...xpect_com_prefc_med_sojourn_ope_insert.csv | 8 + ...xpect_com_prefc_med_sojourn_ope_update.csv | 10 + .../test_com_prefc_med_sojourn_ope_mapper.py | 238 ++++++++++++++++++ .../com_prefc_med_sp_outpat/__init__.py | 0 .../com_prefc_med_sp_outpat_delete.csv | 1 + .../com_prefc_med_sp_outpat_insert.csv | 7 + .../com_prefc_med_sp_outpat_update.csv | 6 + ..._com_prefc_med_sp_outpat_before_delete.csv | 7 + ..._com_prefc_med_sp_outpat_before_update.csv | 9 + .../expect_com_prefc_med_sp_outpat_delete.csv | 6 + .../expect_com_prefc_med_sp_outpat_insert.csv | 8 + .../expect_com_prefc_med_sp_outpat_update.csv | 9 + .../test_com_prefc_med_sp_outpat_mapper.py | 238 ++++++++++++++++++ 26 files changed, 867 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py index 42193466..26486dd3 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py @@ -95,7 +95,7 @@ class ComPrefcMedDisTreatMapper(UltmarcTableMapper): return self.INSERT_QUERY # 存在する場合はUpdate - # 病床数が空の場合は更新しない + # 前年件数が空の場合は更新しない if self.record.pre_num is not None: if self.record.pre_num == '@': self.query_parameter['pre_num'] = None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py new file mode 100644 index 00000000..f2c84587 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py @@ -0,0 +1,95 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sojourn_ope import ComPrefcMedSojournOpe + + +class ComPrefcMedSojournOpeMapper(UltmarcTableMapper): + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_sojourn_ope + ( + dcf_dsf_inst_cd, + cos_surgery_code, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :cos_surgery_code, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_sojourn_ope + SET + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + cos_surgery_code = :cos_surgery_code + """ + + record: ComPrefcMedSojournOpe + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedSojournOpe) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py new file mode 100644 index 00000000..182616d5 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py @@ -0,0 +1,125 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sp_outpat import ComPrefcMedSpOutpat + + +class ComPrefcMedSpOutpatMapper(UltmarcTableMapper): + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_prefc_med_sp_outpat + ( + dcf_dsf_inst_cd, + specialclinic_name, + sort_key, + sectsub_cd, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :dcfdsf_inst_code, + :specialclinic_name, + :sort_key, + :sectsub_cd, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_prefc_med_sp_outpat + SET + {update_columns} + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcfdsf_inst_code + AND + specialclinic_name = :specialclinic_name + """ + + record: ComPrefcMedSpOutpat + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPrefcMedSpOutpat) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + if self.record.maint_flag == 'B' and self.record.adddel_div == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.__make_update_query() + + def __make_update_query(self): + set_clauses = [] # 設定項目 + + # ソートキー + if len(self.record.sort_key) > 0: + set_clauses.append('sort_key = :sort_key') + + # 分類補助コード + if len(self.record.sectsub_cd) > 0: + set_clauses.append('sectsub_cd = :sectsub_cd') + if self.record.sectsub_cd == '@': + self.query_parameter['sectsub_cd'] = None + + update_columns = ','.join(set_clauses) + # 何も更新項目が無い場合はNoneとする(更新処理は行わない) + if len(update_columns) == 0: + return None + else: + # 末尾にカンマを付けてSET句を完成させる + update_columns += ',' + update_query = self.UPDATE_QUERY.format( + update_columns=update_columns + ) + return update_query diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py new file mode 100644 index 00000000..96b3ad0a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py @@ -0,0 +1,25 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedSojournOpe(UltmarcTable): + """レイアウト区分132: COM_都道府県医療機能情報(短期滞在手術)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + cos_surgery_code: str # 短期滞在手術コード + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.cos_surgery_code = record[5].strip() + self.adddel_div = record[6].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py new file mode 100644 index 00000000..c26fc8e0 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sp_outpat.py @@ -0,0 +1,29 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPrefcMedSpOutpat(UltmarcTable): + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + dcfhp_id: str # DCFコード(レコードID) + dcfhp_code: str # DCFコード(施設コード) + dcfhp_yobi: str # DCFコード(予備) + specialclinic_name: str # 専門外来名 + sort_key: str # ソートキー + sectsub_cd: str # 分類補助コード + adddel_div: str # 追加削除区分 + maint_flag: str # 修正区分 + + dcfdsf_inst_code: str # DCFDSF施設コード + + def __init__(self, record: list[str]): + super().__init__(record) + self.dcfhp_id = record[1].strip() + self.dcfhp_code = record[2].strip() + self.dcfhp_yobi = record[3].strip() + self.maint_flag = record[4].strip() + self.specialclinic_name = record[5].strip() + self.adddel_div = record[6].strip() + self.sort_key = record[9].strip() + self.sectsub_cd = record[10].strip() + + # DCFDSF施設コード + self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi]) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 48a20d38..04626286 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -36,6 +36,10 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_equpment_ ComPrefcMedEqupmentMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_dis_treat_mapper import \ ComPrefcMedDisTreatMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sojourn_ope_mapper import \ + ComPrefcMedSojournOpeMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sp_outpat_mapper import \ + ComPrefcMedSpOutpatMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \ ComCopHpMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ @@ -67,9 +71,9 @@ COM_TABLE_LIST = { # COM_都道府県医療機能情報(疾患治療) "134": ComPrefcMedDisTreatMapper, # COM_都道府県医療機能情報(短期滞在手術) - "135": NullMapper, + "135": ComPrefcMedSojournOpeMapper, # COM_都道府県医療機能情報(専門外来) - "136": NullMapper, + "136": ComPrefcMedSpOutpatMapper, # COM_診療科目 "001": NullMapper, # COM_病院種別 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv new file mode 100644 index 00000000..0e25331e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_delete.csv @@ -0,0 +1,3 @@ +"135","00","9901679","","B","101","1","20141210","20141213" +"135","00","9901679","","B","102","1","20141209","20141213" +"135","00","9901679","","B","111","1","20141208","20141213" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv new file mode 100644 index 00000000..daf6f1f9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_insert.csv @@ -0,0 +1,7 @@ +"135","00","9900146","","A","213","2","20141113","20141114" +"135","00","9900146","","A","214","2","20141113","20141114" +"135","00","9900146","","A","215","2","20141113","20141114" +"135","00","9901679","","A","101","2","20141113","20141114" +"135","00","9901679","","A","102","2","20141113","20141114" +"135","00","9929798","","A","110","2","20141113","20141114" +"135","00","9929798","","A","111","2","20141113","20141114" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv new file mode 100644 index 00000000..5c75d14c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/com_prefc_med_sojourn_ope_update.csv @@ -0,0 +1,4 @@ +"135","00","9901679","","B","101","2","20141113","20141114" +"135","00","9901679","","B","111","2","20141113","20141114" +"135","00","9929798","","B","111","2","20141113","20141114" +"135","00","9929798","","B","211","2","20141113","20141114" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv new file mode 100644 index 00000000..90f5e825 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_delete.csv @@ -0,0 +1,10 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","111","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","211","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv new file mode 100644 index 00000000..72dda2ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/db_com_prefc_med_sojourn_ope_before_update.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv new file mode 100644 index 00000000..5adfd71e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" +"009929798","211","20171011","20171011","NULL","NULL","NULL","NULL","2017/10/11 11:49:28","clsPrefcMedSojournOp","2017/10/11 21:20:37","clsPrefcMedSojournOp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv new file mode 100644 index 00000000..995277be --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_insert.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009900146","214","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009900146","215","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009901679","101","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009901679","102","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009929798","110","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" +"009929798","111","20230511","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper","2017/10/08 20:57:12","com_prefc_med_sojourn_ope_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv new file mode 100644 index 00000000..d4377bc4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/expect_com_prefc_med_sojourn_ope_update.csv @@ -0,0 +1,10 @@ +"dcf_dsf_inst_cd","cos_surgery_code","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009900146","213","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","214","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009900146","215","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","101","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009901679","102","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009901679","111","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009929798","110","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2017/10/08 20:57:12","clsPrefcMedSojournOp" +"009929798","111","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsPrefcMedSojournOp","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" +"009929798","211","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper","2023/05/11 10:49:28","com_prefc_med_sojourn_ope_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py new file mode 100644 index 00000000..ad87a43a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py @@ -0,0 +1,238 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_sojourn_ope_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedSojournOpeMapper: + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(短期滞在手術)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(短期滞在手術)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sojourn_ope_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sojourn_ope', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(短期滞在手術)テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sojourn_ope_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sojourn_ope', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sojourn_ope_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sojourn_ope', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sojourn_ope_mapper.ComPrefcMedSojournOpeMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sojourn_ope + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + cos_surgery_code = :cos_surgery_code + """ + for param_dcf_dsf_inst_cd, param_cos_surgery_code in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_cos_surgery_code): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_cos_surgery_code}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv new file mode 100644 index 00000000..4ce0fddb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_delete.csv @@ -0,0 +1 @@ +"136","00","9929798","","B","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","20141211","20141213","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv new file mode 100644 index 00000000..ae233f9b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_insert.csv @@ -0,0 +1,7 @@ +"136","00","9901649","","A","テスト 小児 内分泌・腎臓外来","2","20141113","20141114","5","030" +"136","00","9904439","","A","テスト アルコール症専門外来","2","20141113","20141114","1","019" +"136","00","9904439","","A","テスト メンタルヘルス専門外来","2","20141113","20141114","7","019" +"136","00","9904439","","A","テスト 禁煙専門外来","2","20141113","20141114","2","001" +"136","00","9904439","","A","テスト 糖尿病外来","2","20141113","20141114","7","006" +"136","00","9929798","","A","テスト ストーマ(人工肛門・人工膀胱)専門外来","2","20141113","20141114","1","014" +"136","99","9999999","99","A","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","2","20141113","20141114","111","222" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv new file mode 100644 index 00000000..e157aee6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/com_prefc_med_sp_outpat_update.csv @@ -0,0 +1,6 @@ +"136","00","9901649","","B","テスト 小児 内分泌・腎臓外来","2","20141113","20141114","5","019" +"136","00","9904439","","B","テスト 禁煙専門外来","2","20141113","20141114","2","@" +"136","00","9904439","","B","テスト 糖尿病外来","2","20141113","20141114","7","001" +"136","00","9929798","","B","テスト ストーマ(人工肛門・人工膀胱)専門外来","2","20141113","20141114","1","@" +"136","99","9999999","11","B","あいうえお","2","20141113","20141114","","999" +"136","99","9999999","99","B","あいうえお","2","20141113","20141114","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv new file mode 100644 index 00000000..6e0c952c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_delete.csv @@ -0,0 +1,7 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","001","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv new file mode 100644 index 00000000..3266575e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/db_com_prefc_med_sp_outpat_before_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","030","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","001","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","006","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","014","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"99999999911","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"99999999999","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv new file mode 100644 index 00000000..6184e1ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_delete.csv @@ -0,0 +1,6 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" +"009904439","テスト 糖尿病外来","7","001","20171008","20171011","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/11 21:20:37","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv new file mode 100644 index 00000000..26abd18a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_insert.csv @@ -0,0 +1,8 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","030","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト アルコール症専門外来","1","019","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト メンタルヘルス専門外来","7","019","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 禁煙専門外来","2","001","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 糖尿病外来","7","006","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","014","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" +"99999999999","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","111","222","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper","2023/05/11 10:57:12","com_prefc_med_sp_outpat_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv new file mode 100644 index 00000000..33d5e48f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/expect_com_prefc_med_sp_outpat_update.csv @@ -0,0 +1,9 @@ +"dcf_dsf_inst_cd","specialclinic_name","sort_key","sectsub_cd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"009901649","テスト 小児 内分泌・腎臓外来","5","019","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009904439","テスト アルコール症専門外来","1","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト メンタルヘルス専門外来","7","019","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" +"009904439","テスト 禁煙専門外来","2","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009904439","テスト 糖尿病外来","7","001","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"009929798","テスト ストーマ(人工肛門・人工膀胱)専門外来","1","NULL","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:49:28","com_prefc_med_sp_outpat_mapper" +"99999999911","あいうえお","123","999","20171008","20230511","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2023/05/11 11:57:12","com_prefc_med_sp_outpat_mapper" +"99999999999","あいうえお","123","123","20171008","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComPrefcMedSpOutp","2017/10/08 20:57:12","clsComPrefcMedSpOutp" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py new file mode 100644 index 00000000..04932cf8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py @@ -0,0 +1,238 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_prefc_med_sp_outpat_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPrefcMedSpOutpatMapper: + """レイアウト区分136: COM_都道府県医療機能情報(専門外来)""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_都道府県医療機能情報(専門外来)テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_insert.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_都道府県医療機能情報(専門外来)テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sp_outpat_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sp_outpat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_update.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_都道府県医療機能情報(専門外来)テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_prefc_med_sp_outpat_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_prefc_med_sp_outpat', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_prefc_med_sp_outpat_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_prefc_med_sp_outpat', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_prefc_med_sp_outpat_mapper.ComPrefcMedSpOutpatMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_delete.csv')) + primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] + primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_prefc_med_sp_outpat + WHERE + dcf_dsf_inst_cd = :dcf_dsf_inst_cd + AND + specialclinic_name = :specialclinic_name + """ + for param_dcf_dsf_inst_cd, param_specialclinic_name in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_specialclinic_name): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_dcf_dsf_inst_cd, **param_specialclinic_name}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From d370e8c87d92faddcfbf8da7217c2e655d54be9b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 11 May 2023 15:32:42 +0900 Subject: [PATCH 251/962] =?UTF-8?q?style:=20=E3=82=A8=E3=83=87=E3=82=A3?= =?UTF-8?q?=E3=82=BF=E3=81=AE=E8=AD=A6=E5=91=8A=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 2ba87909..27c47ad5 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -1105,7 +1105,7 @@ class VjskRecvFileMapper: ,INS_DT ,INS_USR ,DWH_UPD_DT - ) + ) SELECT t.REC_DATA ,t.REC_WHS_CD @@ -1138,7 +1138,7 @@ class VjskRecvFileMapper: ,t.INS_USR ,SYSDATE() FROM org05.whole_stock AS t - ON DUPLICATE KEY UPDATE + ON DUPLICATE KEY UPDATE REC_DATA=t.REC_DATA ,REC_WHS_CD=t.REC_WHS_CD ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD From d0076bceb95e23fe6982d1258d5d0399c3548a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 15:54:17 +0900 Subject: [PATCH 252/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=8C=BB=E7=99=82=E5=9C=8F=EF=BC=BF=E9=83=BD=E9=81=93?= =?UTF-8?q?=E5=BA=9C=E7=9C=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_med_prefc_mapper.py | 129 ++++++++++ .../utmp_tables/tables/com_med_prefc.py | 48 ++++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_med_prefc/__init__.py | 0 .../com_med_prefc/com_med_prefc_delete.csv | 3 + .../com_med_prefc/com_med_prefc_insert.csv | 4 + .../com_med_prefc/com_med_prefc_update.csv | 3 + .../db_com_med_prefc_before_delete.csv | 4 + .../db_com_med_prefc_before_update.csv | 4 + .../expect_com_med_prefc_delete.csv | 2 + .../expect_com_med_prefc_insert.csv | 5 + .../expect_com_med_prefc_update.csv | 4 + .../test_com_med_prefc_mapper.py | 220 ++++++++++++++++++ 13 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py new file mode 100644 index 00000000..475a6b9a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_prefc_mapper.py @@ -0,0 +1,129 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_prefc import ComMedPrefc + + +class ComMedPrefcMapper(UltmarcTableMapper): + """レイアウト区分121: COM_医療圏都道府県 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_prefc + WHERE + pref_code = :pref_code + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_prefc + ( + pref_code, + rev_date, + post_date, + psy_bednumtg, + psy_bednumgen, + psy_bednumdate, + psy_eqbednum, + tb_bednumtg, + tb_bednumgen, + tb_bednumdate, + tb_eqbednum, + inf_bednumtg, + inf_bednumgen, + inf_bednumdate, + inf_eqbednum, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :pref_code, + :rev_date, + :post_date, + :psy_bednum_tg, + :psy_bednum_gen, + :psy_bednum_date, + :psy_eqbed_num, + :tb_bednum_tg, + :tb_bednum_gen, + :tb_bednum_date, + :tb_eqbed_num, + :inf_bednum_tg, + :inf_bednum_gen, + :inf_bednum_date, + :inf_eqbed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_med_prefc + SET + rev_date = :rev_date, + post_date = :post_date, + psy_bednumtg = :psy_bednum_tg, + psy_bednumgen = :psy_bednum_gen, + psy_bednumdate = :psy_bednum_date, + psy_eqbednum = :psy_eqbed_num, + tb_bednumtg = :tb_bednum_tg, + tb_bednumgen = :tb_bednum_gen, + tb_bednumdate = :tb_bednum_date, + tb_eqbednum = :tb_eqbed_num, + inf_bednumtg = :inf_bednum_tg, + inf_bednumgen = :inf_bednum_gen, + inf_bednumdate = :inf_bednum_date, + inf_eqbednum = :inf_eqbed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + pref_code = :pref_code + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_med_prefc + WHERE + pref_code = :pref_code + """ + + record: ComMedPrefc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedPrefc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py new file mode 100644 index 00000000..e08adc88 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_prefc.py @@ -0,0 +1,48 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedPrefc(UltmarcTable): + """レイアウト区分121: COM_医療圏都道府県""" + pref_code: str # 都道府県コード + rev_date: str # 医療圏メンテナンス年月日 + post_date: str # 公示年月日 + psy_bednum_tg: str # 精神_基準病床数 or 整備目標数 + psy_bednum_gen: str # 精神_既存病床数(病床数) + psy_bednum_date: str # 精神_既存病床数(年月日) + psy_eqbed_num: str # 精神_過不足病床数(差引) + tb_bednum_tg: str # 結核_基準病床数 or 整備目標数 + tb_bednum_gen: str # 結核_既存病床数(病床数) + tb_bednum_date: str # 結核_既存病床数(年月日) + tb_eqbed_num: str # 結核_過不足病床数(差引) + inf_bednum_tg: str # 感染症_基準病床数 or 整備目標数 + inf_bednum_gen: str # 感染症_既存病床数(病床数) + inf_bednum_date: str # 感染症_既存病床数(年月日) + inf_eqbed_num: str # 感染症_過不足病床数(差引) + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.pref_code = record[1] + self.maintflag = record[2] + self.rev_date = record[5] + self.post_date = record[6] + self.psy_bednum_tg = record[7].strip() + self.psy_bednum_gen = record[8].strip() + self.psy_bednum_date = record[9] + self.psy_eqbed_num = record[10] + self.tb_bednum_tg = record[11].strip() + self.tb_bednum_gen = record[12].strip() + self.tb_bednum_date = record[13] + self.tb_eqbed_num = record[14] + self.inf_bednum_tg = record[15].strip() + self.inf_bednum_gen = record[16].strip() + self.inf_bednum_date = record[17] + self.inf_eqbed_num = record[18] + + # decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.psy_bednum_tg = self.psy_bednum_tg if len(self.psy_bednum_tg) > 0 else None + self.psy_bednum_gen = self.psy_bednum_gen if len(self.psy_bednum_gen) > 0 else None + self.tb_bednum_tg = self.tb_bednum_tg if len(self.tb_bednum_tg) > 0 else None + self.tb_bednum_gen = self.tb_bednum_gen if len(self.tb_bednum_gen) > 0 else None + self.inf_bednum_tg = self.inf_bednum_tg if len(self.inf_bednum_tg) > 0 else None + self.inf_bednum_gen = self.inf_bednum_gen if len(self.inf_bednum_gen) > 0 else None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 479253dc..7a60ed63 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -34,6 +34,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_att_mapper imp ComInstAttMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \ ComCopHpMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper import \ + ComMedPrefcMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -103,7 +105,7 @@ COM_TABLE_LIST = { # COM_政策医療 "028": ComPolicyMedMapper, # COM_医療圏都道府県 - "121": NullMapper, + "121": ComMedPrefcMapper, # COM_医療圏3次マスタ "122": NullMapper, # COM_二次医療圏 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv new file mode 100644 index 00000000..2416d338 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_delete.csv @@ -0,0 +1,3 @@ +"121","01","C","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","09","C","20141118","20141122","","","","","","","","","","","","","","" +"121","03","C","20141118","20141122","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv new file mode 100644 index 00000000..0f161d10 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_insert.csv @@ -0,0 +1,4 @@ +"121","01","A","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","02","A","20141118","20141122","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12" +"121","03","A","20141118","20141122","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0" +"121","99","A","","","20140101","20130329","123456","123456","20120930","1234567","123456","123456","20120930","1234567","123456","123465","20120930","1234567" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv new file mode 100644 index 00000000..0c5f5b39 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/com_med_prefc_update.csv @@ -0,0 +1,3 @@ +"121","01","A","20141118","20141122","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4" +"121","02","A","20141118","20141122","","","","","","","","","","","","","","" +"121","03","B","20141118","20141122","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv new file mode 100644 index 00000000..892066e1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_delete.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" +"03","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv new file mode 100644 index 00000000..d5ea9119 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/db_com_med_prefc_before_update.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" +"02","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" +"03","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:00:05","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv new file mode 100644 index 00000000..891196ec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_delete.csv @@ -0,0 +1,2 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2017/10/19 12:01:04","clsComMedPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv new file mode 100644 index 00000000..a6b694f7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_insert.csv @@ -0,0 +1,5 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"02","20160601","20130722","3870","4511","20130101","641","60","66","20130101","6","32","20","20130101","-12","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"03","20140101","20130329","4420","4454","20120930","34","30","137","20120930","107","40","40","20120930","0","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" +"99","20140101","20130329","123456","123456","20120930","1234567","123456","123456","20120930","1234567","123456","123465","20120930","1234567","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 12:00:05","com_med_prefc_mapper","2023/05/11 12:00:05","com_med_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv new file mode 100644 index 00000000..7d595e49 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/expect_com_med_prefc_update.csv @@ -0,0 +1,4 @@ +"pref_code","rev_date","post_date","psy_bednumtg","psy_bednumgen","psy_bednumdate","psy_eqbednum","tb_bednumtg","tb_bednumgen","tb_bednumdate","tb_eqbednum","inf_bednumtg","inf_bednumgen","inf_bednumdate","inf_eqbednum","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","20130501","20130329","18967","19615","20130201","648","143","205","20130201","62","98","94","20130201","-4","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" +"02","","","NULL","NULL","","","NULL","NULL","","","NULL","NULL","","","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" +"03","20170101","20170329","9420","9454","20170930","39","39","139","20170930","707","70","70","20170930","7","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 12:00:05","clsComMedPrefc","2023/05/11 12:01:04","com_med_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py new file mode 100644 index 00000000..495e1cca --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py @@ -0,0 +1,220 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_prefc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedPrefcMapper: + """レイアウト区分121: COM_医療圏都道府県""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # decimal型のカラム群 + decimal_columns = [ + 'psy_bednumtg', + 'psy_bednumgen', + 'tb_bednumtg', + 'tb_bednumgen', + 'inf_bednumtg', + 'inf_bednumgen' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏都道府県テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_insert.csv')) + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医療圏都道府県テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_prefc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_prefc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_update.csv')) + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医療圏都道府県テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_prefc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_prefc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_prefc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_prefc_mapper.ComMedPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_prefc_mapper.ComMedPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_delete.csv')) + primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 022f164eb4df7e5d6366157f8d402e31eb488db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 15:55:24 +0900 Subject: [PATCH 253/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py index 375ed954..8390096f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/test_com_alma_mapper.py @@ -28,13 +28,13 @@ class TestComAlmaMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From 2dd99b06bab404f07316c1f5c2ebe57efc3601dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 17:02:56 +0900 Subject: [PATCH 254/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=8C=BB=E7=99=82=E5=9C=8F=EF=BC=BF=EF=BC=93=E6=AC=A1?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_thrd_med_mapper.py | 98 ++++++++ .../utmp_tables/tables/com_thrd_med.py | 16 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_thrd_med/__init__.py | 0 .../com_thrd_med/com_thrd_med_delete.csv | 3 + .../com_thrd_med/com_thrd_med_insert.csv | 4 + .../com_thrd_med/com_thrd_med_update.csv | 3 + .../db_com_thrd_med_before_delete.csv | 4 + .../db_com_thrd_med_before_update.csv | 4 + .../expect_com_thrd_med_delete.csv | 2 + .../expect_com_thrd_med_insert.csv | 5 + .../expect_com_thrd_med_update.csv | 4 + .../com_thrd_med/test_com_thrd_med_mapper.py | 236 ++++++++++++++++++ 13 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py new file mode 100644 index 00000000..a51eb4be --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_thrd_med_mapper.py @@ -0,0 +1,98 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_thrd_med import ComThrdMed + + +class ComThrdMedMapper(UltmarcTableMapper): + """レイアウト区分122: COM_医療圏3次マスタ 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_thrd_med + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_thrd_med + ( + prefcode, + thrd_cd, + thrd_med_sphe_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :pref_code, + :thrd_cd, + :thrd_med_sphe_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_thrd_med + SET + thrd_med_sphe_name = :thrd_med_sphe_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_thrd_med + WHERE + prefcode = :pref_code + AND + thrd_cd = :thrd_cd + """ + + record: ComThrdMed + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComThrdMed) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py new file mode 100644 index 00000000..600e1632 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_thrd_med.py @@ -0,0 +1,16 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComThrdMed(UltmarcTable): + """レイアウト区分122: COM_医療圏3次マスタ""" + pref_code: str # 都道府県コード + thrd_cd: str # 3次コード + thrd_med_sphe_name: str # 3次医療圏名称 + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.pref_code = record[1] + self.thrd_cd = record[2] + self.maintflag = record[3] + self.thrd_med_sphe_name = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 0f206875..4c078280 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -46,6 +46,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper impor ComCopHpMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper import \ ComMedPrefcMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper import \ + ComThrdMedMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -117,7 +119,7 @@ COM_TABLE_LIST = { # COM_医療圏都道府県 "121": ComMedPrefcMapper, # COM_医療圏3次マスタ - "122": NullMapper, + "122": ComThrdMedMapper, # COM_二次医療圏 "123": NullMapper, # COM_医療圏都道府県市町村対照表 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv new file mode 100644 index 00000000..39844d66 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_delete.csv @@ -0,0 +1,3 @@ +"122","01","1","C","20141118","20141122","" +"122","01","2","C","20141118","20141122","オホーツク" +"122","01","9","C","20141118","20141122","道北" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv new file mode 100644 index 00000000..6c299222 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_insert.csv @@ -0,0 +1,4 @@ +"122","01","1","A","20141118","20141122","道南" +"122","01","2","A","20141118","20141122","" +"122","01","3","A","20141118","20141122","道北" +"122","99","12345678","A","","","あいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv new file mode 100644 index 00000000..3050ce0d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/com_thrd_med_update.csv @@ -0,0 +1,3 @@ +"122","01","1","A","20141118","20141122","" +"122","01","2","A","20141118","20141122","オホーツク" +"122","01","3","B","20141118","20141122","道北" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv new file mode 100644 index 00000000..475396aa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_delete.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" +"01","2","オホーツク","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" +"01","3","道北","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv new file mode 100644 index 00000000..5c15d8c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/db_com_thrd_med_before_update.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","道南","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" +"01","2","","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" +"01","3","道北","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 15:58:13","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv new file mode 100644 index 00000000..513fbde7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_delete.csv @@ -0,0 +1,2 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","3","道北","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2017/10/19 16:10:36","clsComThrdMed" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv new file mode 100644 index 00000000..68dc24d7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_insert.csv @@ -0,0 +1,5 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","道南","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"01","2","","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"01","3","道北","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" +"99","12345678","あいうえおかきくけこあいうえおかきくけこ","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/11 15:58:13","com_thrd_med_mapper","2023/05/11 15:58:13","com_thrd_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv new file mode 100644 index 00000000..29268282 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/expect_com_thrd_med_update.csv @@ -0,0 +1,4 @@ +"prefcode","thrd_cd","thrd_med_sphe_name","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","1","","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" +"01","2","オホーツク","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" +"01","3","道北","20171019","20230511","NULL","NULL","NULL","NULL","2017/10/19 15:58:13","clsComThrdMed","2023/05/11 16:10:36","com_thrd_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py new file mode 100644 index 00000000..43c11960 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py @@ -0,0 +1,236 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_thrd_med_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComThrdMedMapper: + """レイアウト区分122: COM_医療圏3次マスタ""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏3次マスタテーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_insert.csv')) + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医療圏3次マスタテーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_thrd_med_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_thrd_med', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_update.csv')) + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医療圏3次マスタテーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_thrd_med_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_thrd_med', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_thrd_med_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_thrd_med', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_thrd_med_mapper.ComThrdMedMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_thrd_med_mapper.ComThrdMedMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_delete.csv')) + primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] + primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_thrd_med + WHERE + prefcode = :prefcode + AND thrd_cd = :thrd_cd\ + """ + for param_prefcode, param_thrd_cd in zip(primary_keys_prefcode, primary_keys_thrd_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefcode, **param_thrd_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 662a214f3bec0293faf7b25d1eedf85f8e31e41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 11 May 2023 17:04:35 +0900 Subject: [PATCH 255/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E5=A4=96=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/com_thrd_med/test_com_thrd_med_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py index 43c11960..738d570a 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py @@ -28,13 +28,13 @@ class TestComThrdMedMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From 300420031c64fdedcc27ed9f41527841e3e8cc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 11 May 2023 17:50:11 +0900 Subject: [PATCH 256/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/create_dcf_inst_merge.py | 70 +++++++++---------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 3 +- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py index de00baea..c7f10b9f 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 @@ -22,10 +22,11 @@ def exec(): db.begin() logger.debug('DCF施設統合マスタ作成処理開始') # COM施設からDCF施設統合マスタに登録 - (is_add_dcf_inst, result) = _insert_dcf_inst_merge_from_com_ci(db) - # DCF施設統合マスタの追加のログを出力する - if is_add_dcf_inst: - _output_add_dcf_inst_log(result) + (is_add_dcf_inst_merge, duplication_inst_records) = _insert_dcf_inst_merge_from_com_inst(db) + # DCF施設統合マスタ追加のログを出力する + if is_add_dcf_inst_merge: + logger.info('[NOTICE]DCF施設統合マスタが追加されました。') + _output_add_dcf_inst_merge_log(duplication_inst_records) logger.debug('DCF施設統合マスタ作成処理終了') except Exception as e: db.rollback() @@ -34,8 +35,8 @@ def exec(): db.disconnect() -def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: - # com_ciからdcf_inst_mergeにinsert +def _insert_dcf_inst_merge_from_com_inst(db: Database) -> tuple[bool, list[dict]]: + # com_instからdcf_inst_mergeにinsert # 重複コードがあるデータを取得する(処理日~システム日付を対象) try: sql = """ @@ -51,14 +52,14 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: WHERE dupci.dcf_dsf_inst_cd = ci.dup_opp_cd ) AS dup_inst_name_kanji, - DATE_FORMAT(DATE_ADD((SELECT syor_date FROM src05.hdke_tbl),INTERVAL 1 MONTH),'%Y%m') AS sys_update_date + DATE_FORMAT((src05.get_syor_date() + INTERVAL 1 MONTH), '%Y%m') AS sys_update_date FROM src05.com_inst AS ci WHERE CHAR_LENGTH(ci.dup_opp_cd) > 0 AND ci.delete_sche_reason_cd = 'D' AND ci.abolish_ymd IS NULL - AND DATE_FORMAT(ci.sys_update_date, '%Y%m%d') BETWEEN (SELECT syor_date FROM src05.hdke_tbl) AND DATE_FORMAT(SYSDATE(), '%Y%m%d') + AND ci.sys_update_date BETWEEN src05.get_syor_date() AND SYSDATE() AND NOT EXISTS ( SELECT dim.dcf_inst_cd @@ -86,31 +87,29 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: ) ) """ - result = db.execute_select(sql) + duplication_inst_records = db.execute_select(sql) logging_sql(logger, sql) logger.info('重複コードがあるデータの取得に成功') except Exception as e: logger.debug('重複コードがあるデータの取得に失敗') raise e - if len(result) == 0: + if len(duplication_inst_records) == 0: logger.info('重複コードがあるデータはありません') - return False, None + return (False, None) # DCF施設統合マスタ追加 values_clauses = [] params = {} - clauses_no = 1 - for row in result: - dcfInstCdArr = f'dcfInstCd{clauses_no}' - dupOppCdArr = f'dupOppCd{clauses_no}' - tekiyoMonthArr = f'tekiyoMonth{clauses_no}' - placeholders = f'(:{dcfInstCdArr}, :{dupOppCdArr}, :{tekiyoMonthArr}, "Y", CURRENT_USER(), SYSDATE(), CURRENT_USER(), SYSDATE())' - values_clauses.append(placeholders) - params[dcfInstCdArr] = row['dcf_dsf_inst_cd'] - params[dupOppCdArr] = row['dup_opp_cd'] - params[tekiyoMonthArr] = row['sys_update_date'] - clauses_no += 1 + for clauses_no, row in enumerate(duplication_inst_records, start=1): + dcf_inst_cd_arr = f'dcf_inst_cd{clauses_no}' + dup_opp_cd_arr = f'dup_opp_cd{clauses_no}' + tekiyo_month_arr = f'tekiyo_month{clauses_no}' + values_clause = f'(:{dcf_inst_cd_arr}, :{dup_opp_cd_arr}, :{tekiyo_month_arr}, "Y", CURRENT_USER(), SYSDATE(), CURRENT_USER(), SYSDATE())' + values_clauses.append(values_clause) + params[dcf_inst_cd_arr] = row['dcf_dsf_inst_cd'] + params[dup_opp_cd_arr] = row['dup_opp_cd'] + params[tekiyo_month_arr] = row['sys_update_date'] insert_sql = f""" INSERT INTO @@ -137,29 +136,30 @@ def _insert_dcf_inst_merge_from_com_ci(db: Database) -> tuple[bool, list[dict]]: logger.debug('COM施設からDCF施設統合マスタの登録に失敗') raise e - return (True, result) + return (True, duplication_inst_records) -def _output_add_dcf_inst_log(result: list[dict]): - sys_update_date = result[0]['sys_update_date'] - setYearMonth = '{set_year}年{set_month}月'.format( +def _output_add_dcf_inst_merge_log(duplication_inst_records: list[dict]): + sys_update_date = duplication_inst_records[0]['sys_update_date'] + set_year_month = '{set_year}年{set_month}月'.format( set_year=sys_update_date[0:4], set_month=sys_update_date[-2:] ) - add_dct_inst = 'DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}' - add_dct_inst_list = [] - for row in result: - add_dct_inst_list.append(add_dct_inst.format(**row)) - add_dct_inst_list = '\n'.join(add_dct_inst_list) + add_dct_inst_merge = 'DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}' + add_dct_inst_merge_list = [] + for row in duplication_inst_records: + add_dct_inst_merge_list.append(add_dct_inst_merge.format(**row)) + add_dct_inst_merge_list = '\n'.join(add_dct_inst_merge_list) + # 顧客報告用にログ出力 logger.info( - f"""[NOTICE]DCF施設統合マスタが追加されました。 + f"""DCF施設統合マスタが追加されました。 ********************************************************** -適用月度 {setYearMonth} +適用月度 {set_year_month} ********************************************************** -{add_dct_inst_list} +{add_dct_inst_merge_list} ********************************************************** -合計 {len(result)}件""" +合計 {len(duplication_inst_records)}件""" ) return diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 370f2179..cb1cf9e1 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,8 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.laundering import create_dcf_inst_merge, create_mst_inst +from src.batch.dcf_inst_merge import create_dcf_inst_merge +from src.batch.laundering import create_mst_inst from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger From 285c725d5b1571251f82431ab826608e8905e851 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 11 May 2023 21:07:41 +0900 Subject: [PATCH 257/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 8 +- .../src/batch/common/batch_context.py | 12 +- .../src/batch/vjsk/vjsk_data_load_manager.py | 24 +- .../src/batch/vjsk/vjsk_importer.py | 122 +- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 2374 ++++++++--------- 5 files changed, 1266 insertions(+), 1274 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index dde7cd46..62111409 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -91,13 +91,13 @@ class ConfigBucket(S3Bucket): f.seek(0) return temporary_file_path - def download_wholesaler_stock_list(self): + def download_wholesaler_stock_input_day_list(self): # 一時ファイルとして保存する temporary_dir = tempfile.mkdtemp() temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME) - holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME}' + wholesaler_stock_input_day_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME}' with open(temporary_file_path, mode='wb') as f: - self._s3_client.download_file(self._bucket_name, holiday_list_key, f) + self._s3_client.download_file(self._bucket_name, wholesaler_stock_input_day_list_key, f) f.seek(0) return temporary_file_path @@ -110,7 +110,7 @@ class UltmarcBackupBucket(JskUltBackupBucket): _folder = environment.ULTMARC_BACKUP_FOLDER -class VjskRecieveBucket(S3Bucket): +class VjskReceiveBucket(S3Bucket): _bucket_name = environment.JSKULT_DATA_BUCKET _recv_folder = environment.JSKULT_DATA_FOLDER_RECV diff --git a/ecs/jskult-batch-daily/src/batch/common/batch_context.py b/ecs/jskult-batch-daily/src/batch/common/batch_context.py index b493ecca..b3fc4967 100644 --- a/ecs/jskult-batch-daily/src/batch/common/batch_context.py +++ b/ecs/jskult-batch-daily/src/batch/common/batch_context.py @@ -3,7 +3,7 @@ class BatchContext: __syor_date: str # 処理日(yyyy/mm/dd形式) __is_not_business_day: bool # 日次バッチ起動日フラグ __is_ultmarc_imported: bool # アルトマーク取込実施済フラグ - __is_import_target_vjsk_stockslipdata: bool # 卸在庫データ取込対象フラグ + __is_vjsk_stock_import_day: bool # 卸在庫データ取込対象フラグ def __init__(self) -> None: self.__is_not_business_day = False @@ -40,9 +40,9 @@ class BatchContext: self.__is_ultmarc_imported = flag @property - def is_import_target_vjsk_stockslipdata(self): - return self.__is_import_target_vjsk_stockslipdata + def is_vjsk_stock_import_day(self): + return self.__is_vjsk_stock_import_day - @is_import_target_vjsk_stockslipdata.setter - def is_import_target_vjsk_stockslipdata(self, flag: bool): - self.__is_import_target_vjsk_stockslipdata = flag + @is_vjsk_stock_import_day.setter + def is_vjsk_stock_import_day(self, flag: bool): + self.__is_vjsk_stock_import_day = flag diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 909bd041..2d99951b 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -1,10 +1,11 @@ # from src.batch.vjsk.vjsk_recv_file_manager import VjskDatFile -from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper from src.db.database import Database +from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger logger = get_logger('V実消化データ取込(DB登録)') -mapper = VjskRecvFileMapper() +mapper = VjskReceiveFileMapper() class VjskDataLoadManager: @@ -27,8 +28,13 @@ class VjskDataLoadManager: db.execute(f"TRUNCATE TABLE {table_name_org};") # orgにload ※warningは1148エラーになるらしい - sql = f"LOAD DATA LOCAL INFILE :src_file_name INTO TABLE {table_name_org} " \ - " FIELDS TERMINATED BY '\\t' ENCLOSED BY '\"' IGNORE 1 LINES;" + sql = f"""\ + LOAD DATA LOCAL INFILE :src_file_name + INTO TABLE {table_name_org} + FIELDS TERMINATED BY '\\t' + ENCLOSED BY '\"' + IGNORE 1 LINES; + """ result = db.execute(sql, {"src_file_name": src_file_name}) logger.debug(sql) logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') @@ -45,8 +51,7 @@ class VjskDataLoadManager: db.commit() except Exception as e: db.rollback() - logger.error(e) - raise e + raise BatchOperationException(e) finally: db.disconnect() @@ -54,9 +59,8 @@ class VjskDataLoadManager: return @classmethod - def Load(self, target: dict): - logger.debug(f'JjskDataLoadManager#load start target:{target}') - # target : {"condkey": key, "src_file_path":local_file_path} + def load(self, target: dict): + logger.debug(f'load start target:{target}') # S3からローカルストレージにdownloadした登録対象のtsvファイルパスを取得 local_file_name = target["src_file_path"] @@ -64,5 +68,5 @@ class VjskDataLoadManager: # データベース登録 self._import_to_db(local_file_name, target["condkey"]) - logger.debug('JjskDataLoadManager#load done') + logger.debug('load done') return diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 31c42874..719e3e62 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -1,15 +1,54 @@ -from src.aws.s3 import ConfigBucket, VjskRecieveBucket +from src.aws.s3 import ConfigBucket, VjskReceiveBucket from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager -from src.batch.vjsk.vjsk_recv_file_mapper import VjskRecvFileMapper +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger logger = get_logger('V実消化データ取込') batch_context = BatchContext.get_instance() -vjsk_recv_bucket = VjskRecieveBucket() -vjsk_mapper = VjskRecvFileMapper() +vjsk_recv_bucket = VjskReceiveBucket() +vjsk_mapper = VjskReceiveFileMapper() + + +def exec(): + """V実消化データ取込処理""" + logger.debug('exec start') + + # 非営業日なら何もせず終了 + if batch_context.is_not_business_day: + logger.debug('非営業日なので処理をスキップ') + return + + # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる + logger.debug('卸在庫データ取込対象日であるかを判定') + batch_context.is_vjsk_stock_import_day = _determine_today_is_stockslipdata_target() + logger.debug(f'判定結果 : {batch_context.is_vjsk_stock_import_day}') + if batch_context.is_vjsk_stock_import_day: + logger.info('卸在庫データ取込対象日です') + + # V実消化データファイル受領チェック + logger.debug('V実消化データファイル受領チェック:開始') + try: + # S3バケットにある受領済のV実消化データファイルの存在チェックをする + _check_received_files() + + except BatchOperationException as e: + logger.debug('受領したV実消化データファイルに未受領もものがあります') + raise e + logger.debug('V実消化データファイル受領チェック:終了') + + # データベース取込 + logger.debug('V実消化データ取込:開始') + try: + # S3バケットにある受領済のV実消化データファイルをデータベースに登録する + _import_file_to_db() + except Exception as e: + logger.debug(f'データベース登録失敗 {e}') + raise e + + logger.debug('exec done') def _check_if_file_exists(src_list: list, condkey: str) -> bool: @@ -39,7 +78,7 @@ def _check_received_files(): logger.debug(f'ファイル一覧{received_s3_files}') # ファイル存在確認 卸在庫データファイル(卸在庫データ処理対象日のみ実施) - if batch_context.is_import_target_vjsk_stockslipdata: + if batch_context.is_vjsk_stock_import_day: if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_STOCK_SLIP_DATA): raise BatchOperationException(f'卸在庫データファイルがありません ファイル一覧:{received_s3_files}') @@ -130,50 +169,50 @@ def _import_file_to_db(): logger.debug(f'取込対象データファイル辞書{target_dict}') # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) - if batch_context.is_import_target_vjsk_stockslipdata: - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) + if batch_context.is_vjsk_stock_import_day: + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_STOCK_SLIP_DATA]) # DB登録 卸販売データ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_SLIP_DATA]) # DB登録 卸組織変換マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_ORG_CNV_MST]) # DB登録 施設統合マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_VOP_HCO_MERGE]) # DB登録 卸マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_WHS_MST]) # DB登録 卸ホールディングスマスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_HLD_MST]) # DB登録 施設マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_FCL_MST]) # DB登録 メーカー卸組織展開表 - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_MKR_ORG_HORIZON]) # DB登録 取引区分マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_TRAN_KBN_MST]) # DB登録 製品マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_PHM_PRD_MST]) # DB登録 製品価格マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_PHM_PRICE_MST]) # DB登録 卸得意先情報マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_WHS_CUSTOMER_MST]) # DB登録 MDBコード変換マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_MDB_CONV_MST]) # DB登録 生物由来データ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_BIO_SLIP_DATA]) # DB登録 製造ロット番号マスタ - VjskDataLoadManager.Load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) + VjskDataLoadManager.load(target_dict[vjsk_mapper.CONDKEY_LOT_NUM_MST]) logger.debug('_import_file_to_db done') @@ -186,7 +225,7 @@ def _determine_today_is_stockslipdata_target(): today = batch_context.syor_date # S3バケット上の設定ファイル「V実消化卸在庫データ連携日ファイル」をローカルストレージにdownloadする - wholesaler_stock_list_file_path = ConfigBucket().download_wholesaler_stock_list() + wholesaler_stock_list_file_path = ConfigBucket().download_wholesaler_stock_input_day_list() # 設定ファイル「V実消化卸在庫データ連携日ファイル」の定義内容を取得する target_days = CalendarFile(wholesaler_stock_list_file_path) @@ -198,42 +237,3 @@ def _determine_today_is_stockslipdata_target(): raise e logger.debug("_determine_today_is_stockslipdata_target done") return ret - - -def exec(): - """V実消化データ取込処理""" - logger.info('Start Jitsusyouka Torikomi PGM.') - - # 非営業日なら何もせず終了 - if batch_context.is_not_business_day: - logger.debug('非営業日なので処理をスキップ') - return - - # 卸在庫データ取込対象日であれば、卸在庫データ処理対象フラグを立てる - logger.debug('卸在庫データ取込対象日であるかを判定') - batch_context.is_import_target_vjsk_stockslipdata = _determine_today_is_stockslipdata_target() - logger.debug(f'判定結果 : {batch_context.is_import_target_vjsk_stockslipdata}') - if batch_context.is_import_target_vjsk_stockslipdata: - logger.info('卸在庫データ取込対象日です') - - # V実消化データファイル受領チェック - logger.debug('V実消化データファイル受領チェック:開始') - try: - # S3バケットにある受領済のV実消化データファイルの存在チェックをする - _check_received_files() - - except BatchOperationException as e: - logger.debug('受領したV実消化データファイルに未受領もものがあります') - raise e - logger.debug('V実消化データファイル受領チェック:終了') - - # データベース取込 - logger.debug('V実消化データ取込:開始') - try: - # S3バケットにある受領済のV実消化データファイルをデータベースに登録する - _import_file_to_db() - except Exception as e: - logger.debug(f'データベース登録失敗 {e}') - raise e - - logger.debug('V実消化データ取込:終了') diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 27c47ad5..612309d2 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -1,7 +1,7 @@ import textwrap -class VjskRecvFileMapper: +class VjskReceiveFileMapper: CONDKEY_SLIP_DATA = "SLIP_DATA" # 販売実績データ CONDKEY_HLD_MST = "HLD_MST" # V卸ホールディングスマスタ CONDKEY_WHS_MST = "WHS_MST" # V卸マスタ @@ -34,262 +34,262 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.sales ( - REC_DATA - ,REC_WHS_CD - ,REC_WHS_SUB_CD - ,REC_WHS_ORG_CD - ,REC_CUST_CD - ,REC_COMM_CD - ,REC_TRAN_KBN - ,REV_HSDNYMD_WRK - ,REV_HSDNYMD_SRK - ,REC_URAG_NUM - ,REC_QTY - ,REC_NONYU_PRICE - ,REC_NONYU_AMT - ,REC_COMM_NAME - ,REC_NONYU_FCL_NAME - ,FREE_ITEM - ,REC_NONYU_FCL_ADDR - ,REC_NONYU_FCL_POST - ,REC_NONYU_FCL_TEL - ,REC_BEF_HSDN_YMD - ,REC_BEF_SLIP_NUM - ,REC_YMD - ,SALE_DATA_CAT - ,SLIP_FILE_NAME - ,SLIP_MGT_NUM - ,ROW_NUM - ,HSDN_YMD - ,EXEC_DT - ,V_TRAN_CD - ,TRAN_KBN_NAME - ,WHS_ORG_CD - ,V_WHSORG_CD - ,WHS_ORG_NAME - ,WHS_ORG_KN - ,V_WHS_CD - ,WHS_NAME - ,NONYU_FCL_CD - ,V_INST_CD - ,V_INST_KN - ,V_INST_NAME - ,V_INST_ADDR - ,COMM_CD - ,COMM_NAME - ,NONYU_QTY - ,NONYU_PRICE - ,NONYU_AMT - ,SHIKIRI_PRICE - ,SHIKIRI_AMT - ,NHI_PRICE - ,NHI_AMT - ,WHSPOS_ERR_KBN - ,HTDNYMD_ERR_KBN - ,PRD_EXIS_KBN - ,FCL_EXIS_KBN - ,BEF_HSDN_YMD - ,BEF_SLIP_NUM - ,SLIP_ORG_KBN - ,ERR_FLG1 - ,ERR_FLG2 - ,ERR_FLG3 - ,ERR_FLG4 - ,ERR_FLG5 - ,ERR_FLG6 - ,ERR_FLG7 - ,ERR_FLG8 - ,ERR_FLG9 - ,ERR_FLG10 - ,ERR_FLG11 - ,ERR_FLG12 - ,ERR_FLG13 - ,ERR_FLG14 - ,ERR_FLG15 - ,ERR_FLG16 - ,ERR_FLG17 - ,ERR_FLG18 - ,ERR_FLG19 - ,ERR_FLG20 - ,KJYO_YM - ,TKSNBK_KBN - ,FCL_EXEC_KBN - ,REC_STS_KBN - ,INS_DT - ,INS_USR - ,DWH_UPD_DT + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_whs_org_cd + ,rec_cust_cd + ,rec_comm_cd + ,rec_tran_kbn + ,rev_hsdnymd_wrk + ,rev_hsdnymd_srk + ,rec_urag_num + ,rec_qty + ,rec_nonyu_price + ,rec_nonyu_amt + ,rec_comm_name + ,rec_nonyu_fcl_name + ,free_item + ,rec_nonyu_fcl_addr + ,rec_nonyu_fcl_post + ,rec_nonyu_fcl_tel + ,rec_bef_hsdn_ymd + ,rec_bef_slip_num + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,hsdn_ymd + ,exec_dt + ,v_tran_cd + ,tran_kbn_name + ,whs_org_cd + ,v_whsorg_cd + ,whs_org_name + ,whs_org_kn + ,v_whs_cd + ,whs_name + ,nonyu_fcl_cd + ,v_inst_cd + ,v_inst_kn + ,v_inst_name + ,v_inst_addr + ,comm_cd + ,comm_name + ,nonyu_qty + ,nonyu_price + ,nonyu_amt + ,shikiri_price + ,shikiri_amt + ,nhi_price + ,nhi_amt + ,whspos_err_kbn + ,htdnymd_err_kbn + ,prd_exis_kbn + ,fcl_exis_kbn + ,bef_hsdn_ymd + ,bef_slip_num + ,slip_org_kbn + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,err_flg11 + ,err_flg12 + ,err_flg13 + ,err_flg14 + ,err_flg15 + ,err_flg16 + ,err_flg17 + ,err_flg18 + ,err_flg19 + ,err_flg20 + ,kjyo_ym + ,tksnbk_kbn + ,fcl_exec_kbn + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt ) SELECT - t.REC_DATA - ,t.REC_WHS_CD - ,t.REC_WHS_SUB_CD - ,t.REC_WHS_ORG_CD - ,t.REC_CUST_CD - ,t.REC_COMM_CD - ,t.REC_TRAN_KBN - ,t.REV_HSDNYMD_WRK - ,t.REV_HSDNYMD_SRK - ,t.REC_URAG_NUM - ,t.REC_QTY - ,t.REC_NONYU_PRICE - ,t.REC_NONYU_AMT - ,t.REC_COMM_NAME - ,t.REC_NONYU_FCL_NAME - ,t.FREE_ITEM - ,t.REC_NONYU_FCL_ADDR - ,t.REC_NONYU_FCL_POST - ,t.REC_NONYU_FCL_TEL - ,t.REC_BEF_HSDN_YMD - ,t.REC_BEF_SLIP_NUM - ,t.REC_YMD - ,t.SALE_DATA_CAT - ,t.SLIP_FILE_NAME - ,t.SLIP_MGT_NUM - ,t.ROW_NUM - ,t.HSDN_YMD - ,t.EXEC_DT - ,t.V_TRAN_CD - ,t.TRAN_KBN_NAME - ,t.WHS_ORG_CD - ,t.V_WHSORG_CD - ,t.WHS_ORG_NAME - ,t.WHS_ORG_KN - ,t.V_WHS_CD - ,t.WHS_NAME - ,t.NONYU_FCL_CD - ,t.V_INST_CD - ,t.V_INST_KN - ,t.V_INST_NAME - ,t.V_INST_ADDR - ,t.COMM_CD - ,t.COMM_NAME - ,t.NONYU_QTY - ,t.NONYU_PRICE - ,t.NONYU_AMT - ,t.SHIKIRI_PRICE - ,t.SHIKIRI_AMT - ,t.NHI_PRICE - ,t.NHI_AMT - ,t.WHSPOS_ERR_KBN - ,t.HTDNYMD_ERR_KBN - ,t.PRD_EXIS_KBN - ,t.FCL_EXIS_KBN - ,t.BEF_HSDN_YMD - ,t.BEF_SLIP_NUM - ,t.SLIP_ORG_KBN - ,t.ERR_FLG1 - ,t.ERR_FLG2 - ,t.ERR_FLG3 - ,t.ERR_FLG4 - ,t.ERR_FLG5 - ,t.ERR_FLG6 - ,t.ERR_FLG7 - ,t.ERR_FLG8 - ,t.ERR_FLG9 - ,t.ERR_FLG10 - ,t.ERR_FLG11 - ,t.ERR_FLG12 - ,t.ERR_FLG13 - ,t.ERR_FLG14 - ,t.ERR_FLG15 - ,t.ERR_FLG16 - ,t.ERR_FLG17 - ,t.ERR_FLG18 - ,t.ERR_FLG19 - ,t.ERR_FLG20 - ,t.KJYO_YM - ,t.TKSNBK_KBN - ,t.FCL_EXEC_KBN - ,t.REC_STS_KBN - ,t.INS_DT - ,t.INS_USR + t.rec_data + ,t.rec_whs_cd + ,t.rec_whs_sub_cd + ,t.rec_whs_org_cd + ,t.rec_cust_cd + ,t.rec_comm_cd + ,t.rec_tran_kbn + ,t.rev_hsdnymd_wrk + ,t.rev_hsdnymd_srk + ,t.rec_urag_num + ,t.rec_qty + ,t.rec_nonyu_price + ,t.rec_nonyu_amt + ,t.rec_comm_name + ,t.rec_nonyu_fcl_name + ,t.free_item + ,t.rec_nonyu_fcl_addr + ,t.rec_nonyu_fcl_post + ,t.rec_nonyu_fcl_tel + ,t.rec_bef_hsdn_ymd + ,t.rec_bef_slip_num + ,t.rec_ymd + ,t.sale_data_cat + ,t.slip_file_name + ,t.slip_mgt_num + ,t.row_num + ,t.hsdn_ymd + ,t.exec_dt + ,t.v_tran_cd + ,t.tran_kbn_name + ,t.whs_org_cd + ,t.v_whsorg_cd + ,t.whs_org_name + ,t.whs_org_kn + ,t.v_whs_cd + ,t.whs_name + ,t.nonyu_fcl_cd + ,t.v_inst_cd + ,t.v_inst_kn + ,t.v_inst_name + ,t.v_inst_addr + ,t.comm_cd + ,t.comm_name + ,t.nonyu_qty + ,t.nonyu_price + ,t.nonyu_amt + ,t.shikiri_price + ,t.shikiri_amt + ,t.nhi_price + ,t.nhi_amt + ,t.whspos_err_kbn + ,t.htdnymd_err_kbn + ,t.prd_exis_kbn + ,t.fcl_exis_kbn + ,t.bef_hsdn_ymd + ,t.bef_slip_num + ,t.slip_org_kbn + ,t.err_flg1 + ,t.err_flg2 + ,t.err_flg3 + ,t.err_flg4 + ,t.err_flg5 + ,t.err_flg6 + ,t.err_flg7 + ,t.err_flg8 + ,t.err_flg9 + ,t.err_flg10 + ,t.err_flg11 + ,t.err_flg12 + ,t.err_flg13 + ,t.err_flg14 + ,t.err_flg15 + ,t.err_flg16 + ,t.err_flg17 + ,t.err_flg18 + ,t.err_flg19 + ,t.err_flg20 + ,t.kjyo_ym + ,t.tksnbk_kbn + ,t.fcl_exec_kbn + ,t.rec_sts_kbn + ,t.ins_dt + ,t.ins_usr ,SYSDATE() FROM org05.sales AS t ON DUPLICATE KEY UPDATE - REC_DATA=t.REC_DATA - ,REC_WHS_CD=t.REC_WHS_CD - ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD - ,REC_WHS_ORG_CD=t.REC_WHS_ORG_CD - ,REC_CUST_CD=t.REC_CUST_CD - ,REC_COMM_CD=t.REC_COMM_CD - ,REC_TRAN_KBN=t.REC_TRAN_KBN - ,REV_HSDNYMD_WRK=t.REV_HSDNYMD_WRK - ,REV_HSDNYMD_SRK=t.REV_HSDNYMD_SRK - ,REC_URAG_NUM=t.REC_URAG_NUM - ,REC_QTY=t.REC_QTY - ,REC_NONYU_PRICE=t.REC_NONYU_PRICE - ,REC_NONYU_AMT=t.REC_NONYU_AMT - ,REC_COMM_NAME=t.REC_COMM_NAME - ,REC_NONYU_FCL_NAME=t.REC_NONYU_FCL_NAME - ,FREE_ITEM=t.FREE_ITEM - ,REC_NONYU_FCL_ADDR=t.REC_NONYU_FCL_ADDR - ,REC_NONYU_FCL_POST=t.REC_NONYU_FCL_POST - ,REC_NONYU_FCL_TEL=t.REC_NONYU_FCL_TEL - ,REC_BEF_HSDN_YMD=t.REC_BEF_HSDN_YMD - ,REC_BEF_SLIP_NUM=t.REC_BEF_SLIP_NUM - ,REC_YMD=t.REC_YMD - ,SALE_DATA_CAT=t.SALE_DATA_CAT - ,SLIP_FILE_NAME=t.SLIP_FILE_NAME - ,SLIP_MGT_NUM=t.SLIP_MGT_NUM - ,ROW_NUM=t.ROW_NUM - ,HSDN_YMD=t.HSDN_YMD - ,EXEC_DT=t.EXEC_DT - ,V_TRAN_CD=t.V_TRAN_CD - ,TRAN_KBN_NAME=t.TRAN_KBN_NAME - ,WHS_ORG_CD=t.WHS_ORG_CD - ,V_WHSORG_CD=t.V_WHSORG_CD - ,WHS_ORG_NAME=t.WHS_ORG_NAME - ,WHS_ORG_KN=t.WHS_ORG_KN - ,V_WHS_CD=t.V_WHS_CD - ,WHS_NAME=t.WHS_NAME - ,NONYU_FCL_CD=t.NONYU_FCL_CD - ,V_INST_CD=t.V_INST_CD - ,V_INST_KN=t.V_INST_KN - ,V_INST_NAME=t.V_INST_NAME - ,V_INST_ADDR=t.V_INST_ADDR - ,COMM_CD=t.COMM_CD - ,COMM_NAME=t.COMM_NAME - ,NONYU_QTY=t.NONYU_QTY - ,NONYU_PRICE=t.NONYU_PRICE - ,NONYU_AMT=t.NONYU_AMT - ,SHIKIRI_PRICE=t.SHIKIRI_PRICE - ,SHIKIRI_AMT=t.SHIKIRI_AMT - ,NHI_PRICE=t.NHI_PRICE - ,NHI_AMT=t.NHI_AMT - ,WHSPOS_ERR_KBN=t.WHSPOS_ERR_KBN - ,HTDNYMD_ERR_KBN=t.HTDNYMD_ERR_KBN - ,PRD_EXIS_KBN=t.PRD_EXIS_KBN - ,FCL_EXIS_KBN=t.FCL_EXIS_KBN - ,BEF_HSDN_YMD=t.BEF_HSDN_YMD - ,BEF_SLIP_NUM=t.BEF_SLIP_NUM - ,SLIP_ORG_KBN=t.SLIP_ORG_KBN - ,ERR_FLG1=t.ERR_FLG1 - ,ERR_FLG2=t.ERR_FLG2 - ,ERR_FLG3=t.ERR_FLG3 - ,ERR_FLG4=t.ERR_FLG4 - ,ERR_FLG5=t.ERR_FLG5 - ,ERR_FLG6=t.ERR_FLG6 - ,ERR_FLG7=t.ERR_FLG7 - ,ERR_FLG8=t.ERR_FLG8 - ,ERR_FLG9=t.ERR_FLG9 - ,ERR_FLG10=t.ERR_FLG10 - ,ERR_FLG11=t.ERR_FLG11 - ,ERR_FLG12=t.ERR_FLG12 - ,ERR_FLG13=t.ERR_FLG13 - ,ERR_FLG14=t.ERR_FLG14 - ,ERR_FLG15=t.ERR_FLG15 - ,ERR_FLG16=t.ERR_FLG16 - ,ERR_FLG17=t.ERR_FLG17 - ,ERR_FLG18=t.ERR_FLG18 - ,ERR_FLG19=t.ERR_FLG19 - ,ERR_FLG20=t.ERR_FLG20 - ,KJYO_YM=t.KJYO_YM - ,TKSNBK_KBN=t.TKSNBK_KBN - ,FCL_EXEC_KBN=t.FCL_EXEC_KBN - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,INS_USR=t.INS_USR - ,DWH_UPD_DT=SYSDATE() + rec_data=t.rec_data + ,rec_whs_cd=t.rec_whs_cd + ,rec_whs_sub_cd=t.rec_whs_sub_cd + ,rec_whs_org_cd=t.rec_whs_org_cd + ,rec_cust_cd=t.rec_cust_cd + ,rec_comm_cd=t.rec_comm_cd + ,rec_tran_kbn=t.rec_tran_kbn + ,rev_hsdnymd_wrk=t.rev_hsdnymd_wrk + ,rev_hsdnymd_srk=t.rev_hsdnymd_srk + ,rec_urag_num=t.rec_urag_num + ,rec_qty=t.rec_qty + ,rec_nonyu_price=t.rec_nonyu_price + ,rec_nonyu_amt=t.rec_nonyu_amt + ,rec_comm_name=t.rec_comm_name + ,rec_nonyu_fcl_name=t.rec_nonyu_fcl_name + ,free_item=t.free_item + ,rec_nonyu_fcl_addr=t.rec_nonyu_fcl_addr + ,rec_nonyu_fcl_post=t.rec_nonyu_fcl_post + ,rec_nonyu_fcl_tel=t.rec_nonyu_fcl_tel + ,rec_bef_hsdn_ymd=t.rec_bef_hsdn_ymd + ,rec_bef_slip_num=t.rec_bef_slip_num + ,rec_ymd=t.rec_ymd + ,sale_data_cat=t.sale_data_cat + ,slip_file_name=t.slip_file_name + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,hsdn_ymd=t.hsdn_ymd + ,exec_dt=t.exec_dt + ,v_tran_cd=t.v_tran_cd + ,tran_kbn_name=t.tran_kbn_name + ,whs_org_cd=t.whs_org_cd + ,v_whsorg_cd=t.v_whsorg_cd + ,whs_org_name=t.whs_org_name + ,whs_org_kn=t.whs_org_kn + ,v_whs_cd=t.v_whs_cd + ,whs_name=t.whs_name + ,nonyu_fcl_cd=t.nonyu_fcl_cd + ,v_inst_cd=t.v_inst_cd + ,v_inst_kn=t.v_inst_kn + ,v_inst_name=t.v_inst_name + ,v_inst_addr=t.v_inst_addr + ,comm_cd=t.comm_cd + ,comm_name=t.comm_name + ,nonyu_qty=t.nonyu_qty + ,nonyu_price=t.nonyu_price + ,nonyu_amt=t.nonyu_amt + ,shikiri_price=t.shikiri_price + ,shikiri_amt=t.shikiri_amt + ,nhi_price=t.nhi_price + ,nhi_amt=t.nhi_amt + ,whspos_err_kbn=t.whspos_err_kbn + ,htdnymd_err_kbn=t.htdnymd_err_kbn + ,prd_exis_kbn=t.prd_exis_kbn + ,fcl_exis_kbn=t.fcl_exis_kbn + ,bef_hsdn_ymd=t.bef_hsdn_ymd + ,bef_slip_num=t.bef_slip_num + ,slip_org_kbn=t.slip_org_kbn + ,err_flg1=t.err_flg1 + ,err_flg2=t.err_flg2 + ,err_flg3=t.err_flg3 + ,err_flg4=t.err_flg4 + ,err_flg5=t.err_flg5 + ,err_flg6=t.err_flg6 + ,err_flg7=t.err_flg7 + ,err_flg8=t.err_flg8 + ,err_flg9=t.err_flg9 + ,err_flg10=t.err_flg10 + ,err_flg11=t.err_flg11 + ,err_flg12=t.err_flg12 + ,err_flg13=t.err_flg13 + ,err_flg14=t.err_flg14 + ,err_flg15=t.err_flg15 + ,err_flg16=t.err_flg16 + ,err_flg17=t.err_flg17 + ,err_flg18=t.err_flg18 + ,err_flg19=t.err_flg19 + ,err_flg20=t.err_flg20 + ,kjyo_ym=t.kjyo_ym + ,tksnbk_kbn=t.tksnbk_kbn + ,fcl_exec_kbn=t.fcl_exec_kbn + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,ins_usr=t.ins_usr + ,dwh_upd_dT=SYSDATE() ; """) }, @@ -303,46 +303,46 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.hld_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.hld_mst_v ( - V_HLD_CD - ,SUB_NUM - ,NAME - ,KN_NAME - ,ABB_NAME - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + v_hld_cd + ,sub_num + ,name + ,kn_name + ,abb_name + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.V_HLD_CD - ,t.SUB_NUM - ,t.NAME - ,t.KN_NAME - ,t.ABB_NAME - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.v_hld_cd + ,t.sub_num + ,t.name + ,t.kn_name + ,t.abb_name + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.hld_mst_v AS t ON DUPLICATE KEY UPDATE - V_HLD_CD=t.V_HLD_CD - ,SUB_NUM=t.SUB_NUM - ,NAME=t.NAME - ,KN_NAME=t.KN_NAME - ,ABB_NAME=t.ABB_NAME - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + v_hld_cd=t.v_hld_cd + ,sub_num=t.sub_num + ,name=t.name + ,kn_name=t.kn_name + ,abb_name=t.abb_name + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -356,61 +356,61 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.whs_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.whs_mst_v ( - V_WHS_CD - ,SUB_NUM - ,NAME - ,KN_NAME - ,ABB_NAME - ,POSTAL_CD - ,ADDR - ,KN_ADDR - ,TEL_NUM - ,V_HLD_CD - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + v_whs_cd + ,sub_num + ,name + ,kn_name + ,abb_name + ,postal_cd + ,addr + ,kn_addr + ,tel_num + ,v_hld_cd + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.V_WHS_CD - ,t.SUB_NUM - ,t.NAME - ,t.KN_NAME - ,t.ABB_NAME - ,t.POSTAL_CD - ,t.ADDR - ,t.KN_ADDR - ,t.TEL_NUM - ,t.V_HLD_CD - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.v_whs_cd + ,t.sub_num + ,t.name + ,t.kn_name + ,t.abb_name + ,t.postal_cd + ,t.addr + ,t.kn_addr + ,t.tel_num + ,t.v_hld_cd + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.whs_mst_v AS t ON DUPLICATE KEY UPDATE - V_WHS_CD=t.V_WHS_CD - ,SUB_NUM=t.SUB_NUM - ,NAME=t.NAME - ,KN_NAME=t.KN_NAME - ,ABB_NAME=t.ABB_NAME - ,POSTAL_CD=t.POSTAL_CD - ,ADDR=t.ADDR - ,KN_ADDR=t.KN_ADDR - ,TEL_NUM=t.TEL_NUM - ,V_HLD_CD=t.V_HLD_CD - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + v_whs_cd=t.v_whs_cd + ,sub_num=t.sub_num + ,name=t.name + ,kn_name=t.kn_name + ,abb_name=t.abb_name + ,postal_cd=t.postal_cd + ,addr=t.addr + ,kn_addr=t.kn_addr + ,tel_num=t.tel_num + ,v_hld_cd=t.v_hld_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -424,151 +424,151 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.mkr_org_horizon_v ( - VID_KIND_1 - ,V_CD_1 - ,NAME_1 - ,DSP_ODR_1 - ,VID_KIND_2 - ,V_CD_2 - ,NAME_2 - ,DSP_ODR_2 - ,VID_KIND_3 - ,V_CD_3 - ,NAME_3 - ,DSP_ODR_3 - ,VID_KIND_4 - ,V_CD_4 - ,NAME_4 - ,DSP_ODR_4 - ,VID_KIND_5 - ,V_CD_5 - ,NAME_5 - ,DSP_ODR_5 - ,VID_KIND_6 - ,V_CD_6 - ,NAME_6 - ,DSP_ODR_6 - ,VID_KIND_7 - ,V_CD_7 - ,NAME_7 - ,DSP_ODR_7 - ,VID_KIND_8 - ,V_CD_8 - ,NAME_8 - ,DSP_ODR_8 - ,VID_KIND_9 - ,V_CD_9 - ,NAME_9 - ,DSP_ODR_9 - ,VID_KIND_10 - ,V_CD_10 - ,NAME_10 - ,DSP_ODR_10 - ,V_WHS_CD - ,START_DATE - ,END_DATE - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + vid_kind_1 + ,v_cd_1 + ,name_1 + ,dsp_odr_1 + ,vid_kind_2 + ,v_cd_2 + ,name_2 + ,dsp_odr_2 + ,vid_kind_3 + ,v_cd_3 + ,name_3 + ,dsp_odr_3 + ,vid_kind_4 + ,v_cd_4 + ,name_4 + ,dsp_odr_4 + ,vid_kind_5 + ,v_cd_5 + ,name_5 + ,dsp_odr_5 + ,vid_kind_6 + ,v_cd_6 + ,name_6 + ,dsp_odr_6 + ,vid_kind_7 + ,v_cd_7 + ,name_7 + ,dsp_odr_7 + ,vid_kind_8 + ,v_cd_8 + ,name_8 + ,dsp_odr_8 + ,vid_kind_9 + ,v_cd_9 + ,name_9 + ,dsp_odr_9 + ,vid_kind_10 + ,v_cd_10 + ,name_10 + ,dsp_odr_10 + ,v_whs_cd + ,start_date + ,end_date + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.VID_KIND_1 - ,t.V_CD_1 - ,t.NAME_1 - ,t.DSP_ODR_1 - ,t.VID_KIND_2 - ,t.V_CD_2 - ,t.NAME_2 - ,t.DSP_ODR_2 - ,t.VID_KIND_3 - ,t.V_CD_3 - ,t.NAME_3 - ,t.DSP_ODR_3 - ,t.VID_KIND_4 - ,t.V_CD_4 - ,t.NAME_4 - ,t.DSP_ODR_4 - ,t.VID_KIND_5 - ,t.V_CD_5 - ,t.NAME_5 - ,t.DSP_ODR_5 - ,t.VID_KIND_6 - ,t.V_CD_6 - ,t.NAME_6 - ,t.DSP_ODR_6 - ,t.VID_KIND_7 - ,t.V_CD_7 - ,t.NAME_7 - ,t.DSP_ODR_7 - ,t.VID_KIND_8 - ,t.V_CD_8 - ,t.NAME_8 - ,t.DSP_ODR_8 - ,t.VID_KIND_9 - ,t.V_CD_9 - ,t.NAME_9 - ,t.DSP_ODR_9 - ,t.VID_KIND_10 - ,t.V_CD_10 - ,t.NAME_10 - ,t.DSP_ODR_10 - ,t.V_WHS_CD - ,t.START_DATE - ,t.END_DATE - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.vid_kind_1 + ,t.v_cd_1 + ,t.name_1 + ,t.dsp_odr_1 + ,t.vid_kind_2 + ,t.v_cd_2 + ,t.name_2 + ,t.dsp_odr_2 + ,t.vid_kind_3 + ,t.v_cd_3 + ,t.name_3 + ,t.dsp_odr_3 + ,t.vid_kind_4 + ,t.v_cd_4 + ,t.name_4 + ,t.dsp_odr_4 + ,t.vid_kind_5 + ,t.v_cd_5 + ,t.name_5 + ,t.dsp_odr_5 + ,t.vid_kind_6 + ,t.v_cd_6 + ,t.name_6 + ,t.dsp_odr_6 + ,t.vid_kind_7 + ,t.v_cd_7 + ,t.name_7 + ,t.dsp_odr_7 + ,t.vid_kind_8 + ,t.v_cd_8 + ,t.name_8 + ,t.dsp_odr_8 + ,t.vid_kind_9 + ,t.v_cd_9 + ,t.name_9 + ,t.dsp_odr_9 + ,t.vid_kind_10 + ,t.v_cd_10 + ,t.name_10 + ,t.dsp_odr_10 + ,t.v_whs_cd + ,t.start_date + ,t.end_date + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.mkr_org_horizon_v AS t ON DUPLICATE KEY UPDATE - VID_KIND_1=t.VID_KIND_1 - ,V_CD_1=t.V_CD_1 - ,NAME_1=t.NAME_1 - ,DSP_ODR_1=t.DSP_ODR_1 - ,VID_KIND_2=t.VID_KIND_2 - ,V_CD_2=t.V_CD_2 - ,NAME_2=t.NAME_2 - ,DSP_ODR_2=t.DSP_ODR_2 - ,VID_KIND_3=t.VID_KIND_3 - ,V_CD_3=t.V_CD_3 - ,NAME_3=t.NAME_3 - ,DSP_ODR_3=t.DSP_ODR_3 - ,VID_KIND_4=t.VID_KIND_4 - ,V_CD_4=t.V_CD_4 - ,NAME_4=t.NAME_4 - ,DSP_ODR_4=t.DSP_ODR_4 - ,VID_KIND_5=t.VID_KIND_5 - ,V_CD_5=t.V_CD_5 - ,NAME_5=t.NAME_5 - ,DSP_ODR_5=t.DSP_ODR_5 - ,VID_KIND_6=t.VID_KIND_6 - ,V_CD_6=t.V_CD_6 - ,NAME_6=t.NAME_6 - ,DSP_ODR_6=t.DSP_ODR_6 - ,VID_KIND_7=t.VID_KIND_7 - ,V_CD_7=t.V_CD_7 - ,NAME_7=t.NAME_7 - ,DSP_ODR_7=t.DSP_ODR_7 - ,VID_KIND_8=t.VID_KIND_8 - ,V_CD_8=t.V_CD_8 - ,NAME_8=t.NAME_8 - ,DSP_ODR_8=t.DSP_ODR_8 - ,VID_KIND_9=t.VID_KIND_9 - ,V_CD_9=t.V_CD_9 - ,NAME_9=t.NAME_9 - ,DSP_ODR_9=t.DSP_ODR_9 - ,VID_KIND_10=t.VID_KIND_10 - ,V_CD_10=t.V_CD_10 - ,NAME_10=t.NAME_10 - ,DSP_ODR_10=t.DSP_ODR_10 - ,V_WHS_CD=t.V_WHS_CD - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + vid_kind_1=t.vid_kind_1 + ,v_cd_1=t.v_cd_1 + ,name_1=t.name_1 + ,dsp_odr_1=t.dsp_odr_1 + ,vid_kind_2=t.vid_kind_2 + ,v_cd_2=t.v_cd_2 + ,name_2=t.name_2 + ,dsp_odr_2=t.dsp_odr_2 + ,vid_kind_3=t.vid_kind_3 + ,v_cd_3=t.v_cd_3 + ,name_3=t.name_3 + ,dsp_odr_3=t.dsp_odr_3 + ,vid_kind_4=t.vid_kind_4 + ,v_cd_4=t.v_cd_4 + ,name_4=t.name_4 + ,dsp_odr_4=t.dsp_odr_4 + ,vid_kind_5=t.vid_kind_5 + ,v_cd_5=t.v_cd_5 + ,name_5=t.name_5 + ,dsp_odr_5=t.dsp_odr_5 + ,vid_kind_6=t.vid_kind_6 + ,v_cd_6=t.v_cd_6 + ,name_6=t.name_6 + ,dsp_odr_6=t.dsp_odr_6 + ,vid_kind_7=t.vid_kind_7 + ,v_cd_7=t.v_cd_7 + ,name_7=t.name_7 + ,dsp_odr_7=t.dsp_odr_7 + ,vid_kind_8=t.vid_kind_8 + ,v_cd_8=t.v_cd_8 + ,name_8=t.name_8 + ,dsp_odr_8=t.dsp_odr_8 + ,vid_kind_9=t.vid_kind_9 + ,v_cd_9=t.v_cd_9 + ,name_9=t.name_9 + ,dsp_odr_9=t.dsp_odr_9 + ,vid_kind_10=t.vid_kind_10 + ,v_cd_10=t.v_cd_10 + ,name_10=t.name_10 + ,dsp_odr_10=t.dsp_odr_10 + ,v_whs_cd=t.v_whs_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -582,46 +582,46 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.org_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.org_cnv_mst_v ( - WHS_CD - ,WHS_SUB_CD - ,ORG_CD - ,SUB_NUM - ,V_ORG_CD - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + whs_cd + ,whs_sub_cd + ,org_cd + ,sub_num + ,v_org_cd + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.WHS_CD - ,t.WHS_SUB_CD - ,t.ORG_CD - ,t.SUB_NUM - ,t.V_ORG_CD - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.whs_cd + ,t.whs_sub_cd + ,t.org_cd + ,t.sub_num + ,t.v_org_cd + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.org_cnv_mst_v AS t ON DUPLICATE KEY UPDATE - WHS_CD=t.WHS_CD - ,WHS_SUB_CD=t.WHS_SUB_CD - ,ORG_CD=t.ORG_CD - ,SUB_NUM=t.SUB_NUM - ,V_ORG_CD=t.V_ORG_CD - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + whs_cd=t.whs_cd + ,whs_sub_cd=t.whs_sub_cd + ,org_cd=t.org_cd + ,sub_num=t.sub_num + ,v_org_cd=t.v_org_cd + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -635,40 +635,40 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.tran_kbn_mst_v ( - V_TRAN_CD - ,SUB_NUM - ,NAME - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + v_tran_cd + ,sub_num + ,name + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.V_TRAN_CD - ,t.SUB_NUM - ,t.NAME - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.v_tran_cd + ,t.sub_num + ,t.name + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.tran_kbn_mst_v AS t ON DUPLICATE KEY UPDATE - V_TRAN_CD=t.V_TRAN_CD - ,SUB_NUM=t.SUB_NUM - ,NAME=t.NAME - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + v_tran_cd=t.v_tran_cd + ,sub_num=t.sub_num + ,name=t.name + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -682,85 +682,85 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.fcl_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.fcl_mst_v ( - V_INST_CD - ,SUB_NUM - ,START_DATE - ,END_DATE - ,CLOSED_DT - ,FCL_NAME - ,FCL_KN_NAME - ,FCL_ABB_NAME - ,FCL_ABB_KN_NAME - ,MKR_CD - ,JSK_PROC_KBN - ,FMT_ADDR - ,FMT_KN_ADDR - ,POSTAL_CD - ,PRFT_CD - ,PRFT_NAME - ,CITY_NAME - ,ADDR_LINE_1 - ,TEL_NUM - ,ADMIN_KBN - ,FCL_TYPE - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + v_inst_cd + ,sub_num + ,start_date + ,end_date + ,closed_dt + ,fcl_name + ,fcl_kn_name + ,fcl_abb_name + ,fcl_abb_kn_name + ,mkr_cd + ,jsk_proc_kbn + ,fmt_addr + ,fmt_kn_addr + ,postal_cd + ,prft_cd + ,prft_name + ,city_name + ,addr_line_1 + ,tel_num + ,admin_kbn + ,fcl_type + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.V_INST_CD - ,t.SUB_NUM - ,t.START_DATE - ,t.END_DATE - ,t.CLOSED_DT - ,t.FCL_NAME - ,t.FCL_KN_NAME - ,t.FCL_ABB_NAME - ,t.FCL_ABB_KN_NAME - ,t.MKR_CD - ,t.JSK_PROC_KBN - ,t.FMT_ADDR - ,t.FMT_KN_ADDR - ,t.POSTAL_CD - ,t.PRFT_CD - ,t.PRFT_NAME - ,t.CITY_NAME - ,t.ADDR_LINE_1 - ,t.TEL_NUM - ,t.ADMIN_KBN - ,t.FCL_TYPE - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.v_inst_cd + ,t.sub_num + ,t.start_date + ,t.end_date + ,t.closed_dt + ,t.fcl_name + ,t.fcl_kn_name + ,t.fcl_abb_name + ,t.fcl_abb_kn_name + ,t.mkr_cd + ,t.jsk_proc_kbn + ,t.fmt_addr + ,t.fmt_kn_addr + ,t.postal_cd + ,t.prft_cd + ,t.prft_name + ,t.city_name + ,t.addr_line_1 + ,t.tel_num + ,t.admin_kbn + ,t.fcl_type + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.fcl_mst_v AS t ON DUPLICATE KEY UPDATE - V_INST_CD=t.V_INST_CD - ,SUB_NUM=t.SUB_NUM - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,CLOSED_DT=t.CLOSED_DT - ,FCL_NAME=t.FCL_NAME - ,FCL_KN_NAME=t.FCL_KN_NAME - ,FCL_ABB_NAME=t.FCL_ABB_NAME - ,FCL_ABB_KN_NAME=t.FCL_ABB_KN_NAME - ,MKR_CD=t.MKR_CD - ,JSK_PROC_KBN=t.JSK_PROC_KBN - ,FMT_ADDR=t.FMT_ADDR - ,FMT_KN_ADDR=t.FMT_KN_ADDR - ,POSTAL_CD=t.POSTAL_CD - ,PRFT_CD=t.PRFT_CD - ,PRFT_NAME=t.PRFT_NAME - ,CITY_NAME=t.CITY_NAME - ,ADDR_LINE_1=t.ADDR_LINE_1 - ,TEL_NUM=t.TEL_NUM - ,ADMIN_KBN=t.ADMIN_KBN - ,FCL_TYPE=t.FCL_TYPE - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + v_inst_cd=t.v_inst_cd + ,sub_num=t.sub_num + ,start_date=t.start_date + ,end_date=t.end_date + ,closed_dt=t.closed_dt + ,fcl_name=t.fcl_name + ,fcl_kn_name=t.fcl_kn_name + ,fcl_abb_name=t.fcl_abb_name + ,fcl_abb_kn_name=t.fcl_abb_kn_name + ,mkr_cd=t.mkr_cd + ,jsk_proc_kbn=t.jsk_proc_kbn + ,fmt_addr=t.fmt_addr + ,fmt_kn_addr=t.fmt_kn_addr + ,postal_cd=t.postal_cd + ,prft_cd=t.prft_cd + ,prft_name=t.prft_name + ,city_name=t.city_name + ,addr_line_1=t.addr_line_1 + ,tel_num=t.tel_num + ,admin_kbn=t.admin_kbn + ,fcl_type=t.fcl_type + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -774,97 +774,97 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.phm_prd_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.phm_prd_mst_v ( - PRD_CD - ,SUB_NUM - ,PRD_NAME - ,PRD_E_NAME - ,MKR_CD - ,MKR_INF_1 - ,MKR_INF_2 - ,PHM_ITM_CD - ,ITM_NAME - ,ITM_ABB_NAME - ,FORM_CD - ,FORM_NAME - ,VOL_CD - ,VOL_NAME - ,CONT_CD - ,CONT_NAME - ,PKG_CD - ,PKG_NAME - ,CNV_NUM - ,JSK_START_DT - ,PRD_SALE_KBN - ,JSK_PROC_KBN - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + prd_cd + ,sub_num + ,prd_name + ,prd_e_name + ,mkr_cd + ,mkr_inf_1 + ,mkr_inf_2 + ,phm_itm_cd + ,itm_name + ,itm_abb_name + ,form_cd + ,form_name + ,vol_cd + ,vol_name + ,cont_cd + ,cont_name + ,pkg_cd + ,pkg_name + ,cnv_num + ,jsk_start_dt + ,prd_sale_kbn + ,jsk_proc_kbn + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.PRD_CD - ,t.SUB_NUM - ,t.PRD_NAME - ,t.PRD_E_NAME - ,t.MKR_CD - ,t.MKR_INF_1 - ,t.MKR_INF_2 - ,t.PHM_ITM_CD - ,t.ITM_NAME - ,t.ITM_ABB_NAME - ,t.FORM_CD - ,t.FORM_NAME - ,t.VOL_CD - ,t.VOL_NAME - ,t.CONT_CD - ,t.CONT_NAME - ,t.PKG_CD - ,t.PKG_NAME - ,t.CNV_NUM - ,nullif(t.JSK_START_DT, 0) - ,t.PRD_SALE_KBN - ,t.JSK_PROC_KBN - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.prd_cd + ,t.sub_num + ,t.prd_name + ,t.prd_e_name + ,t.mkr_cd + ,t.mkr_inf_1 + ,t.mkr_inf_2 + ,t.phm_itm_cd + ,t.itm_name + ,t.itm_abb_name + ,t.form_cd + ,t.form_name + ,t.vol_cd + ,t.vol_name + ,t.cont_cd + ,t.cont_name + ,t.pkg_cd + ,t.pkg_name + ,t.cnv_num + ,nullif(t.jsk_start_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する + ,t.prd_sale_kbn + ,t.jsk_proc_kbn + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.phm_prd_mst_v AS t ON DUPLICATE KEY UPDATE - PRD_CD=t.PRD_CD - ,SUB_NUM=t.SUB_NUM - ,PRD_NAME=t.PRD_NAME - ,PRD_E_NAME=t.PRD_E_NAME - ,MKR_CD=t.MKR_CD - ,MKR_INF_1=t.MKR_INF_1 - ,MKR_INF_2=t.MKR_INF_2 - ,PHM_ITM_CD=t.PHM_ITM_CD - ,ITM_NAME=t.ITM_NAME - ,ITM_ABB_NAME=t.ITM_ABB_NAME - ,FORM_CD=t.FORM_CD - ,FORM_NAME=t.FORM_NAME - ,VOL_CD=t.VOL_CD - ,VOL_NAME=t.VOL_NAME - ,CONT_CD=t.CONT_CD - ,CONT_NAME=t.CONT_NAME - ,PKG_CD=t.PKG_CD - ,PKG_NAME=t.PKG_NAME - ,CNV_NUM=t.CNV_NUM - ,JSK_START_DT=nullif(t.JSK_START_DT, 0) - ,PRD_SALE_KBN=t.PRD_SALE_KBN - ,JSK_PROC_KBN=t.JSK_PROC_KBN - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + prd_cd=t.prd_cd + ,sub_num=t.sub_num + ,prd_name=t.prd_name + ,prd_e_name=t.prd_e_name + ,mkr_cd=t.mkr_cd + ,mkr_inf_1=t.mkr_inf_1 + ,mkr_inf_2=t.mkr_inf_2 + ,phm_itm_cd=t.phm_itm_cd + ,itm_name=t.itm_name + ,itm_abb_name=t.itm_abb_name + ,form_cd=t.form_cd + ,form_name=t.form_name + ,vol_cd=t.vol_cd + ,vol_name=t.vol_name + ,cont_cd=t.cont_cd + ,cont_name=t.cont_name + ,pkg_cd=t.pkg_cd + ,pkg_name=t.pkg_name + ,cnv_num=t.cnv_num + ,jsk_start_dt=nullif(t.jsk_start_dt, 0) + ,prd_sale_kbn=t.prd_sale_kbn + ,jsk_proc_kbn=t.jsk_proc_kbn + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -878,43 +878,43 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.phm_price_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.phm_price_mst_v ( - PHM_PRD_CD - ,PHM_PRICE_KIND - ,SUB_NUM - ,PRICE - ,START_DATE - ,END_DATE - ,DSP_ODR - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + phm_prd_cd + ,phm_price_kind + ,sub_num + ,price + ,start_date + ,end_date + ,dsp_odr + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.PHM_PRD_CD - ,t.PHM_PRICE_KIND - ,t.SUB_NUM - ,t.PRICE - ,t.START_DATE - ,t.END_DATE - ,t.DSP_ODR - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.phm_prd_cd + ,t.phm_price_kind + ,t.sub_num + ,t.price + ,t.start_date + ,t.end_date + ,t.dsp_odr + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.phm_price_mst_v AS t ON DUPLICATE KEY UPDATE - PHM_PRD_CD=t.PHM_PRD_CD - ,PHM_PRICE_KIND=t.PHM_PRICE_KIND - ,SUB_NUM=t.SUB_NUM - ,PRICE=t.PRICE - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,DSP_ODR=t.DSP_ODR - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + phm_prd_cd=t.phm_prd_cd + ,phm_price_kind=t.phm_price_kind + ,sub_num=t.sub_num + ,price=t.price + ,start_date=t.start_date + ,end_date=t.end_date + ,dsp_odr=t.dsp_odr + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -928,25 +928,25 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.vop_hco_merge_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.vop_hco_merge_v ( - V_INST_CD - ,V_INST_CD_MERG - ,APPLY_DT - ,MERGE_REASON - ,DWH_UPD_DT + v_inst_cd + ,v_inst_cd_merg + ,apply_dt + ,merge_reason + ,dwh_upd_dt ) SELECT - t.V_INST_CD - ,t.V_INST_CD_MERG - ,t.APPLY_DT - ,t.MERGE_REASON + t.v_inst_cd + ,t.v_inst_cd_merg + ,t.apply_dt + ,t.merge_reason ,SYSDATE() FROM org05.vop_hco_merge_v AS t ON DUPLICATE KEY UPDATE - V_INST_CD=t.V_INST_CD - ,V_INST_CD_MERG=t.V_INST_CD_MERG - ,APPLY_DT=t.APPLY_DT - ,MERGE_REASON=t.MERGE_REASON - ,DWH_UPD_DT=SYSDATE() + v_inst_cd=t.v_inst_cd + ,v_inst_cd_merg=t.v_inst_cd_merg + ,apply_dt=t.apply_dt + ,merge_reason=t.merge_reason + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -960,64 +960,64 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.whs_customer_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.whs_customer_mst_v ( - WHS_CD - ,WHS_SUB_CD - ,CUSTOMER_CD - ,SUB_NUM - ,START_DATE - ,END_DATE - ,WHS_ORG_CD - ,SRC_ORG_CD - ,NAME - ,KN_NAME - ,ADDR - ,KN_ADDR - ,POSTAL_CD - ,TEL_NUM - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + whs_cd + ,whs_sub_cd + ,customer_cd + ,sub_num + ,start_date + ,end_date + ,whs_org_cd + ,src_org_cd + ,name + ,kn_name + ,addr + ,kn_addr + ,postal_cd + ,tel_num + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.WHS_CD - ,t.WHS_SUB_CD - ,t.CUSTOMER_CD - ,t.SUB_NUM - ,t.START_DATE - ,t.END_DATE - ,t.WHS_ORG_CD - ,t.SRC_ORG_CD - ,t.NAME - ,t.KN_NAME - ,t.ADDR - ,t.KN_ADDR - ,t.POSTAL_CD - ,t.TEL_NUM - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.whs_cd + ,t.whs_sub_cd + ,t.customer_cd + ,t.sub_num + ,t.start_date + ,t.end_date + ,t.whs_org_cd + ,t.src_org_cd + ,t.name + ,t.kn_name + ,t.addr + ,t.kn_addr + ,t.postal_cd + ,t.tel_num + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.whs_customer_mst_v AS t ON DUPLICATE KEY UPDATE - WHS_CD=t.WHS_CD - ,WHS_SUB_CD=t.WHS_SUB_CD - ,CUSTOMER_CD=t.CUSTOMER_CD - ,SUB_NUM=t.SUB_NUM - ,START_DATE=t.START_DATE - ,END_DATE=t.END_DATE - ,WHS_ORG_CD=t.WHS_ORG_CD - ,SRC_ORG_CD=t.SRC_ORG_CD - ,NAME=t.NAME - ,KN_NAME=t.KN_NAME - ,ADDR=t.ADDR - ,KN_ADDR=t.KN_ADDR - ,POSTAL_CD=t.POSTAL_CD - ,TEL_NUM=t.TEL_NUM - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + whs_cd=t.whs_cd + ,whs_sub_cd=t.whs_sub_cd + ,customer_cd=t.customer_cd + ,sub_num=t.sub_num + ,start_date=t.start_date + ,end_date=t.end_date + ,whs_org_cd=t.whs_org_cd + ,src_org_cd=t.src_org_cd + ,name=t.name + ,kn_name=t.kn_name + ,addr=t.addr + ,kn_addr=t.kn_addr + ,postal_cd=t.postal_cd + ,tel_num=t.tel_num + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -1031,37 +1031,37 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.mdb_cnv_mst_v ( - HCO_VID_V - ,SUB_NUM - ,MDB_CD - ,RELIABILITY - ,START_DATE - ,REC_STS_KBN - ,INS_DT - ,UPD_DT - ,DWH_UPD_DT + hco_vid_v + ,sub_num + ,mdb_cd + ,reliability + ,start_date + ,rec_sts_kbn + ,ins_dt + ,upd_dt + ,dwh_upd_dt ) SELECT - t.HCO_VID_V - ,t.SUB_NUM - ,t.MDB_CD - ,t.RELIABILITY - ,t.START_DATE - ,t.REC_STS_KBN - ,t.INS_DT - ,t.UPD_DT + t.hco_vid_v + ,t.sub_num + ,t.mdb_cd + ,t.reliability + ,t.start_date + ,t.rec_sts_kbn + ,t.ins_dt + ,t.upd_dt ,SYSDATE() FROM org05.mdb_cnv_mst_v AS t ON DUPLICATE KEY UPDATE - HCO_VID_V=t.HCO_VID_V - ,SUB_NUM=t.SUB_NUM - ,MDB_CD=t.MDB_CD - ,RELIABILITY=t.RELIABILITY - ,START_DATE=t.START_DATE - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,UPD_DT=t.UPD_DT - ,DWH_UPD_DT=SYSDATE() + hco_vid_v=t.hco_vid_v + ,sub_num=t.sub_num + ,mdb_cd=t.mdb_cd + ,reliability=t.reliability + ,start_date=t.start_date + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,upd_dt=t.upd_dt + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -1075,100 +1075,100 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.whole_stock", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.whole_stock ( - REC_DATA - ,REC_WHS_CD - ,REC_WHS_SUB_CD - ,REC_STO_PLACE - ,REC_STOCK_YMD - ,REC_COMM_CD - ,REC_QTY - ,REC_STOCK_NO_SIGN - ,REC_JAN_CD - ,FREE_ITEM - ,REC_YMD - ,SALE_DATA_CAT - ,SLIP_FILE_NAME - ,SLIP_MGT_NUM - ,ROW_NUM - ,EXEC_DT - ,ERR_FLG1 - ,ERR_FLG2 - ,ERR_FLG3 - ,ERR_FLG4 - ,ERR_FLG5 - ,ERR_FLG6 - ,ERR_FLG7 - ,ERR_FLG8 - ,ERR_FLG9 - ,ERR_FLG10 - ,REC_STS_KBN - ,INS_DT - ,INS_USR - ,DWH_UPD_DT + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_sto_place + ,rec_stock_ymd + ,rec_comm_cd + ,rec_qty + ,rec_stock_no_sign + ,rec_jan_cd + ,free_item + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,exec_dt + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt ) SELECT - t.REC_DATA - ,t.REC_WHS_CD - ,t.REC_WHS_SUB_CD - ,t.REC_STO_PLACE - ,t.REC_STOCK_YMD - ,t.REC_COMM_CD - ,t.REC_QTY - ,t.REC_STOCK_NO_SIGN - ,t.REC_JAN_CD - ,t.FREE_ITEM - ,t.REC_YMD - ,t.SALE_DATA_CAT - ,t.SLIP_FILE_NAME - ,t.SLIP_MGT_NUM - ,t.ROW_NUM - ,t.EXEC_DT - ,t.ERR_FLG1 - ,t.ERR_FLG2 - ,t.ERR_FLG3 - ,t.ERR_FLG4 - ,t.ERR_FLG5 - ,t.ERR_FLG6 - ,t.ERR_FLG7 - ,t.ERR_FLG8 - ,t.ERR_FLG9 - ,t.ERR_FLG10 - ,t.REC_STS_KBN - ,t.INS_DT - ,t.INS_USR + t.rec_data + ,t.rec_whs_cd + ,t.rec_whs_sub_cd + ,t.rec_sto_place + ,t.rec_stock_ymd + ,t.rec_comm_cd + ,t.rec_qty + ,t.rec_stock_no_sign + ,t.rec_jan_cd + ,t.free_item + ,t.rec_ymd + ,t.sale_data_cat + ,t.slip_file_name + ,t.slip_mgt_num + ,t.row_num + ,t.exec_dt + ,t.err_flg1 + ,t.err_flg2 + ,t.err_flg3 + ,t.err_flg4 + ,t.err_flg5 + ,t.err_flg6 + ,t.err_flg7 + ,t.err_flg8 + ,t.err_flg9 + ,t.err_flg10 + ,t.rec_sts_kbn + ,t.ins_dt + ,t.ins_usr ,SYSDATE() FROM org05.whole_stock AS t ON DUPLICATE KEY UPDATE - REC_DATA=t.REC_DATA - ,REC_WHS_CD=t.REC_WHS_CD - ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD - ,REC_STO_PLACE=t.REC_STO_PLACE - ,REC_STOCK_YMD=t.REC_STOCK_YMD - ,REC_COMM_CD=t.REC_COMM_CD - ,REC_QTY=t.REC_QTY - ,REC_STOCK_NO_SIGN=t.REC_STOCK_NO_SIGN - ,REC_JAN_CD=t.REC_JAN_CD - ,FREE_ITEM=t.FREE_ITEM - ,REC_YMD=t.REC_YMD - ,SALE_DATA_CAT=t.SALE_DATA_CAT - ,SLIP_FILE_NAME=t.SLIP_FILE_NAME - ,SLIP_MGT_NUM=t.SLIP_MGT_NUM - ,ROW_NUM=t.ROW_NUM - ,EXEC_DT=t.EXEC_DT - ,ERR_FLG1=t.ERR_FLG1 - ,ERR_FLG2=t.ERR_FLG2 - ,ERR_FLG3=t.ERR_FLG3 - ,ERR_FLG4=t.ERR_FLG4 - ,ERR_FLG5=t.ERR_FLG5 - ,ERR_FLG6=t.ERR_FLG6 - ,ERR_FLG7=t.ERR_FLG7 - ,ERR_FLG8=t.ERR_FLG8 - ,ERR_FLG9=t.ERR_FLG9 - ,ERR_FLG10=t.ERR_FLG10 - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,INS_USR=t.INS_USR - ,DWH_UPD_DT=SYSDATE() + rec_data=t.rec_data + ,rec_whs_cd=t.rec_whs_cd + ,rec_whs_sub_cd=t.rec_whs_sub_cd + ,rec_sto_place=t.rec_sto_place + ,rec_stock_ymd=t.rec_stock_ymd + ,rec_comm_cd=t.rec_comm_cd + ,rec_qty=t.rec_qty + ,rec_stock_no_sign=t.rec_stock_no_sign + ,rec_jan_cd=t.rec_jan_cd + ,free_item=t.free_item + ,rec_ymd=t.rec_ymd + ,sale_data_cat=t.sale_data_cat + ,slip_file_name=t.slip_file_name + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,exec_dt=t.exec_dt + ,err_flg1=t.err_flg1 + ,err_flg2=t.err_flg2 + ,err_flg3=t.err_flg3 + ,err_flg4=t.err_flg4 + ,err_flg5=t.err_flg5 + ,err_flg6=t.err_flg6 + ,err_flg7=t.err_flg7 + ,err_flg8=t.err_flg8 + ,err_flg9=t.err_flg9 + ,err_flg10=t.err_flg10 + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,ins_usr=t.ins_usr + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -1182,247 +1182,247 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.bio_sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.bio_sales ( - REC_DATA - ,REC_WHS_CD - ,REC_WHS_SUB_CD - ,REC_WHS_ORG_CD - ,REC_CUST_CD - ,REC_COMM_CD - ,REC_TRAN_KBN - ,REV_HSDNYMD_WRK - ,REV_HSDNYMD_SRK - ,REC_URAG_NUM - ,REC_COMM_NAME - ,REC_NONYU_FCL_NAME - ,REC_NONYU_FCL_ADDR - ,REC_LOT_NUM1 - ,REC_QTY1 - ,REC_LOT_NUM2 - ,REC_QTY2 - ,REC_LOT_NUM3 - ,REC_QTY3 - ,REC_YMD - ,SALE_DATA_CAT - ,SLIP_FILE_NAME - ,SLIP_MGT_NUM - ,ROW_NUM - ,HSDN_YMD - ,EXEC_DT - ,V_TRAN_CD - ,TRAN_KBN_NAME - ,WHS_ORG_CD - ,V_WHSORG_CD - ,WHS_ORG_NAME - ,WHS_ORG_KN - ,V_WHS_CD - ,WHS_NAME - ,NONYU_FCL_CD - ,V_INST_CD - ,V_INST_NAME - ,V_INST_KN - ,V_INST_ADDR - ,COMM_CD - ,PRODUCT_NAME - ,HTDNYMD_ERR_KBN - ,PRD_EXIS_KBN - ,FCL_EXIS_KBN - ,QTY1 - ,QTY2 - ,QTY3 - ,SLIP_ORG_KBN - ,BEF_SLIP_MGT_NUM - ,WHS_REP_COMM_NAME - ,WHS_REP_NONYU_FCL_NAME - ,WHS_REP_NONYU_FCL_ADDR - ,ERR_FLG1 - ,ERR_FLG2 - ,ERR_FLG3 - ,ERR_FLG4 - ,ERR_FLG5 - ,ERR_FLG6 - ,ERR_FLG7 - ,ERR_FLG8 - ,ERR_FLG9 - ,ERR_FLG10 - ,ERR_FLG11 - ,ERR_FLG12 - ,ERR_FLG13 - ,ERR_FLG14 - ,ERR_FLG15 - ,ERR_FLG16 - ,ERR_FLG17 - ,ERR_FLG18 - ,ERR_FLG19 - ,ERR_FLG20 - ,KJYO_YM - ,TKSNBK_KBN - ,FCL_EXEC_KBN - ,REC_STS_KBN - ,INS_DT - ,INS_USR - ,DWH_UPD_DT + rec_data + ,rec_whs_cd + ,rec_whs_sub_cd + ,rec_whs_org_cd + ,rec_cust_cd + ,rec_comm_cd + ,rec_tran_kbn + ,rev_hsdnymd_wrk + ,rev_hsdnymd_srk + ,rec_urag_num + ,rec_comm_name + ,rec_nonyu_fcl_name + ,rec_nonyu_fcl_addr + ,rec_lot_num1 + ,rec_qty1 + ,rec_lot_num2 + ,rec_qty2 + ,rec_lot_num3 + ,rec_qty3 + ,rec_ymd + ,sale_data_cat + ,slip_file_name + ,slip_mgt_num + ,row_num + ,hsdn_ymd + ,exec_dt + ,v_tran_cd + ,tran_kbn_name + ,whs_org_cd + ,v_whsorg_cd + ,whs_org_name + ,whs_org_kn + ,v_whs_cd + ,whs_name + ,nonyu_fcl_cd + ,v_inst_cd + ,v_inst_name + ,v_inst_kn + ,v_inst_addr + ,comm_cd + ,product_name + ,htdnymd_err_kbn + ,prd_exis_kbn + ,fcl_exis_kbn + ,qty1 + ,qty2 + ,qty3 + ,slip_org_kbn + ,bef_slip_mgt_num + ,whs_rep_comm_name + ,whs_rep_nonyu_fcl_name + ,whs_rep_nonyu_fcl_addr + ,err_flg1 + ,err_flg2 + ,err_flg3 + ,err_flg4 + ,err_flg5 + ,err_flg6 + ,err_flg7 + ,err_flg8 + ,err_flg9 + ,err_flg10 + ,err_flg11 + ,err_flg12 + ,err_flg13 + ,err_flg14 + ,err_flg15 + ,err_flg16 + ,err_flg17 + ,err_flg18 + ,err_flg19 + ,err_flg20 + ,kjyo_ym + ,tksnbk_kbn + ,fcl_exec_kbn + ,rec_sts_kbn + ,ins_dt + ,ins_usr + ,dwh_upd_dt ) SELECT - t.REC_DATA - ,t.REC_WHS_CD - ,t.REC_WHS_SUB_CD - ,t.REC_WHS_ORG_CD - ,t.REC_CUST_CD - ,t.REC_COMM_CD - ,t.REC_TRAN_KBN - ,t.REV_HSDNYMD_WRK - ,t.REV_HSDNYMD_SRK - ,t.REC_URAG_NUM - ,t.REC_COMM_NAME - ,t.REC_NONYU_FCL_NAME - ,t.REC_NONYU_FCL_ADDR - ,t.REC_LOT_NUM1 - ,t.REC_QTY1 - ,t.REC_LOT_NUM2 - ,t.REC_QTY2 - ,t.REC_LOT_NUM3 - ,t.REC_QTY3 - ,t.REC_YMD - ,t.SALE_DATA_CAT - ,t.SLIP_FILE_NAME - ,t.SLIP_MGT_NUM - ,t.ROW_NUM - ,t.HSDN_YMD - ,t.EXEC_DT - ,t.V_TRAN_CD - ,t.TRAN_KBN_NAME - ,t.WHS_ORG_CD - ,t.V_WHSORG_CD - ,t.WHS_ORG_NAME - ,t.WHS_ORG_KN - ,t.V_WHS_CD - ,t.WHS_NAME - ,t.NONYU_FCL_CD - ,t.V_INST_CD - ,t.V_INST_NAME - ,t.V_INST_KN - ,t.V_INST_ADDR - ,t.COMM_CD - ,t.PRODUCT_NAME - ,t.HTDNYMD_ERR_KBN - ,t.PRD_EXIS_KBN - ,t.FCL_EXIS_KBN - ,t.QTY1 - ,t.QTY2 - ,t.QTY3 - ,t.SLIP_ORG_KBN - ,t.BEF_SLIP_MGT_NUM - ,t.WHS_REP_COMM_NAME - ,t.WHS_REP_NONYU_FCL_NAME - ,t.WHS_REP_NONYU_FCL_ADDR - ,t.ERR_FLG1 - ,t.ERR_FLG2 - ,t.ERR_FLG3 - ,t.ERR_FLG4 - ,t.ERR_FLG5 - ,t.ERR_FLG6 - ,t.ERR_FLG7 - ,t.ERR_FLG8 - ,t.ERR_FLG9 - ,t.ERR_FLG10 - ,t.ERR_FLG11 - ,t.ERR_FLG12 - ,t.ERR_FLG13 - ,t.ERR_FLG14 - ,t.ERR_FLG15 - ,t.ERR_FLG16 - ,t.ERR_FLG17 - ,t.ERR_FLG18 - ,t.ERR_FLG19 - ,t.ERR_FLG20 - ,t.KJYO_YM - ,t.TKSNBK_KBN - ,t.FCL_EXEC_KBN - ,t.REC_STS_KBN - ,t.INS_DT - ,t.INS_USR + t.rec_data + ,t.rec_whs_cd + ,t.rec_whs_sub_cd + ,t.rec_whs_org_cd + ,t.rec_cust_cd + ,t.rec_comm_cd + ,t.rec_tran_kbn + ,t.rev_hsdnymd_wrk + ,t.rev_hsdnymd_srk + ,t.rec_urag_num + ,t.rec_comm_name + ,t.rec_nonyu_fcl_name + ,t.rec_nonyu_fcl_addr + ,t.rec_lot_num1 + ,t.rec_qty1 + ,t.rec_lot_num2 + ,t.rec_qty2 + ,t.rec_lot_num3 + ,t.rec_qty3 + ,t.rec_ymd + ,t.sale_data_cat + ,t.slip_file_name + ,t.slip_mgt_num + ,t.row_num + ,t.hsdn_ymd + ,t.exec_dt + ,t.v_tran_cd + ,t.tran_kbn_name + ,t.whs_org_cd + ,t.v_whsorg_cd + ,t.whs_org_name + ,t.whs_org_kn + ,t.v_whs_cd + ,t.whs_name + ,t.nonyu_fcl_cd + ,t.v_inst_cd + ,t.v_inst_name + ,t.v_inst_kn + ,t.v_inst_addr + ,t.comm_cd + ,t.product_name + ,t.htdnymd_err_kbn + ,t.prd_exis_kbn + ,t.fcl_exis_kbn + ,t.qty1 + ,t.qty2 + ,t.qty3 + ,t.slip_org_kbn + ,t.bef_slip_mgt_num + ,t.whs_rep_comm_name + ,t.whs_rep_nonyu_fcl_name + ,t.whs_rep_nonyu_fcl_addr + ,t.err_flg1 + ,t.err_flg2 + ,t.err_flg3 + ,t.err_flg4 + ,t.err_flg5 + ,t.err_flg6 + ,t.err_flg7 + ,t.err_flg8 + ,t.err_flg9 + ,t.err_flg10 + ,t.err_flg11 + ,t.err_flg12 + ,t.err_flg13 + ,t.err_flg14 + ,t.err_flg15 + ,t.err_flg16 + ,t.err_flg17 + ,t.err_flg18 + ,t.err_flg19 + ,t.err_flg20 + ,t.kjyo_ym + ,t.tksnbk_kbn + ,t.fcl_exec_kbn + ,t.rec_sts_kbn + ,t.ins_dt + ,t.ins_usr ,SYSDATE() FROM org05.bio_sales AS t ON DUPLICATE KEY UPDATE - REC_DATA=t.REC_DATA - ,REC_WHS_CD=t.REC_WHS_CD - ,REC_WHS_SUB_CD=t.REC_WHS_SUB_CD - ,REC_WHS_ORG_CD=t.REC_WHS_ORG_CD - ,REC_CUST_CD=t.REC_CUST_CD - ,REC_COMM_CD=t.REC_COMM_CD - ,REC_TRAN_KBN=t.REC_TRAN_KBN - ,REV_HSDNYMD_WRK=t.REV_HSDNYMD_WRK - ,REV_HSDNYMD_SRK=t.REV_HSDNYMD_SRK - ,REC_URAG_NUM=t.REC_URAG_NUM - ,REC_COMM_NAME=t.REC_COMM_NAME - ,REC_NONYU_FCL_NAME=t.REC_NONYU_FCL_NAME - ,REC_NONYU_FCL_ADDR=t.REC_NONYU_FCL_ADDR - ,REC_LOT_NUM1=t.REC_LOT_NUM1 - ,REC_QTY1=t.REC_QTY1 - ,REC_LOT_NUM2=t.REC_LOT_NUM2 - ,REC_QTY2=t.REC_QTY2 - ,REC_LOT_NUM3=t.REC_LOT_NUM3 - ,REC_QTY3=t.REC_QTY3 - ,REC_YMD=t.REC_YMD - ,SALE_DATA_CAT=t.SALE_DATA_CAT - ,SLIP_FILE_NAME=t.SLIP_FILE_NAME - ,SLIP_MGT_NUM=t.SLIP_MGT_NUM - ,ROW_NUM=t.ROW_NUM - ,HSDN_YMD=t.HSDN_YMD - ,EXEC_DT=t.EXEC_DT - ,V_TRAN_CD=t.V_TRAN_CD - ,TRAN_KBN_NAME=t.TRAN_KBN_NAME - ,WHS_ORG_CD=t.WHS_ORG_CD - ,V_WHSORG_CD=t.V_WHSORG_CD - ,WHS_ORG_NAME=t.WHS_ORG_NAME - ,WHS_ORG_KN=t.WHS_ORG_KN - ,V_WHS_CD=t.V_WHS_CD - ,WHS_NAME=t.WHS_NAME - ,NONYU_FCL_CD=t.NONYU_FCL_CD - ,V_INST_CD=t.V_INST_CD - ,V_INST_NAME=t.V_INST_NAME - ,V_INST_KN=t.V_INST_KN - ,V_INST_ADDR=t.V_INST_ADDR - ,COMM_CD=t.COMM_CD - ,PRODUCT_NAME=t.PRODUCT_NAME - ,HTDNYMD_ERR_KBN=t.HTDNYMD_ERR_KBN - ,PRD_EXIS_KBN=t.PRD_EXIS_KBN - ,FCL_EXIS_KBN=t.FCL_EXIS_KBN - ,QTY1=t.QTY1 - ,QTY2=t.QTY2 - ,QTY3=t.QTY3 - ,SLIP_ORG_KBN=t.SLIP_ORG_KBN - ,BEF_SLIP_MGT_NUM=t.BEF_SLIP_MGT_NUM - ,WHS_REP_COMM_NAME=t.WHS_REP_COMM_NAME - ,WHS_REP_NONYU_FCL_NAME=t.WHS_REP_NONYU_FCL_NAME - ,WHS_REP_NONYU_FCL_ADDR=t.WHS_REP_NONYU_FCL_ADDR - ,ERR_FLG1=t.ERR_FLG1 - ,ERR_FLG2=t.ERR_FLG2 - ,ERR_FLG3=t.ERR_FLG3 - ,ERR_FLG4=t.ERR_FLG4 - ,ERR_FLG5=t.ERR_FLG5 - ,ERR_FLG6=t.ERR_FLG6 - ,ERR_FLG7=t.ERR_FLG7 - ,ERR_FLG8=t.ERR_FLG8 - ,ERR_FLG9=t.ERR_FLG9 - ,ERR_FLG10=t.ERR_FLG10 - ,ERR_FLG11=t.ERR_FLG11 - ,ERR_FLG12=t.ERR_FLG12 - ,ERR_FLG13=t.ERR_FLG13 - ,ERR_FLG14=t.ERR_FLG14 - ,ERR_FLG15=t.ERR_FLG15 - ,ERR_FLG16=t.ERR_FLG16 - ,ERR_FLG17=t.ERR_FLG17 - ,ERR_FLG18=t.ERR_FLG18 - ,ERR_FLG19=t.ERR_FLG19 - ,ERR_FLG20=t.ERR_FLG20 - ,KJYO_YM=t.KJYO_YM - ,TKSNBK_KBN=t.TKSNBK_KBN - ,FCL_EXEC_KBN=t.FCL_EXEC_KBN - ,REC_STS_KBN=t.REC_STS_KBN - ,INS_DT=t.INS_DT - ,INS_USR=t.INS_USR - ,DWH_UPD_DT=SYSDATE() + rec_data=t.rec_data + ,rec_whs_cd=t.rec_whs_cd + ,rec_whs_sub_cd=t.rec_whs_sub_cd + ,rec_whs_org_cd=t.rec_whs_org_cd + ,rec_cust_cd=t.rec_cust_cd + ,rec_comm_cd=t.rec_comm_cd + ,rec_tran_kbn=t.rec_tran_kbn + ,rev_hsdnymd_wrk=t.rev_hsdnymd_wrk + ,rev_hsdnymd_srk=t.rev_hsdnymd_srk + ,rec_urag_num=t.rec_urag_num + ,rec_comm_name=t.rec_comm_name + ,rec_nonyu_fcl_name=t.rec_nonyu_fcl_name + ,rec_nonyu_fcl_addr=t.rec_nonyu_fcl_addr + ,rec_lot_num1=t.rec_lot_num1 + ,rec_qty1=t.rec_qty1 + ,rec_lot_num2=t.rec_lot_num2 + ,rec_qty2=t.rec_qty2 + ,rec_lot_num3=t.rec_lot_num3 + ,rec_qty3=t.rec_qty3 + ,rec_ymd=t.rec_ymd + ,sale_data_cat=t.sale_data_cat + ,slip_file_name=t.slip_file_name + ,slip_mgt_num=t.slip_mgt_num + ,row_num=t.row_num + ,hsdn_ymd=t.hsdn_ymd + ,exec_dt=t.exec_dt + ,v_tran_cd=t.v_tran_cd + ,tran_kbn_name=t.tran_kbn_name + ,whs_org_cd=t.whs_org_cd + ,v_whsorg_cd=t.v_whsorg_cd + ,whs_org_name=t.whs_org_name + ,whs_org_kn=t.whs_org_kn + ,v_whs_cd=t.v_whs_cd + ,whs_name=t.whs_name + ,nonyu_fcl_cd=t.nonyu_fcl_cd + ,v_inst_cd=t.v_inst_cd + ,v_inst_name=t.v_inst_name + ,v_inst_kn=t.v_inst_kn + ,v_inst_addr=t.v_inst_addr + ,comm_cd=t.comm_cd + ,product_name=t.product_name + ,htdnymd_err_kbn=t.htdnymd_err_kbn + ,prd_exis_kbn=t.prd_exis_kbn + ,fcl_exis_kbn=t.fcl_exis_kbn + ,qty1=t.qty1 + ,qty2=t.qty2 + ,qty3=t.qty3 + ,slip_org_kbn=t.slip_org_kbn + ,bef_slip_mgt_num=t.bef_slip_mgt_num + ,whs_rep_comm_name=t.whs_rep_comm_name + ,whs_rep_nonyu_fcl_name=t.whs_rep_nonyu_fcl_name + ,whs_rep_nonyu_fcl_addr=t.whs_rep_nonyu_fcl_addr + ,err_flg1=t.err_flg1 + ,err_flg2=t.err_flg2 + ,err_flg3=t.err_flg3 + ,err_flg4=t.err_flg4 + ,err_flg5=t.err_flg5 + ,err_flg6=t.err_flg6 + ,err_flg7=t.err_flg7 + ,err_flg8=t.err_flg8 + ,err_flg9=t.err_flg9 + ,err_flg10=t.err_flg10 + ,err_flg11=t.err_flg11 + ,err_flg12=t.err_flg12 + ,err_flg13=t.err_flg13 + ,err_flg14=t.err_flg14 + ,err_flg15=t.err_flg15 + ,err_flg16=t.err_flg16 + ,err_flg17=t.err_flg17 + ,err_flg18=t.err_flg18 + ,err_flg19=t.err_flg19 + ,err_flg20=t.err_flg20 + ,kjyo_ym=t.kjyo_ym + ,tksnbk_kbn=t.tksnbk_kbn + ,fcl_exec_kbn=t.fcl_exec_kbn + ,rec_sts_kbn=t.rec_sts_kbn + ,ins_dt=t.ins_dt + ,ins_usr=t.ins_usr + ,dwh_upd_dt=SYSDATE() ; """) }, @@ -1436,71 +1436,59 @@ class VjskRecvFileMapper: _KEY_SRC_TABLE: "src05.lot_num_mst", _KEY_UPSERT_SQL: textwrap.dedent("""\ INSERT INTO src05.lot_num_mst ( - SER_NUM - ,LOT_NUM - ,EXPR_DT - ,FRST_MOV_DT - ,INS_DT - ,INS_USR - ,DWH_UPD_DT + ser_num + ,lot_num + ,expr_dt + ,frst_mov_dt + ,ins_dt + ,ins_usr + ,dwh_upd_dt ) SELECT - t.SER_NUM - ,t.LOT_NUM - ,t.EXPR_DT - ,t.FRST_MOV_DT - ,t.INS_DT - ,t.INS_USR + t.ser_num + ,t.lot_num + ,t.expr_dt + ,t.frst_mov_dt + ,t.ins_dt + ,t.ins_usr ,SYSDATE() FROM org05.lot_num_mst AS t ON DUPLICATE KEY UPDATE - SER_NUM=t.SER_NUM - ,LOT_NUM=t.LOT_NUM - ,EXPR_DT=t.EXPR_DT - ,FRST_MOV_DT=t.FRST_MOV_DT - ,INS_DT=t.INS_DT - ,INS_USR=t.INS_USR - ,DWH_UPD_DT=SYSDATE() + ser_num=t.ser_num + ,lot_num=t.lot_num + ,expr_dt=t.expr_dt + ,frst_mov_dt=t.frst_mov_dt + ,ins_dt=t.ins_dt + ,ins_usr=t.ins_usr + ,dwh_upd_dt=SYSDATE() ; """) }, } - def get_data_name(self, condkey: str) -> str: + def _get_interface_property(self, condkey: str, property_name: str) -> str: ret = None if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_DATA_NAME) + ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(property_name) return ret + def get_data_name(self, condkey: str) -> str: + return self._get_interface_property(condkey, self._KEY_DATA_NAME) + def get_file_prefix(self, condkey: str) -> str: - ret = None - if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_FILE_PREFIX) - return ret + return self._get_interface_property(condkey, self._KEY_FILE_PREFIX) def get_file_suffix(self, condkey: str) -> str: - ret = None - if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_FILE_SUFFIX) - return ret + return self._get_interface_property(condkey, self._KEY_FILE_SUFFIX) def get_org_table(self, condkey: str) -> str: - ret = None - if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_ORG_TABLE) - return ret + return self._get_interface_property(condkey, self._KEY_ORG_TABLE) def get_src_table(self, condkey: str) -> str: - ret = None - if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_SRC_TABLE) - return ret + return self._get_interface_property(condkey, self._KEY_SRC_TABLE) def get_upsert_sql(self, condkey: str) -> str: - ret = None - if condkey in self._VJSK_INTERFACE_MAPPING: - ret = self._VJSK_INTERFACE_MAPPING.get(condkey).get(self._KEY_UPSERT_SQL) - return ret + return self._get_interface_property(condkey, self._KEY_UPSERT_SQL) def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: ret = None From 2f94215e94726c711d8b179be26618df09c4134a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 09:24:17 +0900 Subject: [PATCH 258/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=8C=BB=E7=99=82=E5=9C=8F=EF=BC=BF=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8C=BB=E7=99=82=E5=9C=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_snd_med_sphe_mapper.py | 113 ++++++++ .../utmp_tables/tables/com_snd_med_sphe.py | 30 +++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_snd_med_sphe/__init__.py | 0 .../com_snd_med_sphe_delete.csv | 3 + .../com_snd_med_sphe_insert.csv | 4 + .../com_snd_med_sphe_update.csv | 3 + .../db_com_snd_med_sphe_before_delete.csv | 4 + .../db_com_snd_med_sphe_before_update.csv | 4 + .../expect_com_snd_med_sphe_delete.csv | 2 + .../expect_com_snd_med_sphe_insert.csv | 5 + .../expect_com_snd_med_sphe_update.csv | 4 + .../test_com_snd_med_sphe_mapper.py | 255 ++++++++++++++++++ 13 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py new file mode 100644 index 00000000..e8007319 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py @@ -0,0 +1,113 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_snd_med_sphe import ComSenMedSphe + + +class ComSenMedSpheMapper(UltmarcTableMapper): + """レイアウト区分123: COM_医療圏二次医療圏 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_snd_med_sphe + ( + prefc_cd, + med_sphe_cd, + thrd_cd, + snd_med_sphe_name, + requd_bed_or_equip_target, + exist_bed_num, + exist_bed_num_regist_ymd, + plsmns_bed_num, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :med_sphe_cd, + :thrd_cd, + :snd_med_sphe_name, + :requd_bed_or_equip_target, + :exist_bed_num, + :exist_bed_num_regist_ymd, + :plsmns_bed_num, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_snd_med_sphe + SET + thrd_cd = :thrd_cd, + snd_med_sphe_name = :snd_med_sphe_name, + requd_bed_or_equip_target = :requd_bed_or_equip_target, + exist_bed_num = :exist_bed_num, + exist_bed_num_regist_ymd = :exist_bed_num_regist_ymd, + plsmns_bed_num = :plsmns_bed_num, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + + # 修正区分が「C(削除)」の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + """ + + record: ComSenMedSphe + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSenMedSphe) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、物理削除 + if self.record.maintflag == 'C': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py new file mode 100644 index 00000000..c5e241db --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py @@ -0,0 +1,30 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSenMedSphe(UltmarcTable): + """レイアウト区分123: COM_医療圏二次医療圏""" + prefc_cd: str # 県コード + med_sphe_cd: str # 医療圏コード + thrd_cd: str # 3次コード + snd_med_sphe_name: str # 2次医療圏名 + requd_bed_or_equip_target: str # 基準病床数 or 整備目標数 + exist_bed_num: str # 既存病床数(病床数) + exist_bed_num_regist_ymd: str # 既存病床数(年月日) + plsmns_bed_num: str # 過不足病床数 + maintflag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.prefc_cd = record[1] + self.med_sphe_cd = record[2] + self.maintflag = record[3] + self.snd_med_sphe_name = record[6] + self.thrd_cd = record[7] + self.requd_bed_or_equip_target = record[8].strip() + self.exist_bed_num = record[9].strip() + self.exist_bed_num_regist_ymd = record[10] + self.plsmns_bed_num = record[11] + + # decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する + self.requd_bed_or_equip_target = self.requd_bed_or_equip_target if len(self.requd_bed_or_equip_target) > 0 else None + self.exist_bed_num = self.exist_bed_num if len(self.exist_bed_num) > 0 else None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 4c078280..05c36138 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -48,6 +48,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper im ComMedPrefcMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper import \ ComThrdMedMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper import \ + ComSenMedSpheMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -121,7 +123,7 @@ COM_TABLE_LIST = { # COM_医療圏3次マスタ "122": ComThrdMedMapper, # COM_二次医療圏 - "123": NullMapper, + "123": ComSenMedSpheMapper, # COM_医療圏都道府県市町村対照表 "124": NullMapper } diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv new file mode 100644 index 00000000..61c5c614 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_delete.csv @@ -0,0 +1,3 @@ +"123","01","01","C","20141113","20141114","","","","","","" +"123","01","02","C","20141113","20141114","南檜山圏","1","213","216","20130201","3" +"123","01","09","C","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv new file mode 100644 index 00000000..690a500f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_insert.csv @@ -0,0 +1,4 @@ +"123","01","01","A","20141113","20141114","南渡島圏","1","4475","5020","20130201","545" +"123","01","02","A","20141113","20141114","","","","","","" +"123","01","03","B","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" +"123","99","99","A","","","あいうえおかきくけこあいうえおかきくけこ","9","123456","123456","20130201","1234567" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv new file mode 100644 index 00000000..348ff11c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/com_snd_med_sphe_update.csv @@ -0,0 +1,3 @@ +"123","01","01","A","20141113","20141114","","","","","","" +"123","01","02","A","20141113","20141114","南檜山圏","1","213","216","20130201","3" +"123","01","03","B","20141113","20141114","北渡島檜山圏","1","389","484","20130201","95" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv new file mode 100644 index 00000000..8fab7f4b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_delete.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","","","NULL","NULL","","","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" +"01","02","1","南檜山圏","213","216","20130201","3","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv new file mode 100644 index 00000000..23b503f5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/db_com_snd_med_sphe_before_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","1","南渡島圏","4475","5020","20130201","545","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" +"01","02","","","NULL","NULL","","","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:35:59","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv new file mode 100644 index 00000000..3ec5fff5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_delete.csv @@ -0,0 +1,2 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20171019","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2017/10/19 17:38:48","clsComSndMedSphe" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv new file mode 100644 index 00000000..f5a43770 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_insert.csv @@ -0,0 +1,5 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","1","南渡島圏","4475","5020","20130201","545","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"01","02","","","NULL","NULL","","","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" +"99","99","9","あいうえおかきくけこあいうえおかきくけこ","123456","123456","20130201","1234567","NULL","20230511","NULL","NULL","NULL","NULL","NULL","2023/05/12 05:35:59","com_snd_med_sphe_mapper","2023/05/12 05:35:59","com_snd_med_sphe_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv new file mode 100644 index 00000000..6e212e05 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/expect_com_snd_med_sphe_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","thrd_cd","snd_med_sphe_name","requd_bed_or_equip_target","exist_bed_num","exist_bed_num_regist_ymd","plsmns_bed_num","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","","","NULL","NULL","","","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" +"01","02","1","南檜山圏","213","216","20130201","3","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" +"01","03","1","北渡島檜山圏","389","484","20130201","95","NULL","20171019","20230512","NULL","NULL","NULL","NULL","2017/10/19 17:35:59","clsComSndMedSphe","2023/05/12 05:38:48","com_snd_med_sphe_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py new file mode 100644 index 00000000..60378f4e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py @@ -0,0 +1,255 @@ +import os.path as path +from datetime import datetime +from decimal import Decimal + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_snd_med_sphe_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSenMedSphe: + """レイアウト区分123: COM_医療圏二次医療圏""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + # decimal型のカラム群 + decimal_columns = [ + 'requd_bed_or_equip_target', + 'exist_bed_num' + ] + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏二次医療圏テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_insert.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医療圏二次医療圏テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_snd_med_sphe_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_snd_med_sphe', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_update.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医療圏二次医療圏テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_snd_med_sphe_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_snd_med_sphe', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_snd_med_sphe_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_snd_med_sphe', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_delete.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_snd_med_sphe + WHERE + prefc_cd = :prefc_cd + AND med_sphe_cd = :med_sphe_cd\ + """ + for param_prefc_cd, param_med_sphe_cd in zip(primary_keys_prefc_cd, primary_keys_med_sphe_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + self.decimal_columns + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + if actual_col_name in self.decimal_columns: + if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: + assert actual_row[actual_col_name] == Decimal(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 35c68957b076a8ffccba8f6bc2b1b1d9eccf0207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 12 May 2023 10:14:24 +0900 Subject: [PATCH 259/962] =?UTF-8?q?feat:=20=E5=AE=9F=E8=A1=8C=E6=99=82?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=8C=E5=87=BA=E3=82=8B=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E3=81=AE=E5=AF=BE=E5=87=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 2614ab22..a98c0d16 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -8,7 +8,7 @@ from src.batch.batch_functions import ( from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile from src.batch.dcf_inst_merge import create_dcf_inst_merge -from src.batch.laundering mst_inst_laundering +from src.batch.laundering import mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger From 7f8b16a0c6f839f34b95ba62191c57966894be9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 11:36:02 +0900 Subject: [PATCH 260/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=8C=BB=E7=99=82=E5=9C=8F=EF=BC=BF=E9=83=BD=E9=81=93?= =?UTF-8?q?=E5=BA=9C=E7=9C=8C=E5=B8=82=E7=94=BA=E6=9D=91=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E8=A1=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_med_area_city_mapper.py | 117 ++++++++ .../utmp_tables/tables/com_med_area_city.py | 24 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_med_area_city/__init__.py | 0 .../com_med_area_city_delete.csv | 3 + .../com_med_area_city_insert.csv | 3 + .../com_med_area_city_update.csv | 3 + .../db_com_med_area_city_before_delete.csv | 4 + .../db_com_med_area_city_before_update.csv | 4 + .../expect_com_med_area_city_delete.csv | 2 + .../expect_com_med_area_city_insert.csv | 4 + .../expect_com_med_area_city_update.csv | 4 + .../test_com_med_area_city_mapper.py | 269 ++++++++++++++++++ 13 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py new file mode 100644 index 00000000..e046d558 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_area_city_mapper.py @@ -0,0 +1,117 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_med_area_city import ComMedAreaCity + + +class ComMedAreaCityMapper(UltmarcTableMapper): + """レイアウト区分124: COM_医療圏都道府県市町村対応表 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_med_area_city + ( + prefc_cd, + med_sphe_cd, + jis_prefc_cd, + jis_city_cd, + zen_prefcode, + zen_medareacode, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :med_sphe_cd, + :jis_prefc_cd, + :jis_city_cd, + :zen_prefcode, + :zen_medareacode, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # データ更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_med_area_city + SET + zen_prefcode = :zen_prefcode, + zen_medareacode = :zen_medareacode, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + PHYSICAL_DELETE_QUERY = """\ + DELETE FROM + src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + + record: ComMedAreaCity + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComMedAreaCity) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 + if self.record.maintflag == 'B' and self.record.addDelDiv == '1': + self.queries.append(self.PHYSICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py new file mode 100644 index 00000000..a1e0e4cc --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_area_city.py @@ -0,0 +1,24 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComMedAreaCity(UltmarcTable): + """レイアウト区分124: COM_医療圏都道府県市町村対応表""" + prefc_cd: str # 県コード + med_sphe_cd: str # 医療圏コード + jis_prefc_cd: str # JIS都道府県コード + jis_city_cd: str # JIS市区町村コード + zen_prefcode: str # 移動元2次コード(都道府県) + zen_medareacode: str # 移動元2次コード(医療圏コード) + maintflag: str # 修正区分 + addDelDiv: str # 追加削除区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.prefc_cd = record[1] + self.med_sphe_cd = record[2] + self.maintflag = record[3] + self.jis_prefc_cd = record[4] + self.jis_city_cd = record[5] + self.addDelDiv = record[6] + self.zen_prefcode = record[9].strip() + self.zen_medareacode = record[10].strip() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 05c36138..335e2538 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -50,6 +50,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper imp ComThrdMedMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper import \ ComSenMedSpheMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mapper import \ + ComMedAreaCityMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -125,7 +127,7 @@ COM_TABLE_LIST = { # COM_二次医療圏 "123": ComSenMedSpheMapper, # COM_医療圏都道府県市町村対照表 - "124": NullMapper + "124": ComMedAreaCityMapper } diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv new file mode 100644 index 00000000..126012d4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv @@ -0,0 +1,3 @@ +"124","1","1","B","1","202","1","20141113","20141114","","" +"124","1","1","B","1","900","1","20141113","20141114","1","2" +"124","1","1","B","1","331","1","20141113","20141114","1","1" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv new file mode 100644 index 00000000..e8bf727d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_insert.csv @@ -0,0 +1,3 @@ +"124","01","01","A","01","202","2","20141113","20141114","01","03" +"124","01","01","A","01","236","2","20141113","20141114","","" +"124","01","01","B","01","331","2","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv new file mode 100644 index 00000000..7ec208ae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_update.csv @@ -0,0 +1,3 @@ +"124","01","01","A","01","202","2","20141113","20141114","","" +"124","01","01","A","01","236","2","20141113","20141114","01","02" +"124","01","01","B","01","331","2","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv new file mode 100644 index 00000000..756a99ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_delete.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","01","202","","","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" +"01","01","01","236","01","02","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" +"01","01","01","331","01","01","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv new file mode 100644 index 00000000..dc0c8280 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/db_com_med_area_city_before_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","01","202","01","03","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" +"01","01","01","236","","","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" +"01","01","01","331","01","01","NULL","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 10:54:42","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv new file mode 100644 index 00000000..378928e3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_delete.csv @@ -0,0 +1,2 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","01","236","01","02","NULL","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2017/10/20 11:26:33","clsComMedAreaCity" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv new file mode 100644 index 00000000..35406b92 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_insert.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","01","202","01","03","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" +"01","01","01","236","","","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" +"01","01","01","331","01","01","NULL","20230512","NULL","NULL","NULL","NULL","NULL","2023/05/12 10:54:42","com_med_area_city_mapper","2023/05/12 10:54:42","com_med_area_city_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv new file mode 100644 index 00000000..e45e2614 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/expect_com_med_area_city_update.csv @@ -0,0 +1,4 @@ +"prefc_cd","med_sphe_cd","jis_prefc_cd","jis_city_cd","zen_prefcode","zen_medareacode","mod_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","01","01","202","","","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" +"01","01","01","236","01","02","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" +"01","01","01","331","01","01","NULL","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 10:54:42","clsComMedAreaCity","2023/05/12 11:26:33","com_med_area_city_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py new file mode 100644 index 00000000..1e0bfcc3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py @@ -0,0 +1,269 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_med_area_city_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComMedAreaCityMapper: + """レイアウト区分124: COM_医療圏都道府県市町村対応表""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_医療圏都道府県市町村対応表テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_insert.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_医療圏都道府県市町村対応表テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_area_city_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_area_city', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_update.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_医療圏都道府県市町村対応表テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_med_area_city_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_med_area_city', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_med_area_city_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_med_area_city', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_med_area_city_mapper.ComMedAreaCityMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_med_area_city_mapper.ComMedAreaCityMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_delete.csv')) + primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] + primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] + primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] + primary_keys_jis_city_cd = [{'jis_city_cd': columns['jis_city_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_med_area_city + WHERE + prefc_cd = :prefc_cd + AND + med_sphe_cd = :med_sphe_cd + AND + jis_prefc_cd = :jis_prefc_cd + AND + jis_city_cd = :jis_city_cd + """ + for param_prefc_cd, param_med_sphe_cd, param_keys_jis_prefc_cd, param_jis_city_cd in zip( + primary_keys_prefc_cd, + primary_keys_med_sphe_cd, + primary_keys_jis_prefc_cd, + primary_keys_jis_city_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_prefc_cd, **param_med_sphe_cd, **param_keys_jis_prefc_cd, **param_jis_city_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 5a32b27e26983cea93cac2ee5c7216ff8840791a Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 12 May 2023 12:27:29 +0900 Subject: [PATCH 261/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=8F=8D=E6=98=A0(=E5=8F=97=E9=A0=98?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E8=A7=A3=E5=87=8D=E3=81=A8?= =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97=E9=80=80?= =?UTF-8?q?=E9=81=BF=E3=82=82=E3=82=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_importer.py | 21 +++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 30 +++++++++---------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 719e3e62..f2da3ed9 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -48,6 +48,17 @@ def exec(): logger.debug(f'データベース登録失敗 {e}') raise e + # V実消化データ受領ファイルバックアップ退避 + logger.debug('V実消化データ受領ファイルバックアップ退避:開始') + try: + # 取込が完了したS3バケットにある受領ファイルをバックアップ用S3バケットに移動する + _backup_received_files() + + except BatchOperationException as e: + logger.debug('V実消化データ受領ファイルのバックアップ退避が失敗しました') + raise e + logger.debug('V実消化データ受領ファイルバックアップ退避:終了') + logger.debug('exec done') @@ -160,6 +171,8 @@ def _import_file_to_db(): local_file_path = vjsk_recv_bucket.download_data_file(file_name) logger.debug(f"download s3 file done : {file_name}") + # TODO: 受領ファイルはtar.gzなので、ローカルストレージ上で解凍する + # データファイル名に該当する辞書アクセス用のキーを取得する key = vjsk_mapper.get_condkey_by_s3_file_path(file_name) @@ -237,3 +250,11 @@ def _determine_today_is_stockslipdata_target(): raise e logger.debug("_determine_today_is_stockslipdata_target done") return ret + + +def _backup_received_files(): + logger.debug("_backup_received_files start") + + # TODO 受領バケットのファイル → バックアップバケット + + logger.debug("_backup_received_files done") diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 612309d2..4c374a2b 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -29,7 +29,7 @@ class VjskReceiveFileMapper: CONDKEY_SLIP_DATA: { _KEY_DATA_NAME: "販売実績データ", _KEY_FILE_PREFIX: "slip_data_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.sales", _KEY_SRC_TABLE: "src05.sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -298,7 +298,7 @@ class VjskReceiveFileMapper: CONDKEY_HLD_MST: { _KEY_DATA_NAME: "V卸ホールディングスマスタ", _KEY_FILE_PREFIX: "hld_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.hld_mst_v", _KEY_SRC_TABLE: "src05.hld_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -351,7 +351,7 @@ class VjskReceiveFileMapper: CONDKEY_WHS_MST: { _KEY_DATA_NAME: "V卸マスタ", _KEY_FILE_PREFIX: "whs_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.whs_mst_v", _KEY_SRC_TABLE: "src05.whs_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -419,7 +419,7 @@ class VjskReceiveFileMapper: CONDKEY_MKR_ORG_HORIZON: { _KEY_DATA_NAME: "Vメーカー卸組織展開表", _KEY_FILE_PREFIX: "mkr_org_horizon_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -577,7 +577,7 @@ class VjskReceiveFileMapper: CONDKEY_ORG_CNV_MST: { _KEY_DATA_NAME: "V卸組織変換マスタ", _KEY_FILE_PREFIX: "org_cnv_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.org_cnv_mst_v", _KEY_SRC_TABLE: "src05.org_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -630,7 +630,7 @@ class VjskReceiveFileMapper: CONDKEY_TRAN_KBN_MST: { _KEY_DATA_NAME: "V取引区分マスタ", _KEY_FILE_PREFIX: "tran_kbn_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -677,7 +677,7 @@ class VjskReceiveFileMapper: CONDKEY_FCL_MST: { _KEY_DATA_NAME: "V施設マスタ", _KEY_FILE_PREFIX: "fcl_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.fcl_mst_v", _KEY_SRC_TABLE: "src05.fcl_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -769,7 +769,7 @@ class VjskReceiveFileMapper: CONDKEY_PHM_PRD_MST: { _KEY_DATA_NAME: "V製品マスタ", _KEY_FILE_PREFIX: "phm_prd_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.phm_prd_mst_v", _KEY_SRC_TABLE: "src05.phm_prd_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -873,7 +873,7 @@ class VjskReceiveFileMapper: CONDKEY_PHM_PRICE_MST: { _KEY_DATA_NAME: "V製品価格マスタ", _KEY_FILE_PREFIX: "phm_price_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.phm_price_mst_v", _KEY_SRC_TABLE: "src05.phm_price_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -923,7 +923,7 @@ class VjskReceiveFileMapper: CONDKEY_VOP_HCO_MERGE: { _KEY_DATA_NAME: "V施設統合マスタ", _KEY_FILE_PREFIX: "vop_hco_merge_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.vop_hco_merge_v", _KEY_SRC_TABLE: "src05.vop_hco_merge_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -955,7 +955,7 @@ class VjskReceiveFileMapper: CONDKEY_WHS_CUSTOMER_MST: { _KEY_DATA_NAME: "V卸得意先情報マスタ", _KEY_FILE_PREFIX: "whs_customer_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.whs_customer_mst_v", _KEY_SRC_TABLE: "src05.whs_customer_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1026,7 +1026,7 @@ class VjskReceiveFileMapper: CONDKEY_MDB_CONV_MST: { _KEY_DATA_NAME: "MDBコード変換表", _KEY_FILE_PREFIX: "mdb_conv_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1070,7 +1070,7 @@ class VjskReceiveFileMapper: CONDKEY_STOCK_SLIP_DATA: { _KEY_DATA_NAME: "卸在庫データ", _KEY_FILE_PREFIX: "stock_slip_data_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.whole_stock", _KEY_SRC_TABLE: "src05.whole_stock", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1177,7 +1177,7 @@ class VjskReceiveFileMapper: CONDKEY_BIO_SLIP_DATA: { _KEY_DATA_NAME: "生物由来データ", _KEY_FILE_PREFIX: "bio_slip_data_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.bio_sales", _KEY_SRC_TABLE: "src05.bio_sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1431,7 +1431,7 @@ class VjskReceiveFileMapper: CONDKEY_LOT_NUM_MST: { _KEY_DATA_NAME: "ロットマスタデータ", _KEY_FILE_PREFIX: "lot_num_mst_", - _KEY_FILE_SUFFIX: ".tsv", + _KEY_FILE_SUFFIX: ".tar.gz", _KEY_ORG_TABLE: "org05.lot_num_mst", _KEY_SRC_TABLE: "src05.lot_num_mst", _KEY_UPSERT_SQL: textwrap.dedent("""\ From 23524711946da96e057c4aa2d40983d8adebe994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 13:08:30 +0900 Subject: [PATCH 262/962] =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E5=90=8D?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_snd_med_sphe_mapper.py | 8 ++++---- .../ultmarc/utmp_tables/tables/com_snd_med_sphe.py | 2 +- .../utmp_tables/ultmarc_table_mapper_factory.py | 4 ++-- .../test_com_snd_med_sphe_mapper.py | 14 +++++++------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py index e8007319..c1c50269 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_snd_med_sphe_mapper.py @@ -1,9 +1,9 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper -from src.batch.ultmarc.utmp_tables.tables.com_snd_med_sphe import ComSenMedSphe +from src.batch.ultmarc.utmp_tables.tables.com_snd_med_sphe import ComSndMedSphe -class ComSenMedSpheMapper(UltmarcTableMapper): +class ComSndMedSpheMapper(UltmarcTableMapper): """レイアウト区分123: COM_医療圏二次医療圏 登録処理""" # レコード存在確認SQL @@ -82,10 +82,10 @@ class ComSenMedSpheMapper(UltmarcTableMapper): med_sphe_cd = :med_sphe_cd """ - record: ComSenMedSphe + record: ComSndMedSphe def __init__(self, record: list[str], db) -> None: - super().__init__(record, db, ComSenMedSphe) + super().__init__(record, db, ComSndMedSphe) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) # モジュール名をクエリパラメータに設定 self.query_parameter['program_name'] = program_name diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py index c5e241db..b1b33e66 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_snd_med_sphe.py @@ -1,7 +1,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable -class ComSenMedSphe(UltmarcTable): +class ComSndMedSphe(UltmarcTable): """レイアウト区分123: COM_医療圏二次医療圏""" prefc_cd: str # 県コード med_sphe_cd: str # 医療圏コード diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 335e2538..6ff9bf70 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -49,7 +49,7 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper im from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper import \ ComThrdMedMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper import \ - ComSenMedSpheMapper + ComSndMedSpheMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mapper import \ ComMedAreaCityMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ @@ -125,7 +125,7 @@ COM_TABLE_LIST = { # COM_医療圏3次マスタ "122": ComThrdMedMapper, # COM_二次医療圏 - "123": ComSenMedSpheMapper, + "123": ComSndMedSpheMapper, # COM_医療圏都道府県市町村対照表 "124": ComMedAreaCityMapper } diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py index 60378f4e..78ff4708 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py @@ -15,7 +15,7 @@ from tests.testing_utility import (assert_table_results, create_ultmarc_test_data_from_csv) -class TestComSenMedSphe: +class TestComSndMedSphe: """レイアウト区分123: COM_医療圏二次医療圏""" db: Database @@ -66,8 +66,8 @@ class TestComSenMedSphe: # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -138,8 +138,8 @@ class TestComSenMedSphe: # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() @@ -212,8 +212,8 @@ class TestComSenMedSphe: # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_snd_med_sphe_mapper.ComSenMedSphe = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_snd_med_sphe_mapper.ComSenMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_snd_med_sphe_mapper.ComSndMedSphe = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_snd_med_sphe_mapper.ComSndMedSpheMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() From d9497744e3373c68e9c1755cb716d7c02a1f8df8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 12 May 2023 13:30:54 +0900 Subject: [PATCH 263/962] =?UTF-8?q?feat:=20DB=E3=81=AE=E5=AE=9F=E8=A3=85?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/database.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index c639a82a..85759f96 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -77,7 +77,10 @@ class Database: Raises: DBException: 接続失敗 """ - self.__connection = self.__engine.connect() + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) def execute_select(self, select_query: str, parameters=None) -> list[dict]: """SELECTクエリを実行します。 From 311e76346cc523a6ae700657da7568fddcf841ca Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 12 May 2023 13:31:10 +0900 Subject: [PATCH 264/962] =?UTF-8?q?feat:=20=E9=9B=91=E3=81=AB=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E9=96=A2=E6=95=B0=E3=82=92=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/logging/get_logger.py | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 ecs/jskult-webapp/src/logging/get_logger.py diff --git a/ecs/jskult-webapp/src/logging/get_logger.py b/ecs/jskult-webapp/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-webapp/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger From 65acc3ce093fef1cc8c0cb9011a52d0867b38c4f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 12 May 2023 13:39:14 +0900 Subject: [PATCH 265/962] =?UTF-8?q?style:=20format=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/aws/cognito.py | 6 ++-- ecs/jskult-webapp/src/aws/s3.py | 16 +++++----- ecs/jskult-webapp/src/controller/bio.py | 12 ++++--- .../src/controller/bio_download.py | 31 ++++++++++++------- .../src/controller/healthcheck.py | 2 ++ ecs/jskult-webapp/src/controller/login.py | 28 ++++++++++------- ecs/jskult-webapp/src/controller/logout.py | 10 +++--- ecs/jskult-webapp/src/controller/menu.py | 8 +++-- ecs/jskult-webapp/src/core/tasks.py | 2 +- ecs/jskult-webapp/src/db/sql_condition.py | 7 +++-- ecs/jskult-webapp/src/depends/auth.py | 12 ++++--- ecs/jskult-webapp/src/depends/database.py | 2 +- ecs/jskult-webapp/src/depends/services.py | 5 ++- ecs/jskult-webapp/src/error/exceptions.py | 4 +++ ecs/jskult-webapp/src/model/db/hdke_tbl.py | 1 - ecs/jskult-webapp/src/model/db/user_master.py | 4 +-- .../src/model/internal/jwt_token.py | 18 +++++------ .../src/model/internal/session.py | 8 ++--- ecs/jskult-webapp/src/model/request/bio.py | 5 ++- .../src/model/request/bio_download.py | 4 +-- ecs/jskult-webapp/src/model/request/login.py | 2 +- .../src/model/view/bio_disp_model.py | 4 +-- .../src/model/view/bio_view_model.py | 22 +++++++------ .../src/model/view/logout_view_model.py | 2 +- .../src/model/view/user_view_model.py | 6 ++-- .../src/repositories/base_repository.py | 6 ++-- .../repositories/bio_sales_view_repository.py | 5 ++- .../src/repositories/hdke_tbl_repository.py | 1 - .../pharmacy_product_master_repository.py | 8 ++--- .../repositories/user_master_repository.py | 3 +- .../wholesaler_master_repository.py | 4 +-- .../src/router/session_router.py | 12 +++++-- .../src/services/base_service.py | 1 + .../src/services/batch_status_service.py | 2 +- .../src/services/bio_view_service.py | 21 +++++++------ .../src/services/login_service.py | 6 ++-- .../src/services/session_service.py | 1 + .../src/system_var/environment.py | 2 +- 38 files changed, 163 insertions(+), 130 deletions(-) diff --git a/ecs/jskult-webapp/src/aws/cognito.py b/ecs/jskult-webapp/src/aws/cognito.py index c80f5bac..ee93f7ae 100644 --- a/ecs/jskult-webapp/src/aws/cognito.py +++ b/ecs/jskult-webapp/src/aws/cognito.py @@ -7,9 +7,9 @@ from src.system_var import environment class CognitoClient(AWSAPIClient): def __init__(self) -> None: self.__client = boto3.client('cognito-idp') - + def login_by_user_password_flow(self, username: str, password: str, secret_hash: str): - + auth_response = self.__client.admin_initiate_auth( UserPoolId=environment.COGNITO_USER_POOL_ID, ClientId=environment.COGNITO_CLIENT_ID, @@ -21,5 +21,5 @@ class CognitoClient(AWSAPIClient): }, ) authentication_result = auth_response['AuthenticationResult'] - + return authentication_result['IdToken'], authentication_result['RefreshToken'], diff --git a/ecs/jskult-webapp/src/aws/s3.py b/ecs/jskult-webapp/src/aws/s3.py index 852c7ceb..de11949c 100644 --- a/ecs/jskult-webapp/src/aws/s3.py +++ b/ecs/jskult-webapp/src/aws/s3.py @@ -7,16 +7,16 @@ from src.aws.aws_api_client import AWSAPIClient class S3Client(AWSAPIClient): __s3_client = boto3.client('s3') - + def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): self.__s3_client.upload_file( - local_file_path, - Bucket=bucket_name, - Key=file_key - ) + local_file_path, + Bucket=bucket_name, + Key=file_key + ) - def generate_presigned_url(self, bucket_name: str, file_key: str, download_filename: str=''): - # presigned_urlを生成 + def generate_presigned_url(self, bucket_name: str, file_key: str, download_filename: str = ''): + # presigned_urlを生成 presigned_url = self.__s3_client.generate_presigned_url( 'get_object', Params={ @@ -28,5 +28,5 @@ class S3Client(AWSAPIClient): # 有効期限20分 ExpiresIn=1200 ) - + return presigned_url diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index a54909bd..188560fb 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -1,7 +1,6 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request -from fastapi.exceptions import HTTPException from starlette import status from src.depends.services import get_service @@ -21,11 +20,13 @@ router.route_class = AuthenticatedRoute ######################### # Views # ######################### + + @router.get('/BioSearchList') def bio_view( request: Request, - batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), - bio_service: BioViewService=Depends(get_service(BioViewService)) + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), + bio_service: BioViewService = Depends(get_service(BioViewService)) ): session: UserSession = request.session # バッチ処理中の場合、機能を利用させない @@ -50,12 +51,13 @@ def bio_view( ) return templates_response + @router.post('/BioSearchList') def search_bio( request: Request, bio_form: Optional[BioModel] = Depends(BioModel.as_form), - bio_service: BioViewService=Depends(get_service(BioViewService)), - batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)) + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); session: UserSession = request.session diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 67593fb7..0d172e8a 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -3,7 +3,6 @@ from datetime import datetime from typing import Union from fastapi import APIRouter, Depends, HTTPException -from fastapi.exceptions import HTTPException from fastapi.responses import JSONResponse from starlette import status @@ -23,14 +22,16 @@ router = APIRouter() ######################### # APIs # ######################### + + @router.post('/download') async def download_bio_data( - search_param: BioModel=Depends(BioModel.as_body), - download_param: BioDownloadModel=Depends(BioDownloadModel.as_body), + search_param: BioModel = Depends(BioModel.as_body), + download_param: BioDownloadModel = Depends(BioDownloadModel.as_body), bio_service: BioViewService = Depends(get_service(BioViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), - session: Union[UserSession, None]=Depends(verify_session) - ): + session: Union[UserSession, None] = Depends(verify_session) +): # 通常のビューとはルーティングの扱いを変えるために、個別のルーターで登録する # error_log(date("Y/m/d H:i:s") . " [INFO] getBioData start" . "\r\n", 3, "$execLog"); # 改修後のパラメータを打ち出すようにする @@ -68,14 +69,18 @@ async def download_bio_data( # 値を変換 # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply(lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) + extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( + lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) # データ区分の区分の日本語名を設定 extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_no_err_flg'] = extract_df['lot_no_err_flg'].apply(lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_no'].apply(lambda bef_slip_mgt_no:extract_df['ins_dt'] if bef_slip_mgt_no is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_no'].apply(lambda bef_slip_mgt_no:extract_df['ins_usr'] if bef_slip_mgt_no is not None else '') + extract_df.loc[:, 'lot_no_err_flg'] = extract_df['lot_no_err_flg'].apply( + lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_no'].apply( + lambda bef_slip_mgt_no: extract_df['ins_dt'] if bef_slip_mgt_no is not None else '') + extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_no'].apply( + lambda bef_slip_mgt_no: extract_df['ins_usr'] if bef_slip_mgt_no is not None else '') # 種別によって出力を変える local_file_path = '' @@ -84,12 +89,14 @@ async def download_bio_data( local_file_path = bio_service.write_excel_file(extract_df, download_param.user_id, timestamp=now) elif download_param.kind == 'csv': # error_log(date("Y/m/d H:i:s") . " [INFO] 今回はCSVファイルに出力する" . "\r\n", 3, "$execLog"); - local_file_path = bio_service.write_csv_file(extract_df, download_param.user_id, header=constants.BIO_CSV_HEADER, timestamp=now) + local_file_path = bio_service.write_csv_file( + extract_df, download_param.user_id, header=constants.BIO_CSV_HEADER, timestamp=now) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: bio_service.upload_bio_data_file(local_file_path) - download_file_url = bio_service.generate_download_file_url(local_file_path, download_param.user_id, download_param.kind) + download_file_url = bio_service.generate_download_file_url( + local_file_path, download_param.user_id, download_param.kind) except Exception as e: print('S3 access error', e.args) raise HTTPException( diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py index bd571edd..cdb8f00e 100644 --- a/ecs/jskult-webapp/src/controller/healthcheck.py +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -5,6 +5,8 @@ router = APIRouter() ######################### # Views # ######################### + + @router.get('/') def healthcheck(): return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index a7bc6808..e8246322 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -1,4 +1,3 @@ -import os.path as path import secrets import urllib.parse as parse from typing import Union @@ -25,6 +24,8 @@ router.route_class = AfterSetCookieSessionRoute ######################### # Views # ######################### + + @router.get('/userlogin') def login_user_redirect_view(): auth_query_string = parse.urlencode( @@ -39,6 +40,7 @@ def login_user_redirect_view(): return RedirectResponse(url=authorize_endpoint_url, status_code=status.HTTP_303_SEE_OTHER) + @router.get('/maintlogin') def login_maintenance_view(request: Request): mainte_login = MainteLoginViewModel() @@ -53,20 +55,22 @@ def login_maintenance_view(request: Request): ######################### # APIs # ######################### + + @router.post('/maintlogin') def login( - response: Response, - request: LoginModel = Depends(LoginModel.as_form), - login_service: LoginService = Depends(get_service(LoginService)) - ): + response: Response, + request: LoginModel = Depends(LoginModel.as_form), + login_service: LoginService = Depends(get_service(LoginService)) +): try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: print(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) - except JWTTokenVerifyException as e: + except JWTTokenVerifyException: 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 @@ -92,7 +96,7 @@ def login( user_flg=user_record.mntuser_flg ) session_key = set_session(session_model) - + response = RedirectResponse( url='/menu', status_code=status.HTTP_303_SEE_OTHER, @@ -103,9 +107,9 @@ def login( @router.get('/authorize') def sso_authorize( - code:Union[str, None]=Depends(code_security), - login_service: LoginService=Depends(get_service(LoginService)) - ) -> Response: + code: Union[str, None] = Depends(code_security), + login_service: LoginService = Depends(get_service(LoginService)) +) -> Response: if not code: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_NOT_LOGIN) @@ -114,7 +118,7 @@ def sso_authorize( try: # トークン検証 verified_token = jwt_token.verify_token() - except JWTTokenVerifyException as e: + except JWTTokenVerifyException: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) # トークンからユーザーIDを取得 diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 8cad1b5f..79de281c 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -14,12 +14,14 @@ router = APIRouter() ######################### # Views # ######################### + + @router.get('/', response_class=HTMLResponse) def logout_view( - request: Request, - reason: Optional[str] = None, - session: Union[UserSession, None]=Depends(verify_session) - ): + request: Request, + reason: Optional[str] = None, + session: Union[UserSession, None] = Depends(verify_session) +): redirect_to = '/login/userlogin' link_text = 'MeDaCA機能メニューへ' if session is not None and session.user_flg == '1': diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py index a9e450bb..27065dc7 100644 --- a/ecs/jskult-webapp/src/controller/menu.py +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -16,11 +16,13 @@ router.route_class = AuthenticatedRoute ######################### # Views # ######################### + + @router.get('/', response_class=HTMLResponse) def menu_view( - request: Request, - batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)) - ): + request: Request, + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): session: UserSession = request.session # 日付マスターからバッチ情報を取得する hdke_tbl_record = batch_status_service.hdke_table_record diff --git a/ecs/jskult-webapp/src/core/tasks.py b/ecs/jskult-webapp/src/core/tasks.py index 42352465..93f4c8f5 100644 --- a/ecs/jskult-webapp/src/core/tasks.py +++ b/ecs/jskult-webapp/src/core/tasks.py @@ -18,4 +18,4 @@ def create_stop_app_handler(app: FastAPI) -> Callable: def stop_app() -> None: close_db(app) - return stop_app \ No newline at end of file + return stop_app diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py index dfd73858..d0d645c7 100644 --- a/ecs/jskult-webapp/src/db/sql_condition.py +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -16,13 +16,14 @@ class SQLCondition: self.column = column self.operator = operator self.param = param - self.literal=literal - + self.literal = literal + def apply(self): # literalがFalseならプレースホルダー。Trueだったならは固定値。 param = f':{self.param}' if self.literal is False else self.param return f' {self.column} {self.operator} {param}' + # 定数 EQ = '=' NE = '<>' @@ -32,4 +33,4 @@ GE = '>=' LE = '<=' LIKE = 'LIKE' IS = 'IS' -IS_NOT = 'IS NOT' \ No newline at end of file +IS_NOT = 'IS NOT' diff --git a/ecs/jskult-webapp/src/depends/auth.py b/ecs/jskult-webapp/src/depends/auth.py index 3310df6f..893c95e4 100644 --- a/ecs/jskult-webapp/src/depends/auth.py +++ b/ecs/jskult-webapp/src/depends/auth.py @@ -17,26 +17,28 @@ code_security = APIKeyQuery(name='code', auto_error=False) def get_current_session(session_key=Depends(cookie_security)): if session_key is None: return None - + session = get_session(session_key) # sessionが存在しない場合はNoneが返る return session -def check_session_expired(session:Union[UserSession, None]=Depends(get_current_session)): +def check_session_expired(session: Union[UserSession, None] = Depends(get_current_session)): """セッションの最後にアクセスした時間が、セッション有効期限切れであるかどうかをチェックする""" if session is None: return None last_access_time = session.last_access_time - session_expired_period = datetime.datetime.fromtimestamp(last_access_time) + datetime.timedelta(minutes=environment.SESSION_EXPIRE_MINUTE) + session_expired_period = datetime.datetime.fromtimestamp( + last_access_time) + datetime.timedelta(minutes=environment.SESSION_EXPIRE_MINUTE) if session_expired_period < datetime.datetime.now(): return None - + return session -def verify_session(session:Union[UserSession, None]=Depends(check_session_expired)): + +def verify_session(session: Union[UserSession, None] = Depends(check_session_expired)): if session is None: return None jwt_token = JWTToken(session.id_token, session.refresh_token) diff --git a/ecs/jskult-webapp/src/depends/database.py b/ecs/jskult-webapp/src/depends/database.py index f764d5c5..c5b28042 100644 --- a/ecs/jskult-webapp/src/depends/database.py +++ b/ecs/jskult-webapp/src/depends/database.py @@ -14,4 +14,4 @@ def get_database(request: Request) -> Database: def get_repository(Repo_type: Type[BaseRepository]) -> Callable: def get_repo(db: Database = Depends(get_database)) -> Type[BaseRepository]: return Repo_type(db) - return get_repo \ No newline at end of file + return get_repo diff --git a/ecs/jskult-webapp/src/depends/services.py b/ecs/jskult-webapp/src/depends/services.py index d93a0c97..40bf31cf 100644 --- a/ecs/jskult-webapp/src/depends/services.py +++ b/ecs/jskult-webapp/src/depends/services.py @@ -1,7 +1,6 @@ from typing import Callable, Type from fastapi import Depends -from starlette.requests import Request from src.db.database import Database from src.depends.database import get_database @@ -9,8 +8,8 @@ from src.services.base_service import BaseService def get_service(Service_type: Type[BaseService]) -> Callable: - def get_service(db: Database=Depends(get_database)) -> Type[BaseService]: + def get_service(db: Database = Depends(get_database)) -> Type[BaseService]: repositories = {key: repository(db) for key, repository in Service_type.REPOSITORIES.items()} clients = {key: client() for key, client in Service_type.CLIENTS.items()} return Service_type(repositories=repositories, clients=clients) - return get_service \ No newline at end of file + return get_service diff --git a/ecs/jskult-webapp/src/error/exceptions.py b/ecs/jskult-webapp/src/error/exceptions.py index 53b299db..4e73515c 100644 --- a/ecs/jskult-webapp/src/error/exceptions.py +++ b/ecs/jskult-webapp/src/error/exceptions.py @@ -7,18 +7,22 @@ class MeDaCaException(Exception): """Webアプリの共通例外""" pass + class NotAuthorizeException(MeDaCaException): """認証失敗の例外""" pass + class JWTTokenVerifyException(MeDaCaException): """トークン検証失敗の例外""" pass + class DBException(MeDaCaException): """DB関連の例外""" pass + class UnexpectedException(MeDaCaException): """予期しない例外""" diff --git a/ecs/jskult-webapp/src/model/db/hdke_tbl.py b/ecs/jskult-webapp/src/model/db/hdke_tbl.py index 920cb2e3..944581d5 100644 --- a/ecs/jskult-webapp/src/model/db/hdke_tbl.py +++ b/ecs/jskult-webapp/src/model/db/hdke_tbl.py @@ -1,4 +1,3 @@ -from datetime import datetime from typing import Optional from src.model.db.base_db_model import BaseDBModel diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 5b55c014..82fe50f9 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -28,9 +28,9 @@ class UserMasterModel(BaseDBModel): def is_enable_user(self): return self.enabled_flg == 'Y' - + def is_maintenance_user(self): return self.mntuser_flg == '1' - + def is_groupware_user(self): return self.mntuser_flg == '0' diff --git a/ecs/jskult-webapp/src/model/internal/jwt_token.py b/ecs/jskult-webapp/src/model/internal/jwt_token.py index a10635ad..d7544125 100644 --- a/ecs/jskult-webapp/src/model/internal/jwt_token.py +++ b/ecs/jskult-webapp/src/model/internal/jwt_token.py @@ -15,11 +15,11 @@ class JWTToken: refresh_token: str verified_jwt: Optional[dict] - def __init__(self, id_token: str, refresh_token: str, verified_jwt: dict=None) -> None: + def __init__(self, id_token: str, refresh_token: str, verified_jwt: dict = None) -> None: self.id_token = id_token self.refresh_token = refresh_token self.verified_jwt = verified_jwt - + @property def verified_token(self): if self.verified_jwt is None: @@ -29,7 +29,7 @@ class JWTToken: @property def user_id(self): verified_token = self.verified_token - + user_id: str = None identities: dict = verified_token.get('identities') if identities is not None: @@ -63,7 +63,7 @@ class JWTToken: 'code': code, 'redirect_uri': environment.COGNITO_REDIRECT_URI } - + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') auth_header_value = base64.b64encode(message).decode() request_headers = { @@ -76,7 +76,7 @@ class JWTToken: raise JWTTokenVerifyException(res.text) token_response = json.loads(res.text) - + return cls(id_token=token_response['id_token'], refresh_token=token_response['refresh_token']) @classmethod @@ -99,7 +99,7 @@ class JWTToken: 'refresh_token': refresh_token, 'redirect_uri': environment.COGNITO_REDIRECT_URI } - + message = bytes(f'{environment.COGNITO_CLIENT_ID}:{environment.COGNITO_CLIENT_SECRET}', 'utf8') auth_header_value = base64.b64encode(message).decode() request_headers = { @@ -117,13 +117,13 @@ class JWTToken: def verify_token(self): if self.id_token is None: raise Exception('アクセストークンがない') - + issuer = f'https://cognito-idp.{environment.AWS_REGION}.amazonaws.com/{environment.COGNITO_USER_POOL_ID}' jwks_url = f'{issuer}/.well-known/jwks.json' - + jwks_client = jwt.PyJWKClient(jwks_url) signing_key = jwks_client.get_signing_key_from_jwt(self.id_token) - + try: verified_jwt = jwt.decode( self.id_token, diff --git a/ecs/jskult-webapp/src/model/internal/session.py b/ecs/jskult-webapp/src/model/internal/session.py index 5235d0f3..15739c28 100644 --- a/ecs/jskult-webapp/src/model/internal/session.py +++ b/ecs/jskult-webapp/src/model/internal/session.py @@ -27,7 +27,7 @@ class UserSession(DynamoDBTableModel): @classmethod def new_last_access_time(cls): return datetime.datetime.now().timestamp() - + @classmethod def new_record_expiration_time(cls, expire=environment.SESSION_EXPIRE_MINUTE): last_access_time = datetime.datetime.fromtimestamp(cls.new_last_access_time()) @@ -35,8 +35,8 @@ class UserSession(DynamoDBTableModel): @classmethod def new( - cls, user_id, id_token, refresh_token, csrf_token, doc_flg, inst_flg, bio_flg, master_mainte_flg, user_flg - ): + cls, user_id, id_token, refresh_token, csrf_token, doc_flg, inst_flg, bio_flg, master_mainte_flg, user_flg + ): return cls( session_key=str(uuid.uuid4()), user_id=user_id, @@ -47,7 +47,7 @@ class UserSession(DynamoDBTableModel): inst_flg=inst_flg, bio_flg=bio_flg, master_mainte_flg=master_mainte_flg, - user_flg=user_flg, + user_flg=user_flg, last_access_time=cls.new_last_access_time(), record_expiration_time=cls.new_record_expiration_time() ) diff --git a/ecs/jskult-webapp/src/model/request/bio.py b/ecs/jskult-webapp/src/model/request/bio.py index a32bb2f2..63994e07 100644 --- a/ecs/jskult-webapp/src/model/request/bio.py +++ b/ecs/jskult-webapp/src/model/request/bio.py @@ -50,7 +50,7 @@ class BioModel(BaseModel): ctrl_rev_hsdnymd_srk_to, ikoFlg ) - + @classmethod def as_body( cls, @@ -79,7 +79,6 @@ class BioModel(BaseModel): ctrl_rev_hsdnymd_srk_to, ikoFlg ) - def __convert_request_param( cls, @@ -134,4 +133,4 @@ class BioModel(BaseModel): rev_hsdnymd_srk_from=rev_hsdnymd_srk_from, rev_hsdnymd_srk_to=rev_hsdnymd_srk_to, ikoFlg=ikoFlg - ) \ No newline at end of file + ) diff --git a/ecs/jskult-webapp/src/model/request/bio_download.py b/ecs/jskult-webapp/src/model/request/bio_download.py index 8b4b5ae9..51bea2e3 100644 --- a/ecs/jskult-webapp/src/model/request/bio_download.py +++ b/ecs/jskult-webapp/src/model/request/bio_download.py @@ -1,5 +1,3 @@ -from typing import Optional - from fastapi import Body from pydantic import BaseModel @@ -7,7 +5,7 @@ from pydantic import BaseModel class BioDownloadModel(BaseModel): user_id: str kind: str - + @classmethod def as_body( cls, diff --git a/ecs/jskult-webapp/src/model/request/login.py b/ecs/jskult-webapp/src/model/request/login.py index f0c431ab..0e7710cb 100644 --- a/ecs/jskult-webapp/src/model/request/login.py +++ b/ecs/jskult-webapp/src/model/request/login.py @@ -5,7 +5,7 @@ from pydantic import BaseModel class LoginModel(BaseModel): username: str password: str - + @classmethod def as_form( cls, diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index 0f1a11fd..42bd0f42 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -7,12 +7,12 @@ from src.util.sanitize import sanitize class BisDisplayModel(BioSalesViewModel): def __init__(self, param: BioSalesViewModel) -> None: super().__init__(**param.dict()) - + # 区分・フラグの正式名称を設定 self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) - + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット if (self.bef_slip_mgt_no is None): self.ins_dt = "" 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 0657bd3c..1c6c98e3 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -20,7 +20,7 @@ class BioViewModel(BaseModel): phm_models: list[PharmacyProductMasterModel] bio_data: Optional[list[BisDisplayModel]] = [] form_data: Optional[BioModel] - + def display_wholesaler_names(self): display_names = [ f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' @@ -41,7 +41,7 @@ class BioViewModel(BaseModel): def display_data_kbn(self): return OrderedDict( { - '' : '', + '': '', '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', @@ -59,14 +59,16 @@ class BioViewModel(BaseModel): if not self.is_form_submitted(): return '' - form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' + form_wholesaler_full_name = \ + f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' + return self._selected_value(form_wholesaler_full_name, selected_wholesaler) def is_selected_org_kbn(self, selected_org_kbn): if not self.is_form_submitted(): return '' return self._selected_value(self.form_data.org_kbn, selected_org_kbn) - + def is_input_rec_ymd_from(self): if not self.is_form_submitted(): return '' @@ -84,17 +86,17 @@ class BioViewModel(BaseModel): return '' return self.form_data.rec_lot_num or '' - + def is_selected_data_kbn(self, selected_data_kbn): if not self.is_form_submitted(): return '' - + return self._selected_value(self.form_data.data_kbn, selected_data_kbn) def is_selected_maker_cd(self, selected_maker_cd): if not self.is_form_submitted(): return '' - + return self._selected_value(self.form_data.maker_cd, selected_maker_cd) def is_input_rev_hsdnymd_srk_from(self): @@ -108,13 +110,13 @@ class BioViewModel(BaseModel): return '' return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) - + def is_checked_iko_flg(self): if not self.is_form_submitted(): return '' return 'checked' if self.form_data.ikoFlg else '' - + def disabled_button(self): return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' @@ -123,7 +125,7 @@ class BioViewModel(BaseModel): def is_data_empty(self): return len(self.bio_data) == 0 - + def is_data_overflow_max_length(self): return len(self.bio_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT diff --git a/ecs/jskult-webapp/src/model/view/logout_view_model.py b/ecs/jskult-webapp/src/model/view/logout_view_model.py index b219918a..6935a309 100644 --- a/ecs/jskult-webapp/src/model/view/logout_view_model.py +++ b/ecs/jskult-webapp/src/model/view/logout_view_model.py @@ -7,4 +7,4 @@ class LogoutViewModel(BaseModel): subtitle: str = 'MeDaCA Logout' redirect_to: Optional[str] reason: Optional[str] - link_text:Optional[str] + link_text: Optional[str] 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 7d36fba2..3ef9ca12 100644 --- a/ecs/jskult-webapp/src/model/view/user_view_model.py +++ b/ecs/jskult-webapp/src/model/view/user_view_model.py @@ -7,9 +7,9 @@ class UserViewModel(BaseModel): bio_flg: str # AUTH_FLG1 doc_flg: str # AUTH_FLG2 inst_flg: str # AUTH_FLG3 - master_mainte_flg: str # AUTH_FLG4 + master_mainte_flg: str # AUTH_FLG4 user_flg: Optional[str] # MNTUSER_FLG - + def has_ult_doctor_permission(self): return self.doc_flg == '1' @@ -21,6 +21,6 @@ class UserViewModel(BaseModel): def has_master_maintenance_permission(self): return self.master_mainte_flg == '1' - + def is_maintenance_user(self): return self.user_flg == '1' diff --git a/ecs/jskult-webapp/src/repositories/base_repository.py b/ecs/jskult-webapp/src/repositories/base_repository.py index 60f9ba33..20aac09f 100644 --- a/ecs/jskult-webapp/src/repositories/base_repository.py +++ b/ecs/jskult-webapp/src/repositories/base_repository.py @@ -8,8 +8,9 @@ from src.model.db.base_db_model import BaseDBModel class BaseRepository(metaclass=ABCMeta): - + _database: Database + def __init__(self, db: Database) -> None: self._database = db @@ -29,10 +30,9 @@ class BaseRepository(metaclass=ABCMeta): """DBの取得結果をデータフレームにして返す""" pass - def _to_data_frame(self, query, parameter: BaseDBModel): """DBの取得結果をデータフレームに変換する""" - params = params=parameter.dict() + params = params = parameter.dict() sql_query = pd.read_sql( text(query), diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 69e50783..c9a60c30 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -55,7 +55,6 @@ class BioSalesViewRepository(BaseRepository): finally: self._database.disconnect() - def fetch_as_data_frame(self, parameter: BioModel): try: self._database.connect() @@ -95,7 +94,7 @@ class BioSalesViewRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ + rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): @@ -112,7 +111,7 @@ class BioSalesViewRepository(BaseRepository): # 移行フラグ # チェックが入っていない場合、移行対象(IKO_FLG = '*')を省く if parameter.ikoFlg is None: - where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True)) + where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True)) # 固定条件 # Viewで返されるロット番号9件をNull以外で抽出 where_clauses.append(SQLCondition('LENGTH(TRIM(rec_lot_num))', condition.GT, '0', literal=True)) diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py index e3a72f23..6927533b 100644 --- a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -1,5 +1,4 @@ from src.model.db.hdke_tbl import HdkeTblModel -from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index f6523612..2720955f 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -3,15 +3,15 @@ from src.repositories.base_repository import BaseRepository class PharmacyProductMasterRepository(BaseRepository): - + FETCH_SQL = """\ - SELECT + SELECT CONCAT(IFNULL(mkr_cd, ''), ' ', IFNULL(mkr_inf_1, '')) AS mkr_cd_nm FROM src05.phm_prd_mst_v t1 - INNER JOIN + INNER JOIN ( - SELECT + SELECT prd_cd,MAX(sub_no) AS sno FROM src05.phm_prd_mst_v diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index e5e1ba41..60228074 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -1,5 +1,4 @@ from src.model.db.user_master import UserMasterModel -from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository @@ -27,4 +26,4 @@ class UserMasterRepository(BaseRepository): print(f"[ERROR] DB Error : Exception={e.args}") raise e finally: - self._database.disconnect() \ No newline at end of file + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py index 0f625bc7..246eea5e 100644 --- a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -3,7 +3,7 @@ from src.repositories.base_repository import BaseRepository class WholesalerMasterRepository(BaseRepository): - + FETCH_SQL = """\ SELECT DISTINCT b.rec_whs_cd, @@ -17,7 +17,7 @@ class WholesalerMasterRepository(BaseRepository): FROM src05.whs_mst_v WHERE (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM src05.hdke_tbl) BETWEEN start_date AND end_date ) v2 - ON b.v_whs_cd = v2.v_whs_cd + ON b.v_whs_cd = v2.v_whs_cd AND v2.rec_sts_kbn <> '9' ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_nm DESC """ diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 7a4ada09..e2699784 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -13,12 +13,14 @@ from src.system_var import constants, environment logger = logging.getLogger('uvicorn') + class MeDaCaRoute(APIRoute): """アプリケーションのカスタムルーター Args: APIRoute (APIRoute): FastAPIの標準APIRoute """ + def get_route_handler(self) -> Callable: """前後処理を付加するルートハンドラーを返す @@ -60,6 +62,7 @@ class MeDaCaRoute(APIRoute): Request: 加工後のRequestインスタンス """ return request + async def post_process_route(self, request: Request, response: Response) -> Response: """ルートハンドラーの事後処理 @@ -71,6 +74,7 @@ class MeDaCaRoute(APIRoute): """ return response + class BeforeCheckSessionRoute(MeDaCaRoute): """事前処理として、セッションチェックを行うルートハンドラー @@ -86,12 +90,14 @@ class BeforeCheckSessionRoute(MeDaCaRoute): verified_session = verify_session(checked_session) # セッションが有効でない場合、エラーにする if verified_session is None: - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, + detail=constants.LOGOUT_REASON_SESSION_EXPIRED) scope = request.scope scope['session'] = verified_session session_request = Request(receive=request.receive, scope=scope) return session_request + class AfterSetCookieSessionRoute(MeDaCaRoute): """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー @@ -110,16 +116,18 @@ class AfterSetCookieSessionRoute(MeDaCaRoute): response.set_cookie( key='session', value=session_key, - max_age=environment.SESSION_EXPIRE_MINUTE * 60, # cookieの有効期限は秒数指定なので、60秒をかける + max_age=environment.SESSION_EXPIRE_MINUTE * 60, # cookieの有効期限は秒数指定なので、60秒をかける secure=True, httponly=True ) return response + class AuthenticatedRoute(BeforeCheckSessionRoute, AfterSetCookieSessionRoute): async def pre_process_route(self, request: Request): request = await super().pre_process_route(request) return request + async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) return response diff --git a/ecs/jskult-webapp/src/services/base_service.py b/ecs/jskult-webapp/src/services/base_service.py index a2669225..7fd71b3b 100644 --- a/ecs/jskult-webapp/src/services/base_service.py +++ b/ecs/jskult-webapp/src/services/base_service.py @@ -9,5 +9,6 @@ class BaseService(metaclass=ABCMeta): REPOSITORIES: dict[str, BaseRepository] = {} # 各サービスが依存するAWS APIクライアントクラスのマップ CLIENTS: dict[str, AWSAPIClient] = {} + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: pass diff --git a/ecs/jskult-webapp/src/services/batch_status_service.py b/ecs/jskult-webapp/src/services/batch_status_service.py index e30f0bed..c9f6c6a7 100644 --- a/ecs/jskult-webapp/src/services/batch_status_service.py +++ b/ecs/jskult-webapp/src/services/batch_status_service.py @@ -13,6 +13,7 @@ class BatchStatusService(BaseService): } hdke_table_repository: HdkeTblRepository __hdke_table_record: list[HdkeTblModel] = [] + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) self.hdke_table_repository = repositories['hdke_table_repository'] @@ -38,4 +39,3 @@ class BatchStatusService(BaseService): # 日付マスタのレコードがない場合は例外とする if len(self.__hdke_table_record) == 0: raise DBException('日付テーブルのレコードが存在しません') - diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 99726d23..8fa05778 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -26,15 +26,16 @@ class BioViewService(BaseService): 'phm_repository': PharmacyProductMasterRepository, 'bio_sales_repository': BioSalesViewRepository } - + CLIENTS = { 's3_client': S3Client } - + whs_repository: WholesalerMasterRepository phm_repository: PharmacyProductMasterRepository bio_sales_repository: BioSalesViewRepository s3_client: S3Client + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) self.whs_repository = repositories['whs_repository'] @@ -45,7 +46,7 @@ class BioViewService(BaseService): def prepare_bio_view( self, session: UserSession - ) ->BioViewModel: + ) -> BioViewModel: # 卸リストを取得 wholesalers = self.whs_repository.fetch_all() # 製品リストを取得 @@ -72,7 +73,8 @@ class BioViewService(BaseService): def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): # Excelに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') # テンプレートファイルをコピーして出力ファイルの枠だけを作る shutil.copyfile( @@ -87,12 +89,13 @@ class BioViewService(BaseService): # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) - + return output_file_path def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): # csvに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') # 横長のDataFrameとするため、ヘッダーの加工処理 header_data = {} for df_column, header_column in zip(data_frame.columns, header): @@ -108,10 +111,10 @@ class BioViewService(BaseService): def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET # TODO: フォルダを変える - file_key =f'bio/{path.basename(local_file_path)}' + file_key = f'bio/{path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) - - def generate_download_file_url(self, local_file_path:str, user_id: str, kind: str) -> str: + + def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET # TODO: フォルダを変える file_key = f'bio/{path.basename(local_file_path)}' diff --git a/ecs/jskult-webapp/src/services/login_service.py b/ecs/jskult-webapp/src/services/login_service.py index 6442c82a..aa1f37fd 100644 --- a/ecs/jskult-webapp/src/services/login_service.py +++ b/ecs/jskult-webapp/src/services/login_service.py @@ -17,7 +17,7 @@ class LoginService(BaseService): REPOSITORIES = { 'user_repository': UserMasterRepository } - + CLIENTS = { 'cognito_client': CognitoClient } @@ -41,10 +41,10 @@ class LoginService(BaseService): raise e return JWTToken(id_token, refresh_token) - + def login_with_security_code(self, code: str) -> JWTToken: return JWTToken.request(code) - + def logged_in_user(self, user_id): user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) return user_record diff --git a/ecs/jskult-webapp/src/services/session_service.py b/ecs/jskult-webapp/src/services/session_service.py index 92a7a193..e93d9dde 100644 --- a/ecs/jskult-webapp/src/services/session_service.py +++ b/ecs/jskult-webapp/src/services/session_service.py @@ -6,6 +6,7 @@ def set_session(session: UserSession) -> str: session.save() return session.session_key + def get_session(key: str) -> UserSession: try: session = UserSession.get(hash_key=key, consistent_read=True) diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index aed9916c..7d82d560 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -19,4 +19,4 @@ 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']) -SESSION_EXPIRE_MINUTE=int(os.environ['SESSION_EXPIRE_MINUTE']) \ No newline at end of file +SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE']) From 6f715e96e5b7aff1b60ddefc4b06b837d460bf6a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 12 May 2023 13:46:07 +0900 Subject: [PATCH 266/962] =?UTF-8?q?feat:=20=E3=83=AB=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=91=E3=82=B9=E3=81=B8=E3=81=AE=E3=82=A2=E3=82=AF=E3=82=BB?= =?UTF-8?q?=E3=82=B9=E3=81=AF=E9=A1=A7=E5=AE=A2=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E7=94=BB=E9=9D=A2=E3=81=AB=E3=83=AA=E3=83=80=E3=82=A4?= =?UTF-8?q?=E3=83=AC=E3=82=AF=E3=83=88=E3=81=95=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/root.py | 11 +++++++++++ ecs/jskult-webapp/src/main.py | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-webapp/src/controller/root.py diff --git a/ecs/jskult-webapp/src/controller/root.py b/ecs/jskult-webapp/src/controller/root.py new file mode 100644 index 00000000..c02471ca --- /dev/null +++ b/ecs/jskult-webapp/src/controller/root.py @@ -0,0 +1,11 @@ +from fastapi import APIRouter +from fastapi.responses import RedirectResponse +from starlette import status + +router = APIRouter() + + +@router.get('/') +def redirect_to_user_login(): + # ルートパスへのアクセスは、顧客ユーザーログイン画面にリダイレクトさせる + return RedirectResponse(url='/login/userlogin', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index f00f5ac3..bd95af18 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -5,7 +5,8 @@ from fastapi.staticfiles import StaticFiles from starlette import status import src.static as static -from src.controller import bio, bio_download, healthcheck, login, logout, menu +from src.controller import (bio, bio_download, healthcheck, login, logout, + menu, root) from src.core import tasks from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException @@ -14,6 +15,8 @@ app = FastAPI() # 静的ファイルをマウント app.mount('/static', StaticFiles(directory=path.dirname(static.__file__)), name='static') +# ルートパス。顧客ログイン画面にリダイレクトさせる +app.include_router(root.router) # ログイン関連のルーター app.include_router(login.router, prefix='/login') # ログアウト関連のルーター From a806b5602ef99b66e1e7f8707ef2610eea36eeee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 15:13:31 +0900 Subject: [PATCH 267/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E8=A8=BA=E7=99=82=E7=A7=91=E7=9B=AE--=E4=BD=9C?= =?UTF-8?q?=E6=88=90=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_trt_course_mapper.py | 99 +++++++++++++++++++ .../utmp_tables/tables/com_trt_course.py | 18 ++++ 2 files changed, 117 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py new file mode 100644 index 00000000..e8b4388f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_trt_course_mapper.py @@ -0,0 +1,99 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_trt_course import ComTrtCourse + + +class ComTrtCourseMapper(UltmarcTableMapper): + """レイアウト区分001: COM_診療科目 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_trt_course + WHERE + trt_course_cd = :trt_course_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_trt_course + ( + trt_course_cd, + trt_course_name_kana, + trt_course_name_abb, + trt_course_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :trt_course_cd, + :trt_course_name_kana, + :trt_course_name_abb, + :trt_course_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_trt_course + SET + trt_course_name_kana = :trt_course_name_kana, + trt_course_name_abb = :trt_course_name_abb, + trt_course_name = :trt_course_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + trt_course_cd = :trt_course_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_trt_course + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + trt_course_cd = :trt_course_cd + """ + record: ComTrtCourse + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComTrtCourse) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py new file mode 100644 index 00000000..0bc0612d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_trt_course.py @@ -0,0 +1,18 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComTrtCourse(UltmarcTable): + """レイアウト区分001: COM_診療科目""" + trt_course_cd: str # 診療科目コード + trt_course_name_kana: str # 診療科目名カナ + trt_course_name_abb: str # 診療科目名略称 + trt_course_name: str # 診療科目名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.trt_course_cd = record[1] + self.maint_flag = record[2] + self.trt_course_name_abb = record[5] + self.trt_course_name = record[6] + self.trt_course_name_kana = record[7] From 5341dc4186748cb42e471aa5ee36c506c2b3d0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 16:02:30 +0900 Subject: [PATCH 268/962] =?UTF-8?q?=E7=89=A9=E7=90=86=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_med_area_city/com_med_area_city_delete.csv | 6 +++--- .../com_med_area_city/test_com_med_area_city_mapper.py | 6 ++++-- .../table_mapper/com_med_prefc/test_com_med_prefc_mapper.py | 6 ++++-- .../com_snd_med_sphe/test_com_snd_med_sphe_mapper.py | 6 ++++-- .../table_mapper/com_thrd_med/test_com_thrd_med_mapper.py | 6 ++++-- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv index 126012d4..631fe4f9 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/com_med_area_city_delete.csv @@ -1,3 +1,3 @@ -"124","1","1","B","1","202","1","20141113","20141114","","" -"124","1","1","B","1","900","1","20141113","20141114","1","2" -"124","1","1","B","1","331","1","20141113","20141114","1","1" +"124","01","01","B","01","202","1","20141113","20141114","","" +"124","01","01","B","01","900","1","20141113","20141114","01","02" +"124","01","01","B","01","331","1","20141113","20141114","01","01" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py index 1e0bfcc3..0b208ab0 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_area_city/test_com_med_area_city_mapper.py @@ -187,10 +187,10 @@ class TestComMedAreaCityMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_医療圏都道府県市町村対応表テーブルのレコードを1件論理削除する + COM_医療圏都道府県市町村対応表テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -227,6 +227,8 @@ class TestComMedAreaCityMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_area_city_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_med_area_city')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] primary_keys_jis_prefc_cd = [{'jis_prefc_cd': columns['jis_prefc_cd']} for columns in expect_data_list] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py index 495e1cca..02424dbd 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_prefc/test_com_med_prefc_mapper.py @@ -158,10 +158,10 @@ class TestComMedPrefcMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_医療圏都道府県テーブルのレコードを1件論理削除する + COM_医療圏都道府県テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -198,6 +198,8 @@ class TestComMedPrefcMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_med_prefc_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_med_prefc')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys = [f"'{primary_key['pref_code']}'" for primary_key in expect_data_list] actual_select_sql = f"SELECT * FROM src05.com_med_prefc WHERE pref_code IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py index 78ff4708..82e12baa 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_snd_med_sphe/test_com_snd_med_sphe_mapper.py @@ -180,10 +180,10 @@ class TestComSndMedSphe: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_医療圏二次医療圏テーブルのレコードを1件論理削除する + COM_医療圏二次医療圏テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -220,6 +220,8 @@ class TestComSndMedSphe: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_snd_med_sphe_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_snd_med_sphe')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_prefc_cd = [{'prefc_cd': columns['prefc_cd']} for columns in expect_data_list] primary_keys_med_sphe_cd = [{'med_sphe_cd': columns['med_sphe_cd']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py index 738d570a..5440f431 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_thrd_med/test_com_thrd_med_mapper.py @@ -165,10 +165,10 @@ class TestComThrdMedMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_医療圏3次マスタテーブルのレコードを1件論理削除する + COM_医療圏3次マスタテーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -205,6 +205,8 @@ class TestComThrdMedMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_thrd_med_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_thrd_med')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_prefcode = [{'prefcode': columns['prefcode']} for columns in expect_data_list] primary_keys_thrd_cd = [{'thrd_cd': columns['thrd_cd']} for columns in expect_data_list] actual_data_list = [] From bbb49cf28ce9b2a26423804bd305b0a1dbafd351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 12 May 2023 17:53:48 +0900 Subject: [PATCH 269/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E8=A8=BA=E7=99=82=E7=A7=91=E7=9B=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_alma_mapper.py | 5 +- .../ultmarc_table_mapper_factory.py | 4 +- .../com_alma/expect_com_alma_delete.csv | 2 +- .../com_alma/expect_com_alma_update.csv | 2 +- .../table_mapper/com_trt_course/__init__.py | 0 .../com_trt_course/com_trt_course_delete.csv | 7 + .../com_trt_course/com_trt_course_insert.csv | 7 + .../com_trt_course/com_trt_course_update.csv | 6 + .../db_com_trt_course_before_delete.csv | 7 + .../db_com_trt_course_before_update.csv | 7 + .../expect_com_trt_course_delete.csv | 8 + .../expect_com_trt_course_insert.csv | 8 + .../expect_com_trt_course_update.csv | 7 + .../test_com_trt_course_mapper.py | 197 ++++++++++++++++++ 14 files changed, 260 insertions(+), 7 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py index 699cbe6c..27055955 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_mapper.py @@ -89,7 +89,4 @@ class ComAlmaMapper(UltmarcTableMapper): return self.INSERT_QUERY # 存在する場合ではUpdate - if self.record.alma == '': - return None - else: - return self.UPDATE_QUERY + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 8f5771a2..ceb8a322 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -44,6 +44,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_att_mapper imp ComInstAttMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \ ComCopHpMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_trt_course_mapper import \ + ComTrtCourseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -77,7 +79,7 @@ COM_TABLE_LIST = { # COM_都道府県医療機能情報(専門外来) "136": ComPrefcMedSpOutpatMapper, # COM_診療科目 - "001": NullMapper, + "001": ComTrtCourseMapper, # COM_病院種別 "002": NullMapper, # COM_出身校学部識別 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv index afaca4a8..6cb36d4b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_delete.csv @@ -2,7 +2,7 @@ "001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" -"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","clsComAlma" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "005","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "006","福島医","20171020","20171020","20171020","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:43:15","com_alma_mapper" "007","群馬大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:43:15","com_alma_mapper","2017/10/20 10:43:15","com_alma_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv index 4fc8b3bc..f25889be 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma/expect_com_alma_update.csv @@ -2,7 +2,7 @@ "001","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "002","札幌医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "003","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" -"004","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","clsComAlma" +"004","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:27:33","com_alma_mapper" "005","福島医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "006","東北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","clsComAlma","2017/10/20 10:35:27","com_alma_mapper" "007","神大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:27:33","com_alma_mapper","2017/10/20 10:35:27","com_alma_mapper" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv new file mode 100644 index 00000000..a676cbda --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_delete.csv @@ -0,0 +1,7 @@ +"001","A01","A","20141113","20141114","","","" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","C","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","A06","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" +"001","A07","A","20141113","20141114","内薬","内科(薬物療法)","ナイカ(ヤクブツリヨウホウ)" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv new file mode 100644 index 00000000..e3b96df2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_insert.csv @@ -0,0 +1,7 @@ +"001","A01","A","20141113","20141114","内","一般内科","イツパンナイカ" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","A","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" +"001","A06","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","999","A","","","あいうえ","あいうえおかきくけこあいうえおかきくけこ","アイウエオカキクケコアイウエオカキクケコケコ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv new file mode 100644 index 00000000..e092df90 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/com_trt_course_update.csv @@ -0,0 +1,6 @@ +"001","A01","A","20141113","20141114","","","" +"001","A02","A","20141113","20141114","腫瘍","腫瘍科","シユヨウカ" +"001","A03","A","20141113","20141114","腫内","腫瘍内科","シユヨウナイカ" +"001","A04","A","20141113","20141114","腫疼","腫瘍内科(疼痛緩和)","シユヨウナイカ(トウツウカンワ)" +"001","A05","A","20141113","20141114","内循","内科(循環器)","ナイカ(ジユンカンキ)" +"001","A06","A","20141113","20141114","血腫","血液・腫瘍内科","ケツエキ.シユヨウナイカ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv new file mode 100644 index 00000000..19181a3b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_delete.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","","","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:59:56","clsComTrtCourse" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv new file mode 100644 index 00000000..2dc257c0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/db_com_trt_course_before_update.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","イツパンナイカ","内","一般内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A05","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" +"A06","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 8:54:31","clsComTrtCourse" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv new file mode 100644 index 00000000..a60d80b4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_delete.csv @@ -0,0 +1,8 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","","","","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20171020","20230512","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/11 09:16:56","com_trt_course_mapper" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2017/10/20 9:16:56","com_trt_course_mapper" +"A07","ナイカ(ヤクブツリヨウホウ)","内薬","内科(薬物療法)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:16:56","com_trt_course_mapper","2017/10/20 9:16:56","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv new file mode 100644 index 00000000..6c9ce9f1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_insert.csv @@ -0,0 +1,8 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"999","アイウエオカキクケコアイウエオカキクケコケコ","あいうえ","あいうえおかきくけこあいうえおかきくけこ","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A01","イツパンナイカ","内","一般内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A05","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" +"A06","ナイカ(ジユンカンキ)","内循","内科(循環器)","20230512","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","com_trt_course_mapper","2017/10/20 8:54:31","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv new file mode 100644 index 00000000..1bc94e34 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/expect_com_trt_course_update.csv @@ -0,0 +1,7 @@ +"trt_course_cd","trt_course_name_kana","trt_course_name_abb","trt_course_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","","","","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A02","シユヨウカ","腫瘍","腫瘍科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A03","シユヨウナイカ","腫内","腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A04","シユヨウナイカ(トウツウカンワ)","腫疼","腫瘍内科(疼痛緩和)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A05","ナイカ(ジユンカンキ)","内循","内科(循環器)","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" +"A06","ケツエキ.シユヨウナイカ","血腫","血液・腫瘍内科","20171020","20230512","NULL","NULL","NULL","NULL","NULL","2017/10/20 8:54:31","clsComTrtCourse","2023/05/12 8:59:56","com_trt_course_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py new file mode 100644 index 00000000..70862c22 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_trt_course_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComTrtCourseMapper: + """レイアウト区分001: COM_診療科目""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_診療科目テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_insert.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_診療科目テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_course_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_update.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_診療科目テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_trt_course_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_trt_course', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_trt_course_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_trt_course', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_trt_course_mapper.ComTrtCourseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_trt_course_mapper.ComTrtCourseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_course_delete.csv')) + primary_keys = [f"'{primary_key['trt_course_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_trt_course WHERE trt_course_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 2f1b42705a5f374bbb3551de70a036e098f114fa Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Sat, 13 May 2023 01:06:11 +0900 Subject: [PATCH 270/962] =?UTF-8?q?=E5=8F=97=E9=A0=98=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AFtar.gz=E5=BD=A2=E5=BC=8F=E3=81=AA?= =?UTF-8?q?=E3=81=AE=E3=81=A7=E8=A7=A3=E5=87=8D=E3=81=97=E3=81=A6=E3=81=8B?= =?UTF-8?q?=E3=82=89tsv=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92LOAD?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E5=AE=9F=E8=A3=85=E6=BC=8F?= =?UTF-8?q?=E3=82=8C=E3=82=92=E8=A3=9C=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 13 +++++++++++++ .../src/batch/vjsk/vjsk_importer.py | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 62111409..2e98eaac 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -1,5 +1,7 @@ import io +import os import os.path as path +import tarfile import tempfile import boto3 @@ -127,3 +129,14 @@ class VjskReceiveBucket(S3Bucket): self._s3_client.download_file(self._bucket_name, data_filename, f) f.seek(0) return temporary_file_path + + def unzip_data_file(self, filename: str): + ret = [] + with tarfile.open(filename) as tar: + temp_dir = os.path.dirname(filename) + tar.extractall(path=temp_dir) + extracted_files = tar.getnames() + for extracted_file in extracted_files: + file = os.path.join(temp_dir, extracted_file) + ret.append(file) + return ret diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index f2da3ed9..2737ffca 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -171,14 +171,17 @@ def _import_file_to_db(): local_file_path = vjsk_recv_bucket.download_data_file(file_name) logger.debug(f"download s3 file done : {file_name}") - # TODO: 受領ファイルはtar.gzなので、ローカルストレージ上で解凍する + # ローカルストレージにdownloadした受領ファイル(tar.gz)を解凍する + unzip_file_path = vjsk_recv_bucket.unzip_data_file(local_file_path) + logger.debug(f"unzip done : {unzip_file_path}") # データファイル名に該当する辞書アクセス用のキーを取得する key = vjsk_mapper.get_condkey_by_s3_file_path(file_name) # 想定されたデータファイルであれば辞書登録する if key is not None: - target_dict[key] = {"condkey": key, "src_file_path": local_file_path} + # ※受領ファイル(tar.gz)の書庫構成はtsvファイルが1つだけの前提 + target_dict[key] = {"condkey": key, "src_file_path": unzip_file_path[0]} logger.debug(f'取込対象データファイル辞書{target_dict}') # DB登録 卸在庫データファイル(卸在庫データ処理対象日のみ実施) From 8a82a53046f0507333e9fdd9333f96dd39cde591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 15 May 2023 09:00:29 +0900 Subject: [PATCH 271/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E7=97=85=E9=99=A2=E7=A8=AE=E5=88=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_hp_assrt_mapper.py | 93 +++++++++ .../utmp_tables/tables/com_hp_assrt.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_hp_assrt/__init__.py | 0 .../com_hp_assrt/com_hp_assrt_delete.csv | 7 + .../com_hp_assrt/com_hp_assrt_insert.csv | 7 + .../com_hp_assrt/com_hp_assrt_update.csv | 6 + .../db_com_hp_assrt_before_delete.csv | 7 + .../db_com_hp_assrt_before_update.csv | 8 + .../expect_com_hp_assrt_delete.csv | 7 + .../expect_com_hp_assrt_insert.csv | 8 + .../expect_com_hp_assrt_update.csv | 8 + .../com_hp_assrt/test_com_hp_assrt_mapper.py | 197 ++++++++++++++++++ .../test_com_trt_course_mapper.py | 4 +- 14 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py new file mode 100644 index 00000000..d18f824a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hp_assrt_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_hp_assrt import ComHpAssrt + + +class ComHpAssrtMapper(UltmarcTableMapper): + """レイアウト区分002: COM_病院種別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_hp_assrt + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_hp_assrt + ( + hp_assrt_cd, + hp_assrt_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :hp_assrt_cd, + :hp_assrt_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_hp_assrt + SET + hp_assrt_name = :hp_assrt_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_hp_assrt + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + hp_assrt_cd = :hp_assrt_cd + """ + record: ComHpAssrt + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComHpAssrt) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py new file mode 100644 index 00000000..e47e6513 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_hp_assrt.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComHpAssrt(UltmarcTable): + """レイアウト区分002: 病院種別""" + hp_assrt_cd: str # 病院種別コード + hp_assrt_name: str # 病院種別名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.hp_assrt_cd = record[1] + self.maint_flag = record[2] + self.hp_assrt_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index ceb8a322..7382ebc7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -46,6 +46,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper impor ComCopHpMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_trt_course_mapper import \ ComTrtCourseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hp_assrt_mapper import \ + ComHpAssrtMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -81,7 +83,7 @@ COM_TABLE_LIST = { # COM_診療科目 "001": ComTrtCourseMapper, # COM_病院種別 - "002": NullMapper, + "002": ComHpAssrtMapper, # COM_出身校学部識別 "003": NullMapper, # COM_出身校 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv new file mode 100644 index 00000000..fa9dfadd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_delete.csv @@ -0,0 +1,7 @@ +"002","1","A","20141113","20141114","" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","C","20141113","20141114","歯科" +"002","6","A","20141113","20141114","伝染" +"002","7","A","20141113","20141114","診療所" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv new file mode 100644 index 00000000..e2ee7c48 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_insert.csv @@ -0,0 +1,7 @@ +"002","1","A","20141113","20141114","一般" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","A","20141113","20141114","伝染" +"002","6","A","20141113","20141114","歯科" +"002","9","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv new file mode 100644 index 00000000..6d0fe490 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/com_hp_assrt_update.csv @@ -0,0 +1,6 @@ +"002","1","A","20141113","20141114","" +"002","2","A","20141113","20141114","精神" +"002","3","A","20141113","20141114","結核" +"002","4","A","20141113","20141114","ハンセン" +"002","5","A","20141113","20141114","歯科" +"002","6","A","20141113","20141114","伝染" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv new file mode 100644 index 00000000..68440eee --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_delete.csv @@ -0,0 +1,7 @@ +"hp_assrt_cd","hp_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"2","精神","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"3","結核","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"4","ハンセン","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"5","歯科","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" +"6","伝染","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:46:18","clsComHpAssrt" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv new file mode 100644 index 00000000..79619900 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/db_com_hp_assrt_before_update.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","一般","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"2","精神","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"3","結核","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"4","ハンセン","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"5","伝染","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"6","歯科","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2017/10/20 9:39:05","clsComHpAssrt" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv new file mode 100644 index 00000000..54dc2039 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_delete.csv @@ -0,0 +1,7 @@ +"hp_assrt_cd","hp_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"2","精神","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"3","結核","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"4","ハンセン","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"5","歯科","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" +"6","伝染","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/14 8:46:18","com_hp_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv new file mode 100644 index 00000000..c4343da0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_insert.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","一般","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"2","精神","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"3","結核","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"4","ハンセン","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"5","伝染","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"6","歯科","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","com_hp_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv new file mode 100644 index 00000000..fe04619b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/expect_com_hp_assrt_update.csv @@ -0,0 +1,8 @@ +"hp_assrt_cd","hp_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"1","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"2","精神","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"3","結核","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"4","ハンセン","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"5","歯科","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"6","伝染","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:39:05","clsComHpAssrt","2023/05/15 8:46:18","com_hp_assrt_mapper" +"9","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 7:39:05","com_hp_assrt_mapper","2023/05/15 7:39:05","aaaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py new file mode 100644 index 00000000..08f02dec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hp_assrt/test_com_hp_assrt_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_hp_assrt_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComHpAssrtMapper: + """レイアウト区分002: COM_病院種別""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_病院種別テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_insert.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_病院種別テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hp_assrt_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hp_assrt', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_update.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_病院種別テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_hp_assrt_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_hp_assrt', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_hp_assrt_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_hp_assrt', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_hp_assrt_mapper.ComHpAssrtMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_hp_assrt_mapper.ComHpAssrtMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_hp_assrt_delete.csv')) + primary_keys = [f"'{primary_key['hp_assrt_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_hp_assrt WHERE hp_assrt_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py index 70862c22..9646fc63 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_trt_course/test_com_trt_course_mapper.py @@ -28,13 +28,13 @@ class TestComTrtCourseMapper: # setup self.db = database self.db.connect() - # self.db.begin() + self.db.begin() # testing yield # teardown - # self.db.rollback() + self.db.rollback() self.db.disconnect() def test_insert_record(self): From 9be7262e9b403dadeb313b4c8478679c09d855bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 15 May 2023 11:08:36 +0900 Subject: [PATCH 272/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=87=BA=E8=BA=AB=E6=A0=A1=E5=AD=A6=E9=83=A8=E8=AD=98?= =?UTF-8?q?=E5=88=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_alma_depart_disc_mapper.py | 107 ++++++++ .../tables/com_alma_depart_disc.py | 20 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_alma_depart_disc/__init__.py | 0 .../com_alma_depart_disc_delete.csv | 7 + .../com_alma_depart_disc_insert.csv | 7 + .../com_alma_depart_disc_update.csv | 6 + .../db_com_alma_depart_disc_before_delete.csv | 7 + .../db_com_alma_depart_disc_before_update.csv | 8 + .../expect_com_alma_depart_disc_delete.csv | 8 + .../expect_com_alma_depart_disc_insert.csv | 8 + .../expect_com_alma_depart_disc_update.csv | 8 + .../test_com_alma_depart_disc_mapper.py | 236 ++++++++++++++++++ 13 files changed, 425 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py new file mode 100644 index 00000000..b5a57aad --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_alma_depart_disc_mapper.py @@ -0,0 +1,107 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_alma_depart_disc import ComAlmaDepartDisc + + +class ComAlmaDepartDiscMapper(UltmarcTableMapper): + """レイアウト区分003: COM_出身校学部識別 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_alma_depart_disc + ( + alma_cd, + depart_disc_cd, + estab_e, + estab_y, + alma_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :alma_cd, + :depart_disc_cd, + :estab_e, + :estab_y, + :alma_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_alma_depart_disc + SET + estab_e = :estab_e, + estab_y = :estab_y, + alma_name = :alma_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_alma_depart_disc + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + alma_cd = :alma_cd + AND + depart_disc_cd = :depart_disc_cd + """ + record: ComAlmaDepartDisc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComAlmaDepartDisc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py new file mode 100644 index 00000000..ae508b35 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_alma_depart_disc.py @@ -0,0 +1,20 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComAlmaDepartDisc(UltmarcTable): + """レイアウト区分003: COM_出身校学部識別""" + alma_cd: str # 出身校コード + depart_disc_cd: str # 学部識別コード + estab_e: str # 創立元号 + estab_y: str # 創立年 + alma_name: str # 出身校名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.alma_cd = record[1] + self.depart_disc_cd = record[2] + self.maint_flag = record[3] + self.alma_name = record[6] + self.estab_e = record[7] + self.estab_y = record[8] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 7382ebc7..5b4ca696 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -48,6 +48,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_trt_course_mapper i ComTrtCourseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hp_assrt_mapper import \ ComHpAssrtMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_depart_disc_mapper import \ + ComAlmaDepartDiscMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -85,7 +87,7 @@ COM_TABLE_LIST = { # COM_病院種別 "002": ComHpAssrtMapper, # COM_出身校学部識別 - "003": NullMapper, + "003": ComAlmaDepartDiscMapper, # COM_出身校 "004": ComAlmaMapper, # COM_役職 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv new file mode 100644 index 00000000..430eb8d2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_delete.csv @@ -0,0 +1,7 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","","8","21" +"003","003","1","A","20141113","20141114","岩手医","8","21" +"003","004","1","C","20141113","20141114","弘大","8","21" +"003","004","2","A","20141113","20141114","岩手医","4","19" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv new file mode 100644 index 00000000..3525f111 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_insert.csv @@ -0,0 +1,7 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","札幌医","3","20" +"003","003","1","A","20141113","20141114","弘大","3","19" +"003","004","1","A","20141113","20141114","岩手医","3","03" +"003","999","9","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお","1","99" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv new file mode 100644 index 00000000..7f9d64aa --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/com_alma_depart_disc_update.csv @@ -0,0 +1,6 @@ +"003","001","1","A","20141113","20141114","北大","1","09" +"003","001","2","A","20141113","20141114","北大","3","40" +"003","001","3","A","20141113","20141114","北大","3","42" +"003","002","1","A","20141113","20141114","","8","21" +"003","003","1","A","20141113","20141114","岩手医","8","21" +"003","004","1","A","20141113","20141114","弘大","8","21" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv new file mode 100644 index 00000000..9b7b0649 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_delete.csv @@ -0,0 +1,7 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","1","1","09","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"001","2","3","40","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"001","3","3","42","北大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"002","1","8","21","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"003","1","8","21","岩手医","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" +"004","1","8","21","弘大","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 10:06:16","clsComAlmaDepartDisc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv new file mode 100644 index 00000000..64e33084 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/db_com_alma_depart_disc_before_update.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","1","1","09","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"001","2","3","40","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"001","3","3","42","北大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"002","1","3","20","札幌医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"003","1","3","19","弘大","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"004","1","3","03","岩手医","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2017/10/20 9:54:51","clsComAlmaDepartDisc" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv new file mode 100644 index 00000000..9774279b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_delete.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","1","1","09","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"002","1","8","21","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"003","1","8","21","岩手医","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"004","1","8","21","弘大","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:22:05","com_alma_depart_disc_mapper" +"004","2","4","19","岩手医","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 10:22:05","com_alma_depart_disc_mapper","2023/05/14 10:22:05","com_alma_depart_disc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv new file mode 100644 index 00000000..23c77252 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_insert.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","1","1","09","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"002","1","3","20","札幌医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"003","1","3","19","弘大","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"004","1","3","03","岩手医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","com_alma_depart_disc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv new file mode 100644 index 00000000..69a09486 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/expect_com_alma_depart_disc_update.csv @@ -0,0 +1,8 @@ +"alma_cd","depart_disc_cd","estab_e","estab_y","alma_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","1","1","09","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"001","2","3","40","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"001","3","3","42","北大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"002","1","8","21","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"003","1","8","21","岩手医","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"004","1","8","21","弘大","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 9:54:51","clsComAlmaDepartDisc","2023/05/14 10:06:16","com_alma_depart_disc_mapper" +"999","9","1","99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 9:54:51","com_alma_depart_disc_mapper","2023/05/14 9:54:51","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py new file mode 100644 index 00000000..b3881eac --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_alma_depart_disc/test_com_alma_depart_disc_mapper.py @@ -0,0 +1,236 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_alma_depart_disc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComAlmaDepartDiscMapper: + """レイアウト区分003: COM_出身校学部識別""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_出身校学部識別テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_insert.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_出身校学部識別テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_depart_disc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma_depart_disc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_update.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_出身校学部識別テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_alma_depart_disc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_alma_depart_disc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_alma_depart_disc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_alma_depart_disc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_alma_depart_disc_mapper.ComAlmaDepartDiscMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_alma_depart_disc_delete.csv')) + primary_keys_alma_cd = [{'alma_cd': columns['alma_cd']} for columns in expect_data_list] + primary_keys_depart_disc_cd = [{'depart_disc_cd': columns['depart_disc_cd']} for columns in expect_data_list] + actual_data_list = [] + sp_field_select_sql = """\ + SELECT * FROM src05.com_alma_depart_disc + WHERE + alma_cd = :alma_cd + AND depart_disc_cd = :depart_disc_cd\ + """ + for param_alma_cd, param_depart_disc_cd in zip(primary_keys_alma_cd, primary_keys_depart_disc_cd): + sp_field_data = self.db.execute_select( + sp_field_select_sql, + {**param_alma_cd, **param_depart_disc_cd}) + assert len(sp_field_data) == 1, '1件取得できていること' + actual_data_list.append(sp_field_data[0]) + + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 2eae9fa25af235b77be0710c977249775659a690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 15 May 2023 11:40:39 +0900 Subject: [PATCH 273/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/create_dcf_inst_merge.py | 1 + 1 file changed, 1 insertion(+) 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 c7f10b9f..bbeb86d3 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 @@ -15,6 +15,7 @@ def exec(): # アルトマーク取込が行われていない場合は処理をスキップする if not batch_context.is_ultmarc_imported: logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。') + return db = Database.get_instance() try: From 75dfa77d78a88e88b3278e6569613caa495afbba Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 15 May 2023 13:38:09 +0900 Subject: [PATCH 274/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_prefc_med_dis_treat_mapper.py | 5 +++-- .../table_mapper/concrete/com_prefc_med_equpment_mapper.py | 5 +++-- .../src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py | 2 +- .../ultmarc/utmp_tables/tables/com_med_func_valuation.py | 2 +- .../src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py | 2 +- .../ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py | 2 +- .../ultmarc/utmp_tables/tables/com_prefc_med_equpment.py | 2 +- .../ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py | 2 +- .../com_dr_wrkplace/test_com_dr_wrkplace_mapper.py | 2 +- .../com_nurse_assrt/test_com_nurse_assrt_mapper.py | 5 +++-- 10 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py index 26486dd3..6298160b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py @@ -1,10 +1,11 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper -from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_dis_treat import ComPrefcMedDisTreat +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_dis_treat import \ + ComPrefcMedDisTreat class ComPrefcMedDisTreatMapper(UltmarcTableMapper): - """レイアウト区分133: COM_都道府県医療機能情報(疾患治療)""" + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py index dcfd8114..ed9cf467 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py @@ -1,10 +1,11 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper -from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_equpment import ComPrefcMedEqupment +from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_equpment import \ + ComPrefcMedEqupment class ComPrefcMedEqupmentMapper(UltmarcTableMapper): - """レイアウト区分132: COM_都道府県医療機能情報(施設設備)""" + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" # レコード存在確認SQL RECORD_EXISTS_QUERY = """\ diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py index 9472206d..421357b9 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_wrkplace.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComDrWrkplace(UltmarcTable): - """レイアウト区分501-01:COM_医師勤務先""" + """レイアウト区分502 :COM_医師勤務先""" maint_flag: str # 修正区分 dcfdr_id: str # 個人コード(ID) dcfdr_code: str # 個人コード(個人コード) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py index 6ed14c07..9eab1f21 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_med_func_valuation.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComMedFuncValuation(UltmarcTable): - """レイアウト区分023: COM_医療機器評価""" + """レイアウト区分024: COM_医療機器評価""" maint_flag: str # 修正区分 med_func_valuation_cd: str # 医療機器評価コード med_func_valuation_name: str # 医療機器評価名称(漢字) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py index 710b9a0a..6a7fdb4e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_nurse_assrt.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComNurseAssrt(UltmarcTable): - """レイアウト区分022: COM_看護種別""" + """レイアウト区分023: COM_看護種別""" nurse_assrt_cd: str # 看護種別コード nurse_assrt_name: str # 看護種別名 maint_flag: str # 修正区分 diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py index 4e458fe0..f7bacedd 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_dis_treat.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComPrefcMedDisTreat(UltmarcTable): - """レイアウト区分133: COM_都道府県医療機能情報(疾患治療)""" + """レイアウト区分134: COM_都道府県医療機能情報(疾患治療)""" dcfhp_id: str # DCFコード(レコードID) dcfhp_code: str # DCFコード(施設コード) dcfhp_yobi: str # DCFコード(予備) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py index 7b592b9d..491a0a3f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_equpment.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComPrefcMedEqupment(UltmarcTable): - """レイアウト区分132: COM_都道府県医療機能情報(施設設備)""" + """レイアウト区分133: COM_都道府県医療機能情報(施設設備)""" dcfhp_id: str # DCFコード(レコードID) dcfhp_code: str # DCFコード(施設コード) dcfhp_yobi: str # DCFコード(予備) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py index 96b3ad0a..4320bab2 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_prefc_med_sojourn_ope.py @@ -2,7 +2,7 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable class ComPrefcMedSojournOpe(UltmarcTable): - """レイアウト区分132: COM_都道府県医療機能情報(短期滞在手術)""" + """レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)""" dcfhp_id: str # DCFコード(レコードID) dcfhp_code: str # DCFコード(施設コード) dcfhp_yobi: str # DCFコード(予備) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py index 89e65b54..b0d57a25 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_wrkplace/test_com_dr_wrkplace_mapper.py @@ -15,7 +15,7 @@ from tests.testing_utility import (assert_table_results, class TestComDrWrkplaceMapper: - """COM_DCF医師勤務先""" + """レイアウト区分502: COM_DCF医師勤務先""" db: Database batch_context: BatchContext diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py index e7bea2a5..49bf7c8f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/test_com_nurse_assrt_mapper.py @@ -4,7 +4,8 @@ from datetime import datetime import pytest from src.batch.common.batch_context import BatchContext -from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_nurse_assrt_mapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import \ + com_nurse_assrt_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, create_db_data_from_csv, @@ -15,7 +16,7 @@ from tests.testing_utility import (assert_table_results, class TestComNurseAssrtMapper: - """レイアウト区分004: COM_出身校""" + """レイアウト区分023: COM_看護種別""" db: Database batch_context: BatchContext From b73f46718451f6c6f206f10b174c35aecf66debc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 15 May 2023 13:40:05 +0900 Subject: [PATCH 275/962] =?UTF-8?q?fix:=20=E3=82=A2=E3=83=AB=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=83=90=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9F=E3=83=B3=E3=82=B0=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 4 ++-- .../src/batch/ultmarc/ultmarc_process.py | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 2ac3efe6..68ed0a7c 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -68,11 +68,11 @@ class UltmarcBucket(S3Bucket): return temporary_file_path def backup_dat_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー ultmarc_backup_bucket = UltmarcBackupBucket() backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key) - - def delete_dat_file(self, dat_file_key: str): + # コピー元のファイルを削除 self._s3_client.delete_file(self._bucket_name, dat_file_key) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index 5f234bf7..b511a9c8 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -45,17 +45,14 @@ def exec_import(): dat_file_name = dat_file_info['filename'] logger.info(f"{dat_file_name}を取り込みます") - # ファイルをバックアップ - # 現行は、jobctrl_dailyの先頭でやっている - ultmarc_bucket.backup_dat_file(dat_file_name, batch_context.syor_date) # datファイルをダウンロード local_file_path = ultmarc_bucket.download_dat_file(dat_file_name) dat_file = DatFile.from_path(local_file_path) # アルトマーク取り込み実行 _import_to_ultmarc_table(dat_file) - # 処理後、ファイルをS3から削除する - logger.info(f'取り込み処理が完了したため、datファイルを削除。ファイル名={dat_file_name}') - ultmarc_bucket.delete_dat_file(dat_file_name) + # 処理後ファイルをバックアップ + ultmarc_bucket.backup_dat_file(dat_file_name, batch_context.syor_date) + logger.info(f'取り込み処理が完了したため、datファイルをバックアップ。ファイル名={dat_file_name}') # アルトマーク取込済をマーク batch_context.is_ultmarc_imported = True logger.info('アルトマーク取込処理: 終了') From 4496e6b07d89a870c529282a6c6388f41e5584c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 15 May 2023 14:14:21 +0900 Subject: [PATCH 276/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=BD=B9=E8=81=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_post_mapper.py | 92 ++++++++ .../ultmarc/utmp_tables/tables/com_post.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_post/__init__.py | 0 .../table_mapper/com_post/com_post_delete.csv | 7 + .../table_mapper/com_post/com_post_insert.csv | 7 + .../table_mapper/com_post/com_post_update.csv | 6 + .../com_post/db_com_post_before_delete.csv | 7 + .../com_post/db_com_post_before_update.csv | 7 + .../com_post/expect_com_post_delete.csv | 8 + .../com_post/expect_com_post_insert.csv | 8 + .../com_post/expect_com_post_update.csv | 7 + .../com_post/test_com_post_mapper.py | 197 ++++++++++++++++++ 13 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py new file mode 100644 index 00000000..ed127c78 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_post_mapper.py @@ -0,0 +1,92 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_post import ComPost + + +class ComPostMapper(UltmarcTableMapper): + """レイアウト区分005: COM_役職 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_post + WHERE + post_cd = :post_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_post + ( + post_cd, + form_post_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :post_cd, + :form_post_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + UPDATE_QUERY = """\ + UPDATE + src05.com_post + SET + form_post_name = :form_post_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + post_cd = :post_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_post + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + post_cd = :post_cd + """ + record: ComPost + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComPost) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py new file mode 100644 index 00000000..e1095c51 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_post.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComPost(UltmarcTable): + """レイアウト区分005: COM_役職""" + post_cd: str # 役職コード + form_post_name: str # 正式役職名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.post_cd = record[1] + self.maint_flag = record[2] + self.form_post_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 6ff9bf70..d013bb15 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -52,6 +52,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper ComSndMedSpheMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mapper import \ ComMedAreaCityMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_post_mapper import \ + ComPostMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -93,7 +95,7 @@ COM_TABLE_LIST = { # COM_出身校 "004": ComAlmaMapper, # COM_役職 - "005": NullMapper, + "005": ComPostMapper, # 都道府県マスタ "006": NullMapper, # COM_経営体 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv new file mode 100644 index 00000000..ee22668f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_delete.csv @@ -0,0 +1,7 @@ +"005","011","A","20141113","20141114","理事長" +"005","012","A","20141113","20141114","理事" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","" +"005","015","A","20141113","20141114","常任理" +"005","016","C","20141113","20141114","誉理事" +"005","021","A","20141113","20141114","誉会長" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv new file mode 100644 index 00000000..b5b7efa5 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_insert.csv @@ -0,0 +1,7 @@ +"005","011","A","20141113","20141114","理事長" +"005","012","A","20141113","20141114","理事" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","常務理" +"005","015","A","20141113","20141114","常任理" +"005","016","A","20141113","20141114","誉理事" +"005","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv new file mode 100644 index 00000000..c27a867d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/com_post_update.csv @@ -0,0 +1,6 @@ +"005","011","A","20141113","20141114","理事" +"005","012","A","20141113","20141114","理事長" +"005","013","A","20141113","20141114","副理事" +"005","014","A","20141113","20141114","" +"005","015","A","20141113","20141114","常任理" +"005","016","A","20141113","20141114","誉理事" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv new file mode 100644 index 00000000..ceb7e085 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_delete.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"011","理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"012","理事長","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"013","副理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"014","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"015","常任理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" +"016","誉理事","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:55:50","clsComPost" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv new file mode 100644 index 00000000..ffb77574 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/db_com_post_before_update.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"011","理事長","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"012","理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"013","副理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"014","常務理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"015","常任理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" +"016","誉理事","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2017/10/20 10:51:28","clsComPost" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv new file mode 100644 index 00000000..8ea72f18 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_delete.csv @@ -0,0 +1,8 @@ +"post_cd","form_post_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"011","理事長","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"012","理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"013","副理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"014","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"015","常任理","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"016","誉理事","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 11:00:25","com_post_mapper" +"021","誉会長","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 11:00:25","com_post_mapper","2023/05/14 11:00:25","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv new file mode 100644 index 00000000..e1ccea70 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_insert.csv @@ -0,0 +1,8 @@ +"post_cd","form_post_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"011","理事長","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"012","理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"013","副理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"014","常務理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"015","常任理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"016","誉理事","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 10:51:28","com_post_mapper","2023/05/15 10:51:28","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv new file mode 100644 index 00000000..0b2e436d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/expect_com_post_update.csv @@ -0,0 +1,7 @@ +"post_cd","form_post_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"011","理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"012","理事長","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"013","副理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"014","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"015","常任理","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" +"016","誉理事","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 10:51:28","clsComPost","2023/05/14 10:55:50","com_post_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py new file mode 100644 index 00000000..54d87d49 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_post_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComPostMapper: + """レイアウト区分005: COM_役職""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_役職テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_insert.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_役職テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_post_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_post', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_update.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_役職テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_post_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_post', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_post_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_post', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_post_mapper.ComPostMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_post_mapper.ComPostMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_post_delete.csv')) + primary_keys = [f"'{primary_key['post_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_post WHERE post_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 2cb6cb5d996411f99e9b8a398acb5873089fb87e Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 15 May 2023 14:50:48 +0900 Subject: [PATCH 277/962] =?UTF-8?q?=E5=8F=97=E9=A0=98=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AELOAD=E5=AE=8C=E4=BA=86=E5=BE=8C?= =?UTF-8?q?=E3=80=81=E5=8F=97=E9=A0=98=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=92=E3=83=90=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=90=E3=82=B1=E3=83=83=E3=83=88=E3=81=AB=E7=A7=BB=E5=8B=95?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=AE=9F=E8=A3=85=E6=BC=8F=E3=82=8C=E3=81=BB?= =?UTF-8?q?=E8=A3=9C=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 1 + ecs/jskult-batch-daily/src/aws/s3.py | 14 +++++++++++ .../src/batch/vjsk/vjsk_importer.py | 24 ++++++------------- .../src/system_var/environment.py | 1 + 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index d95322fb..2c1cb5a7 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -8,6 +8,7 @@ ULTMARC_DATA_BUCKET=**************** ULTMARC_DATA_FOLDER=recv JSKULT_BACKUP_BUCKET=**************** ULTMARC_BACKUP_FOLDER=ultmarc +VJSK_BACKUP_FOLDER=vjsk JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 2e98eaac..0df364d4 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -112,6 +112,10 @@ class UltmarcBackupBucket(JskUltBackupBucket): _folder = environment.ULTMARC_BACKUP_FOLDER +class VjskBackupBucket(JskUltBackupBucket): + _folder = environment.VJSK_BACKUP_FOLDER + + class VjskReceiveBucket(S3Bucket): _bucket_name = environment.JSKULT_DATA_BUCKET _recv_folder = environment.JSKULT_DATA_FOLDER_RECV @@ -140,3 +144,13 @@ class VjskReceiveBucket(S3Bucket): file = os.path.join(temp_dir, extracted_file) ret.append(file) return ret + + def backup_dat_file(self, target_files: list, datetime_key: str): + jskult_backup_bucket = VjskBackupBucket() + for target_file in target_files: + backup_from_file_path = target_file.get("filename") + backup_to_filename = backup_from_file_path.replace(f"{self._recv_folder}/", "") + backup_key = f'{jskult_backup_bucket._folder}/{datetime_key}/{backup_to_filename}' + self._s3_client.copy(self._bucket_name, backup_from_file_path, + jskult_backup_bucket._bucket_name, backup_key) + self._s3_client.delete_file(self._bucket_name, backup_from_file_path) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 2737ffca..23fc8e5d 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -30,9 +30,10 @@ def exec(): # V実消化データファイル受領チェック logger.debug('V実消化データファイル受領チェック:開始') + received_s3_files = [] try: # S3バケットにある受領済のV実消化データファイルの存在チェックをする - _check_received_files() + received_s3_files = _check_received_files() except BatchOperationException as e: logger.debug('受領したV実消化データファイルに未受領もものがあります') @@ -43,7 +44,7 @@ def exec(): logger.debug('V実消化データ取込:開始') try: # S3バケットにある受領済のV実消化データファイルをデータベースに登録する - _import_file_to_db() + _import_file_to_db(received_s3_files) except Exception as e: logger.debug(f'データベース登録失敗 {e}') raise e @@ -52,7 +53,7 @@ def exec(): logger.debug('V実消化データ受領ファイルバックアップ退避:開始') try: # 取込が完了したS3バケットにある受領ファイルをバックアップ用S3バケットに移動する - _backup_received_files() + vjsk_recv_bucket.backup_dat_file(received_s3_files, batch_context.syor_date) except BatchOperationException as e: logger.debug('V実消化データ受領ファイルのバックアップ退避が失敗しました') @@ -80,7 +81,7 @@ def _check_if_file_exists(src_list: list, condkey: str) -> bool: return ret -def _check_received_files(): +def _check_received_files() -> list: """V実消化連携データファイル受領確認処理""" logger.debug('_check_received_files start') @@ -151,16 +152,13 @@ def _check_received_files(): logger.debug('_check_received_files done') - return + return received_s3_files -def _import_file_to_db(): +def _import_file_to_db(received_s3_files: list): """V実消化連携データ取込処理""" logger.debug('_import_file_to_db start') - # S3バケット「実消化&アルトマーク V実消化データ受領バケット」にある受領ファイル一覧を取得 - received_s3_files = vjsk_recv_bucket.get_s3_file_list() - # S3バケット「実消化&アルトマーク V実消化データ受領バケット」の受領ファイルをローカルストレージにdownloadして辞書化する target_dict = {} for s3_file_path in received_s3_files: @@ -253,11 +251,3 @@ def _determine_today_is_stockslipdata_target(): raise e logger.debug("_determine_today_is_stockslipdata_target done") return ret - - -def _backup_received_files(): - logger.debug("_backup_received_files start") - - # TODO 受領バケットのファイル → バックアップバケット - - logger.debug("_backup_received_files done") diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 6a2fca0b..5973a181 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -12,6 +12,7 @@ ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] +VJSK_BACKUP_FOLDER = os.environ['VJSK_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] From 42b3b8f2e11ecb29e02954353121f0668235e247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 15 May 2023 15:18:03 +0900 Subject: [PATCH 278/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E9=83=BD=E9=81=93=E5=BA=9C=E7=9C=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/mst_prefc_mapper.py | 96 +++++++++ .../ultmarc/utmp_tables/tables/mst_prefc.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_post/test_com_post_mapper.py | 2 +- .../table_mapper/mst_prefc/__init__.py | 0 .../mst_prefc/db_mst_prefc_before_delete.csv | 7 + .../mst_prefc/db_mst_prefc_before_update.csv | 7 + .../mst_prefc/expect_mst_prefc_delete.csv | 8 + .../mst_prefc/expect_mst_prefc_insert.csv | 8 + .../mst_prefc/expect_mst_prefc_update.csv | 7 + .../mst_prefc/mst_prefc_delete.csv | 7 + .../mst_prefc/mst_prefc_insert.csv | 7 + .../mst_prefc/mst_prefc_update.csv | 6 + .../mst_prefc/test_mst_prefc_mapper.py | 197 ++++++++++++++++++ 14 files changed, 368 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py new file mode 100644 index 00000000..64e14591 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/mst_prefc_mapper.py @@ -0,0 +1,96 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.mst_prefc import MstPrefc + + +class MstPrefcMapper(UltmarcTableMapper): + """レイアウト区分006: 都道府県マスタ 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.mst_prefc + WHERE + prefc_cd = :prefc_cd + """ + + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.mst_prefc + ( + prefc_cd, + prefc_name, + prefc_name_kana, + delete_flg, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :prefc_cd, + :prefc_name, + '', + '0', + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.mst_prefc + SET + prefc_name = :prefc_name, + delete_flg = '0', + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.mst_prefc + SET + delete_flg = '1', + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + prefc_cd = :prefc_cd + """ + record: MstPrefc + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, MstPrefc) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py new file mode 100644 index 00000000..ae8e48ce --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/mst_prefc.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class MstPrefc(UltmarcTable): + """レイアウト区分006: 都道府県マスタ""" + prefc_cd: str # 都道府県コード + prefc_name: str # 都道府県名称 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.maint_flag = record[2] + self.prefc_name = record[5] + self.prefc_cd = record[6] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index d013bb15..a99f9f4f 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -54,6 +54,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mappe ComMedAreaCityMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_post_mapper import \ ComPostMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import \ + MstPrefcMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -97,7 +99,7 @@ COM_TABLE_LIST = { # COM_役職 "005": ComPostMapper, # 都道府県マスタ - "006": NullMapper, + "006": MstPrefcMapper, # COM_経営体 "007": NullMapper, # COM_所属部科 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py index 54d87d49..e440dbb7 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_post/test_com_post_mapper.py @@ -79,7 +79,7 @@ class TestComPostMapper: for actual_row, expect_row in zip(actual_data_list, expect_data_list): line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): - if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date']: + if actual_col_name in ignore_columns: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' def test_update_record(self): diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv new file mode 100644 index 00000000..753f271a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_delete.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"04","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 15:15:17","clsMstPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv new file mode 100644 index 00000000..4097a7c9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/db_mst_prefc_before_update.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"02","青森県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"04","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"05","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2017/10/20 14:57:57","clsMstPrefc" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv new file mode 100644 index 00000000..4998fe00 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_delete.csv @@ -0,0 +1,8 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"04","秋田県","","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:22:55","mst_prefc_mapper" +"07","福島県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:22:55","mst_prefc_mapper","2023/05/14 15:22:55","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv new file mode 100644 index 00000000..59b8b231 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_insert.csv @@ -0,0 +1,8 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"02","青森県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"04","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"05","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" +"99","あいうえお","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 14:57:57","mst_prefc_mapper","2023/05/14 14:57:57","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv new file mode 100644 index 00000000..3fef3d10 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/expect_mst_prefc_update.csv @@ -0,0 +1,7 @@ +"prefc_cd","prefc_name","prefc_name_kana","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","北海道","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"02","","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"03","岩手県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"04","秋田県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"05","宮城県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" +"06","山形県","","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 14:57:57","clsMstPrefc","2023/05/14 15:15:17","mst_prefc_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv new file mode 100644 index 00000000..f5b68b65 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_delete.csv @@ -0,0 +1,7 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","C","20141113","20141114","秋田県","04" +"006","24","A","20141113","20141114","宮城県","05" +"006","25","A","20141113","20141114","山形県","06" +"006","26","A","20141113","20141114","福島県","07" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv new file mode 100644 index 00000000..65801d98 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_insert.csv @@ -0,0 +1,7 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","青森県","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","A","20141113","20141114","宮城県","04" +"006","24","A","20141113","20141114","秋田県","05" +"006","25","A","20141113","20141114","山形県","06" +"006","","A","","","あいうえお","99" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv new file mode 100644 index 00000000..cf9dcddf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/mst_prefc_update.csv @@ -0,0 +1,6 @@ +"006","11","A","20141113","20141114","北海道","01" +"006","21","A","20141113","20141114","","02" +"006","22","A","20141113","20141114","岩手県","03" +"006","23","A","20141113","20141114","秋田県","04" +"006","24","A","20141113","20141114","宮城県","05" +"006","25","A","20141113","20141114","山形県","06" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py new file mode 100644 index 00000000..9023ffef --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/mst_prefc/test_mst_prefc_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import mst_prefc_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestMstPrefcMapper: + """レイアウト区分006: 都道府県マスタ""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + 都道府県マスタテーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_insert.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + 都道府県マスタテーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_mst_prefc_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.mst_prefc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_update.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + 都道府県マスタテーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'mst_prefc_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.mst_prefc', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_mst_prefc_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.mst_prefc', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: mst_prefc_mapper.MstPrefcMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is mst_prefc_mapper.MstPrefcMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_mst_prefc_delete.csv')) + primary_keys = [f"'{primary_key['prefc_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.mst_prefc WHERE prefc_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 468974d6bb54829dfa70284605fc995d1d728dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 15 May 2023 17:00:15 +0900 Subject: [PATCH 279/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E7=B5=8C=E5=96=B6=E4=BD=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_manage_mapper.py | 94 +++++++++ .../ultmarc/utmp_tables/tables/com_manage.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_manage copy/__init__.py | 0 .../com_manage copy/com_manage_delete.csv | 7 + .../com_manage copy/com_manage_insert.csv | 7 + .../com_manage copy/com_manage_update.csv | 6 + .../db_com_manage_before_delete.csv | 7 + .../db_com_manage_before_update.csv | 8 + .../expect_com_manage_delete.csv | 8 + .../expect_com_manage_insert.csv | 8 + .../expect_com_manage_update.csv | 8 + .../com_manage copy/test_com_manage_mapper.py | 197 ++++++++++++++++++ 13 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py new file mode 100644 index 00000000..1fca8b00 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_manage_mapper.py @@ -0,0 +1,94 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_manage import ComManage + + +class ComManageMapper(UltmarcTableMapper): + """レイアウト区分007: COM_経営体 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_manage + WHERE + manage_cd = :manage_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_manage + ( + manage_cd, + manage_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :manage_cd, + :manage_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 更新用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_manage + SET + manage_name = :manage_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + manage_cd = :manage_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_manage + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + manage_cd = :manage_cd + """ + + record: ComManage + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComManage) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py new file mode 100644 index 00000000..7d3bdefc --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_manage.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComManage(UltmarcTable): + """レイアウト区分007: COM_経営体""" + manage_cd: str # 経営体コード + manage_name: str # 経営体名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.manage_cd = record[1] + self.maint_flag = record[2] + self.manage_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index bb8d416f..c06d8873 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -60,6 +60,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mappe ComMedAreaCityMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_post_mapper import \ ComPostMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_manage_mapper import \ + ComManageMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import \ MstPrefcMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ @@ -107,7 +109,7 @@ COM_TABLE_LIST = { # 都道府県マスタ "006": MstPrefcMapper, # COM_経営体 - "007": NullMapper, + "007": ComManageMapper, # COM_所属部科 "008": NullMapper, # COM_学会 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv new file mode 100644 index 00000000..51b1ac36 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv @@ -0,0 +1,7 @@ +"007","101","A","20141113","20141114","" +"007","102","C","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","警察" +"007","105","A","20141113","20141114","総務" +"007","106","A","20141113","20141114","防衛" +"007","107","A","20141113","20141114","独法国" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv new file mode 100644 index 00000000..8f21e4df --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv @@ -0,0 +1,7 @@ +"007","101","A","20141113","20141114","厚生" +"007","102","A","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","総務" +"007","105","A","20141113","20141114","警察" +"007","106","A","20141113","20141114","防衛" +"007","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv new file mode 100644 index 00000000..a4bc1313 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv @@ -0,0 +1,6 @@ +"007","101","A","20141113","20141114","" +"007","102","A","20141113","20141114","文部" +"007","103","A","20141113","20141114","財務" +"007","104","A","20141113","20141114","警察" +"007","105","A","20141113","20141114","総務" +"007","106","A","20141113","20141114","防衛" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv new file mode 100644 index 00000000..d992c162 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv @@ -0,0 +1,7 @@ +"manage_cd","manage_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"101","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"102","文部","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"103","財務","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"104","警察","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"105","総務","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" +"106","防衛","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:43:41","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv new file mode 100644 index 00000000..1b73e668 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"101","厚生","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"102","文部","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"103","財務","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"104","総務","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"105","警察","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"106","防衛","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" +"999","あいうえおかきくけこ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv new file mode 100644 index 00000000..05318030 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"101","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"102","文部","20171020","20171020","20230514","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"103","財務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"104","警察","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"105","総務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"106","防衛","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:51:00","com_manage_mapper" +"107","独法国","20230514","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:51:00","com_manage_mapper","2023/05/14 15:51:00","com_manage_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv new file mode 100644 index 00000000..9041fe17 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"101","厚生","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"102","文部","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"103","財務","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"104","総務","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"105","警察","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"106","防衛","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/14 15:39:03","com_manage_mapper","2023/05/14 15:39:03","com_manage_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv new file mode 100644 index 00000000..4e2a7c7c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv @@ -0,0 +1,8 @@ +"manage_cd","manage_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"101","","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"102","文部","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"103","財務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"104","警察","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"105","総務","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"106","防衛","20171020","20230514","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2023/05/14 15:43:41","com_manage_mapper" +"999","あいうえおかきくけこ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 15:39:03","clsComManage","2017/10/20 15:39:03","clsComManage" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py new file mode 100644 index 00000000..b27092a9 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_manage_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComManageMapper: + """レイアウト区分007: COM_経営体""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_経営体テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_insert.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_経営体テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_manage_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_manage', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_update.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_経営体テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_manage_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_manage', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_manage_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_manage', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_manage_mapper.ComManageMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_manage_mapper.ComManageMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_manage_delete.csv')) + primary_keys = [f"'{primary_key['manage_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_manage WHERE manage_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 7e69b86f0a5a6824d2759c60d9b20077930d3ca7 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 15 May 2023 17:26:11 +0900 Subject: [PATCH 280/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=8F=8D=E6=98=A0=E3=80=80=E5=8F=97=E9=A0=98?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E6=8B=A1=E5=BC=B5?= =?UTF-8?q?=E5=AD=90=E3=81=AF=20.gz=20=E3=81=A0=E3=81=91=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 4c374a2b..8b372dc2 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -29,7 +29,7 @@ class VjskReceiveFileMapper: CONDKEY_SLIP_DATA: { _KEY_DATA_NAME: "販売実績データ", _KEY_FILE_PREFIX: "slip_data_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.sales", _KEY_SRC_TABLE: "src05.sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -298,7 +298,7 @@ class VjskReceiveFileMapper: CONDKEY_HLD_MST: { _KEY_DATA_NAME: "V卸ホールディングスマスタ", _KEY_FILE_PREFIX: "hld_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.hld_mst_v", _KEY_SRC_TABLE: "src05.hld_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -351,7 +351,7 @@ class VjskReceiveFileMapper: CONDKEY_WHS_MST: { _KEY_DATA_NAME: "V卸マスタ", _KEY_FILE_PREFIX: "whs_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.whs_mst_v", _KEY_SRC_TABLE: "src05.whs_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -419,7 +419,7 @@ class VjskReceiveFileMapper: CONDKEY_MKR_ORG_HORIZON: { _KEY_DATA_NAME: "Vメーカー卸組織展開表", _KEY_FILE_PREFIX: "mkr_org_horizon_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -577,7 +577,7 @@ class VjskReceiveFileMapper: CONDKEY_ORG_CNV_MST: { _KEY_DATA_NAME: "V卸組織変換マスタ", _KEY_FILE_PREFIX: "org_cnv_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.org_cnv_mst_v", _KEY_SRC_TABLE: "src05.org_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -630,7 +630,7 @@ class VjskReceiveFileMapper: CONDKEY_TRAN_KBN_MST: { _KEY_DATA_NAME: "V取引区分マスタ", _KEY_FILE_PREFIX: "tran_kbn_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -677,7 +677,7 @@ class VjskReceiveFileMapper: CONDKEY_FCL_MST: { _KEY_DATA_NAME: "V施設マスタ", _KEY_FILE_PREFIX: "fcl_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.fcl_mst_v", _KEY_SRC_TABLE: "src05.fcl_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -769,7 +769,7 @@ class VjskReceiveFileMapper: CONDKEY_PHM_PRD_MST: { _KEY_DATA_NAME: "V製品マスタ", _KEY_FILE_PREFIX: "phm_prd_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.phm_prd_mst_v", _KEY_SRC_TABLE: "src05.phm_prd_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -873,7 +873,7 @@ class VjskReceiveFileMapper: CONDKEY_PHM_PRICE_MST: { _KEY_DATA_NAME: "V製品価格マスタ", _KEY_FILE_PREFIX: "phm_price_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.phm_price_mst_v", _KEY_SRC_TABLE: "src05.phm_price_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -923,7 +923,7 @@ class VjskReceiveFileMapper: CONDKEY_VOP_HCO_MERGE: { _KEY_DATA_NAME: "V施設統合マスタ", _KEY_FILE_PREFIX: "vop_hco_merge_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.vop_hco_merge_v", _KEY_SRC_TABLE: "src05.vop_hco_merge_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -955,7 +955,7 @@ class VjskReceiveFileMapper: CONDKEY_WHS_CUSTOMER_MST: { _KEY_DATA_NAME: "V卸得意先情報マスタ", _KEY_FILE_PREFIX: "whs_customer_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.whs_customer_mst_v", _KEY_SRC_TABLE: "src05.whs_customer_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1026,7 +1026,7 @@ class VjskReceiveFileMapper: CONDKEY_MDB_CONV_MST: { _KEY_DATA_NAME: "MDBコード変換表", _KEY_FILE_PREFIX: "mdb_conv_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1070,7 +1070,7 @@ class VjskReceiveFileMapper: CONDKEY_STOCK_SLIP_DATA: { _KEY_DATA_NAME: "卸在庫データ", _KEY_FILE_PREFIX: "stock_slip_data_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.whole_stock", _KEY_SRC_TABLE: "src05.whole_stock", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1177,7 +1177,7 @@ class VjskReceiveFileMapper: CONDKEY_BIO_SLIP_DATA: { _KEY_DATA_NAME: "生物由来データ", _KEY_FILE_PREFIX: "bio_slip_data_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.bio_sales", _KEY_SRC_TABLE: "src05.bio_sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1431,7 +1431,7 @@ class VjskReceiveFileMapper: CONDKEY_LOT_NUM_MST: { _KEY_DATA_NAME: "ロットマスタデータ", _KEY_FILE_PREFIX: "lot_num_mst_", - _KEY_FILE_SUFFIX: ".tar.gz", + _KEY_FILE_SUFFIX: ".gz", _KEY_ORG_TABLE: "org05.lot_num_mst", _KEY_SRC_TABLE: "src05.lot_num_mst", _KEY_UPSERT_SQL: textwrap.dedent("""\ From a9b0b000567fc6b6c824cc626bda5f58565ca5e9 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 11 May 2023 20:20:19 +0900 Subject: [PATCH 281/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py | 0 .../tests/batch/vjsk/vjsk_file_check/__init__.py | 0 .../batch/vjsk/vjsk_file_check/test_vjsk_file_check.py | 6 ++++++ .../tests/batch/vjsk/vjsk_load/__init__.py | 0 .../tests/batch/vjsk/vjsk_load/test_vjsk_load.py | 6 ++++++ 5 files changed, 12 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py new file mode 100644 index 00000000..e9f88d81 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -0,0 +1,6 @@ +def test1(): + pass + + +def test2(): + pass diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/__init__.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py new file mode 100644 index 00000000..e9f88d81 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -0,0 +1,6 @@ +def test1(): + pass + + +def test2(): + pass From a1da4a90677f04656aa407a603a5d32ae811e075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 10:01:02 +0900 Subject: [PATCH 282/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E6=89=80=E5=B1=9E=E9=83=A8=E7=A7=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_blng_sec_mapper.py | 105 ++++++++++ .../utmp_tables/tables/com_blng_sec.py | 22 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../__init__.py | 0 .../com_blng_sec/com_blng_sec_delete.csv | 7 + .../com_blng_sec/com_blng_sec_insert.csv | 7 + .../com_blng_sec/com_blng_sec_update.csv | 6 + .../db_com_blng_sec_before_delete.csv | 7 + .../db_com_blng_sec_before_update.csv | 8 + .../expect_com_blng_sec_delete.csv | 8 + .../expect_com_blng_sec_insert.csv | 8 + .../expect_com_blng_sec_update.csv | 8 + .../com_blng_sec/test_com_blng_sec_mapper.py | 197 ++++++++++++++++++ .../table_mapper/com_manage/__init__.py | 0 .../com_manage_delete.csv | 0 .../com_manage_insert.csv | 0 .../com_manage_update.csv | 0 .../db_com_manage_before_delete.csv | 0 .../db_com_manage_before_update.csv | 0 .../expect_com_manage_delete.csv | 0 .../expect_com_manage_insert.csv | 0 .../expect_com_manage_update.csv | 0 .../test_com_manage_mapper.py | 0 23 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_blng_sec}/__init__.py (100%) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/__init__.py rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/com_manage_delete.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/com_manage_insert.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/com_manage_update.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/db_com_manage_before_delete.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/db_com_manage_before_update.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/expect_com_manage_delete.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/expect_com_manage_insert.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/expect_com_manage_update.csv (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_manage copy => com_manage}/test_com_manage_mapper.py (100%) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py new file mode 100644 index 00000000..3970919a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_blng_sec_mapper.py @@ -0,0 +1,105 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_blng_sec import ComBlngSec + + +class ComBlngSecMapper(UltmarcTableMapper): + """レイアウト区分008: COM_所属部科 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_blng_sec + WHERE + blng_sec_cd = :blng_sec_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_blng_sec + ( + blng_sec_cd, + blng_sec_kana, + blng_sec_name, + inst_category, + trt_category, + category_sort, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :blng_sec_cd, + :blng_sec_kana, + :blng_sec_name, + :inst_category, + :trt_category, + :category_sort, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_blng_sec + SET + blng_sec_kana = :blng_sec_kana, + blng_sec_name = :blng_sec_name, + inst_category = :inst_category, + trt_category = :trt_category, + category_sort = :category_sort, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + blng_sec_cd = :blng_sec_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_blng_sec + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + blng_sec_cd = :blng_sec_cd + """ + record: ComBlngSec + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComBlngSec) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py new file mode 100644 index 00000000..20395f9f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_blng_sec.py @@ -0,0 +1,22 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComBlngSec(UltmarcTable): + """レイアウト区分008: COM_所属部科""" + blng_sec_cd: str # 所属部科コード + blng_sec_kana: str # 所属部科カナ + blng_sec_name: str # 所属部科名 + inst_category: str # 分類補助コード(施設分類) + trt_category: str # 分類補助コード(診療分野分類) + category_sort: str # 分類補助コード(ソートコード) + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.blng_sec_cd = record[1] + self.maint_flag = record[2] + self.blng_sec_name = record[5] + self.blng_sec_kana = record[6] + self.inst_category = record[7] + self.trt_category = record[8] + self.category_sort = record[9] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index c06d8873..1f101aeb 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -64,6 +64,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_manage_mapper impor ComManageMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import \ MstPrefcMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper import \ + ComBlngSecMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -111,7 +113,7 @@ COM_TABLE_LIST = { # COM_経営体 "007": ComManageMapper, # COM_所属部科 - "008": NullMapper, + "008": ComBlngSecMapper, # COM_学会 "009": NullMapper, # COM_専門医資格 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/__init__.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/__init__.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/__init__.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv new file mode 100644 index 00000000..cbeb7eae --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_delete.csv @@ -0,0 +1,7 @@ +"008","0067","A","20141113","20141114","","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","2","L81","010" +"008","0070","C","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A08","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","020" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" +"008","0073","A","20141113","20141114","内科(内分泌・代謝)","ナイカ(ナイブンピ.タイシヤ)","1","A05","144" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv new file mode 100644 index 00000000..f9a527d2 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_insert.csv @@ -0,0 +1,7 @@ +"008","0067","A","20141113","20141114","消化器内科・血液内科","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワナイカ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","1","L81","010" +"008","0070","A","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A07","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","019" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" +"008","9999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお","アイウエオアイウエオアイウエオアイウエオアイウ","9","999","999" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv new file mode 100644 index 00000000..b2aff05b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/com_blng_sec_update.csv @@ -0,0 +1,6 @@ +"008","0067","A","20141113","20141114","","シヨウカキナイカ.ケツエキナイカ","1","A02","117" +"008","0068","A","20141113","20141114","緩和内科","カンワ","1","A79","030" +"008","0069","A","20141113","20141114","小児外科、成育外科、小腸移植外科","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","2","L81","010" +"008","0070","A","20141113","20141114","腎臓・血液透析科","ジンゾウ.ケツエキトウセキカ","1","A08","052" +"008","0071","A","20141113","20141114","糖尿病内分泌・甲状腺科","トウニヨウビヨウナイブンピ.コウジヨウセンカ","1","A06","020" +"008","0072","A","20141113","20141114","血液・膠原病科","ケツエキ.コウゲンビヨウカ","1","A05","137" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv new file mode 100644 index 00000000..6637e500 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_delete.csv @@ -0,0 +1,7 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20171024","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0068","カンワ","緩和内科","20171024","20171024","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20171024","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20171024","NULL","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20171024","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20171024","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:59:43","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv new file mode 100644 index 00000000..9e3d6b55 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/db_com_blng_sec_before_update.csv @@ -0,0 +1,8 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0067","シヨウカキナイカ.ケツエキナイカ","消化器内科・血液内科","20171024","NULL","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0068","カンワナイカ","緩和内科","20171024","NULL","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","NULL","NULL","1","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","NULL","NULL","1","A07","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","NULL","NULL","1","A06","019","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" +"9999","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv new file mode 100644 index 00000000..445e496f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_delete.csv @@ -0,0 +1,8 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20230515","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0068","カンワ","緩和内科","20171024","20230515","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20230515","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20171024","20230515","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20230515","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20230515","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 11:10:31","com_blng_sec_mapper" +"0073","ナイカ(ナイブンピ.タイシヤ)","内科(内分泌・代謝)","20230515","NULL","NULL","1","A05","144","NULL","NULL","NULL","NULL","2023/05/15 11:10:31","com_blng_sec_mapper","2023/05/15 11:10:31","com_blng_sec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv new file mode 100644 index 00000000..501d4cdb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_insert.csv @@ -0,0 +1,8 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0067","シヨウカキナイカ.ケツエキナイカ","消化器内科・血液内科","20230515","NULL","NULL","1","A02","117","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0068","カンワナイカ","緩和内科","20230515","NULL","NULL","1","A79","030","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20230515","NULL","NULL","1","L81","010","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20230515","NULL","NULL","1","A07","052","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20230515","NULL","NULL","1","A06","019","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20230515","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" +"9999","アイウエオアイウエオアイウエオアイウエオアイウ","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","9","999","999","NULL","NULL","NULL","NULL","2023/05/15 10:49:50","com_blng_sec_mapper","2023/05/15 10:49:50","com_blng_sec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv new file mode 100644 index 00000000..9743e740 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/expect_com_blng_sec_update.csv @@ -0,0 +1,8 @@ +"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0067","シヨウカキナイカ.ケツエキナイカ","","20171024","20230515","NULL","1","A02","117","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0068","カンワ","緩和内科","20171024","20230515","NULL","1","A79","030","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0069","シヨウニゲカ.セイイクゲカ.シヨウチヨウイシヨクゲカ","小児外科、成育外科、小腸移植外科","20171024","20230515","NULL","2","L81","010","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0070","ジンゾウ.ケツエキトウセキカ","腎臓・血液透析科","20171024","20230515","NULL","1","A08","052","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0071","トウニヨウビヨウナイブンピ.コウジヨウセンカ","糖尿病内分泌・甲状腺科","20171024","20230515","NULL","1","A06","020","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"0072","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","20230515","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2023/05/15 10:59:43","com_blng_sec_mapper" +"9999","ケツエキ.コウゲンビヨウカ","血液・膠原病科","20171024","NULL","NULL","1","A05","137","NULL","NULL","NULL","NULL","2017/10/24 10:49:50","clsComBlngSec","2017/10/24 10:49:50","clsComBlngSec" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py new file mode 100644 index 00000000..4825682e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_blng_sec/test_com_blng_sec_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_blng_sec_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComBlngSecMapper: + """レイアウト区分008: COM_所属部科""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_所属部科テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_insert.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_所属部科テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_blng_sec', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_update.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_所属部科テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_blng_sec_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_blng_sec', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_blng_sec_mapper.ComBlngSecMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_blng_sec_mapper.ComBlngSecMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_blng_sec_delete.csv')) + primary_keys = [f"'{primary_key['blng_sec_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_blng_sec WHERE blng_sec_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_delete.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_insert.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_insert.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_insert.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_update.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/com_manage_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/com_manage_update.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_delete.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_update.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/db_com_manage_before_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/db_com_manage_before_update.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_delete.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_insert.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_insert.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_insert.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_update.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/expect_com_manage_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/expect_com_manage_update.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/test_com_manage_mapper.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage copy/test_com_manage_mapper.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_manage/test_com_manage_mapper.py From 9e38f5201ca8b184312abb0eccd53299beaab6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 10:37:30 +0900 Subject: [PATCH 283/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=AD=A6=E4=BC=9A=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_sosiety_mapper.py | 93 +++++++++ .../ultmarc/utmp_tables/tables/com_sosiety.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../table_mapper/com_sosiety/__init__.py | 0 .../com_sosiety/com_sosiety_delete.csv | 7 + .../com_sosiety/com_sosiety_insert.csv | 7 + .../com_sosiety/com_sosiety_update.csv | 6 + .../db_com_sosiety_before_delete.csv | 7 + .../db_com_sosiety_before_update.csv | 8 + .../com_sosiety/expect_com_sosiety_delete.csv | 8 + .../com_sosiety/expect_com_sosiety_insert.csv | 8 + .../com_sosiety/expect_com_sosiety_update.csv | 8 + .../com_sosiety/test_com_sosiety_mapper.py | 197 ++++++++++++++++++ 13 files changed, 366 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py new file mode 100644 index 00000000..c98cfd1b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sosiety_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_sosiety import ComSosiety + + +class ComSosietyMapper(UltmarcTableMapper): + """レイアウト区分009: COM_学会 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_sosiety + WHERE + sosiety_cd = :sosiety_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_sosiety + ( + sosiety_cd, + sosiety_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :sosiety_cd, + :sosiety_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_sosiety + SET + sosiety_name = :sosiety_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_sosiety + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + sosiety_cd = :sosiety_cd + """ + record: ComSosiety + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSosiety) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py new file mode 100644 index 00000000..556bef5b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sosiety.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSosiety(UltmarcTable): + """レイアウト区分009: COM_学会""" + sosiety_cd: str # 学会コード + sosiety_name: str # 学会名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.sosiety_cd = record[1] + self.maint_flag = record[2] + self.sosiety_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 1f101aeb..b95274ff 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -66,6 +66,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import MstPrefcMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper import \ ComBlngSecMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper import \ + ComSosietyMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -115,7 +117,7 @@ COM_TABLE_LIST = { # COM_所属部科 "008": ComBlngSecMapper, # COM_学会 - "009": NullMapper, + "009": ComSosietyMapper, # COM_専門医資格 "010": NullMapper, # COM_施設区分 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv new file mode 100644 index 00000000..97dbe515 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_delete.csv @@ -0,0 +1,7 @@ +"009","001","A","20141113","20141114","" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","C","20141113","20141114","生化" +"009","005","A","20141113","20141114","病理" +"009","006","A","20141113","20141114","薬理" +"009","007","A","20141113","20141114","癌" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv new file mode 100644 index 00000000..ebdea438 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_insert.csv @@ -0,0 +1,7 @@ +"009","001","A","20141113","20141114","医史" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","A","20141113","20141114","生化" +"009","005","A","20141113","20141114","薬理" +"009","006","A","20141113","20141114","病理" +"009","999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv new file mode 100644 index 00000000..bb8eb3ba --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/com_sosiety_update.csv @@ -0,0 +1,6 @@ +"009","001","A","20141113","20141114","" +"009","002","A","20141113","20141114","解剖" +"009","003","A","20141113","20141114","生理" +"009","004","A","20141113","20141114","生化" +"009","005","A","20141113","20141114","病理" +"009","006","A","20141113","20141114","薬理" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv new file mode 100644 index 00000000..87bee255 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_delete.csv @@ -0,0 +1,7 @@ +"sosiety_cd","sosiety_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"002","解剖","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"003","生理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"004","生化","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"005","病理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" +"006","薬理","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:39:30","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv new file mode 100644 index 00000000..5447e8b3 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/db_com_sosiety_before_update.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","医史","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"002","解剖","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"003","生理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"004","生化","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"005","薬理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"006","病理","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" +"999","あいう","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv new file mode 100644 index 00000000..ff96fbec --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_delete.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"002","解剖","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"003","生理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"004","生化","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"005","病理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"006","薬理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:50:50","com_sosiety_mapper" +"007","癌","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:50:50","com_sosiety_mapper","2023/05/15 16:50:50","com_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv new file mode 100644 index 00000000..8da80c1a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_insert.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","医史","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"002","解剖","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"003","生理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"004","生化","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"005","薬理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"006","病理","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" +"999","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 16:30:39","com_sosiety_mapper","2023/05/15 16:30:39","com_sosiety_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv new file mode 100644 index 00000000..d8c4d20a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/expect_com_sosiety_update.csv @@ -0,0 +1,8 @@ +"sosiety_cd","sosiety_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"001","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"002","解剖","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"003","生理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"004","生化","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"005","病理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"006","薬理","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2023/05/15 16:39:30","com_sosiety_mapper" +"999","あいう","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 16:30:39","clsComSosiety","2017/10/20 16:30:39","clsComSosiety" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py new file mode 100644 index 00000000..1fd345b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sosiety/test_com_sosiety_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_sosiety_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSosietyMapper: + """レイアウト区分009: COM_学会""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_学会テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_insert.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_学会テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sosiety_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sosiety', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_update.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_学会テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_sosiety_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_sosiety', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_sosiety_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_sosiety', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_sosiety_mapper.ComSosietyMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_sosiety_mapper.ComSosietyMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sosiety_delete.csv')) + primary_keys = [f"'{primary_key['sosiety_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_sosiety WHERE sosiety_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From fce24a137b7d47f778d539787f5c41790608bcbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 13:21:54 +0900 Subject: [PATCH 284/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E5=B0=82=E9=96=80=E5=8C=BB=E8=B3=87=E6=A0=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_specialst_license_mapper.py | 93 +++++++++ .../tables/com_specialst_license.py | 14 ++ .../ultmarc_table_mapper_factory.py | 4 +- .../com_specialst_license/__init__.py | 0 .../com_specialst_license_delete.csv | 7 + .../com_specialst_license_insert.csv | 7 + .../com_specialst_license_update.csv | 6 + ...db_com_specialst_license_before_delete.csv | 7 + ...db_com_specialst_license_before_update.csv | 8 + .../expect_com_specialst_license_delete.csv | 8 + .../expect_com_specialst_license_insert.csv | 6 + .../expect_com_specialst_license_update.csv | 8 + .../test_com_specialst_license_mapper.py | 197 ++++++++++++++++++ 13 files changed, 364 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py new file mode 100644 index 00000000..bf5ac147 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_specialst_license import ComSpecialstLicense + + +class ComSpecialstLicenseMapper(UltmarcTableMapper): + """レイアウト区分010: COM_専門医資格 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_specialst_license + WHERE + specialst_cd = :specialst_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_specialst_license + ( + specialst_cd, + specialst_licens_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :specialst_cd, + :specialst_licens_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_specialst_license + SET + specialst_licens_name = :specialst_licens_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + specialst_cd = :specialst_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_specialst_license + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + specialst_cd = :specialst_cd + """ + record: ComSpecialstLicense + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComSpecialstLicense) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py new file mode 100644 index 00000000..98ce930f --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComSpecialstLicense(UltmarcTable): + """レイアウト区分010: COM_専門医資格""" + specialst_cd: str # 専門医コード + specialst_licens_name: str # 専門医資格名 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.specialst_cd = record[1] + self.maint_flag = record[2] + self.specialst_licens_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index b95274ff..5742af25 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -68,6 +68,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper imp ComBlngSecMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper import \ ComSosietyMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialst_license_mapper import \ + ComSpecialstLicenseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ NullMapper @@ -119,7 +121,7 @@ COM_TABLE_LIST = { # COM_学会 "009": ComSosietyMapper, # COM_専門医資格 - "010": NullMapper, + "010": ComSpecialstLicenseMapper, # COM_施設区分 "011": NullMapper, # COM_高度先進医療 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv new file mode 100644 index 00000000..79d312c4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv @@ -0,0 +1,7 @@ +"010","0001","A","20141113","20141114","" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","C","20141113","20141114","放射線科専門医" +"010","0006","A","20141113","20141114","眼科専門医" +"010","0007","A","20141113","20141114","耳鼻咽喉科専門医" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv new file mode 100644 index 00000000..34854679 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv @@ -0,0 +1,7 @@ +"010","0001","A","20141113","20141114","皮膚科専門医" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","A","20141113","20141114","眼科専門医" +"010","0006","A","20141113","20141114","放射線科専門医" +"010","9999","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv new file mode 100644 index 00000000..f598cab6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv @@ -0,0 +1,6 @@ +"010","0001","A","20141113","20141114","" +"010","0002","A","20141113","20141114","整形外科専門医" +"010","0003","A","20141113","20141114","麻酔科専門医" +"010","0004","A","20141113","20141114","産婦人科専門医" +"010","0005","A","20141113","20141114","放射線科専門医" +"010","0006","A","20141113","20141114","眼科専門医" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv new file mode 100644 index 00000000..60f3d7fb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv @@ -0,0 +1,7 @@ +"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0003","麻酔科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0004","産婦人科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0005","放射線科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" +"0006","眼科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv new file mode 100644 index 00000000..96ec417b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv @@ -0,0 +1,8 @@ +"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","皮膚科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0002","整形外科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0003","麻酔科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0004","産婦人科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0005","眼科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"0006","放射線科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" +"9999","ああああ","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv new file mode 100644 index 00000000..b4d4506a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv @@ -0,0 +1,8 @@ +"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0005","放射線科専門医","20171024","20171024","20230515","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" +"0007","耳鼻咽喉科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:47:40","com_specialst_license_mapper","2023/05/15 12:47:40","com_specialst_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv new file mode 100644 index 00000000..11f44661 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv @@ -0,0 +1,6 @@ +"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0003","麻酔科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" +"0004","産婦人科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" +"0005","眼科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" +"0006","放射線科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" +"9999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv new file mode 100644 index 00000000..8125f178 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv @@ -0,0 +1,8 @@ +"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"0002","整形外科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"0005","放射線科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"9999","ああああ","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py new file mode 100644 index 00000000..d8693046 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_specialst_license_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComSpecialstLicenseMapper: + """レイアウト区分010: COM_専門医資格""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_専門医資格テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_insert.csv')) + primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_専門医資格テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialst_license_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_specialst_license', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_update.csv')) + primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_専門医資格テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialst_license_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_specialst_license', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_delete.csv')) + primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From 22906f882ff0ad7029b825e2d708d51c0c5f5db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 14:03:56 +0900 Subject: [PATCH 285/962] =?UTF-8?q?=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E6=96=BD=E8=A8=AD=E5=8C=BA=E5=88=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_inst_div_mapper.py | 93 +++++++++ .../utmp_tables/tables/com_inst_div.py | 14 ++ .../ultmarc_table_mapper_factory.py | 6 +- .../table_mapper/com_inst_div/__init__.py | 0 .../com_inst_div/com_inst_div_delete.csv | 7 + .../com_inst_div/com_inst_div_insert.csv | 7 + .../com_inst_div/com_inst_div_update.csv | 6 + .../db_com_inst_div_before_delete.csv | 7 + .../db_com_inst_div_before_update.csv | 8 + .../expect_com_inst_div_delete.csv | 8 + .../expect_com_inst_div_insert.csv | 8 + .../expect_com_inst_div_update.csv | 8 + .../com_inst_div/test_com_inst_div_mapper.py | 197 ++++++++++++++++++ 13 files changed, 366 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/__init__.py create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py new file mode 100644 index 00000000..08d9e03d --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_div_mapper.py @@ -0,0 +1,93 @@ +from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ + UltmarcTableMapper +from src.batch.ultmarc.utmp_tables.tables.com_inst_div import ComInstDiv + + +class ComInstDivMapper(UltmarcTableMapper): + """レイアウト区分011: COM_施設区分 登録処理""" + + # レコード存在確認SQL + RECORD_EXISTS_QUERY = """\ + SELECT + COUNT(*) AS count_num + FROM + src05.com_inst_div + WHERE + inst_div_cd = :inst_div_cd + """ + # データ登録用SQL + INSERT_QUERY = """\ + INSERT INTO src05.com_inst_div + ( + inst_div_cd, + inst_div_name, + regist_ymd, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + ) + VALUES ( + :inst_div_cd, + :inst_div_name, + :execute_date_str_ymd, + :execute_datetime, + :program_name, + :execute_datetime, + :program_name + ) + """ + + # 変更用SQL + UPDATE_QUERY = """\ + UPDATE + src05.com_inst_div + SET + inst_div_name = :inst_div_name, + update_ymd = :execute_date_str_ymd, + sys_update_date = :execute_datetime, + update_prgm_id = :program_name + WHERE + inst_div_cd = :inst_div_cd + """ + + # 修正区分が「C(削除)」の場合の更新SQL + LOGICAL_DELETE_QUERY = """\ + UPDATE + src05.com_inst_div + SET + delete_ymd = :execute_date_str_ymd, + sys_update_date = :execute_date_str_ymd, + update_prgm_id = :program_name + WHERE + inst_div_cd = :inst_div_cd + """ + record: ComInstDiv + + def __init__(self, record: list[str], db) -> None: + super().__init__(record, db, ComInstDiv) + program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) + # モジュール名をクエリパラメータに設定 + self.query_parameter['program_name'] = program_name + # 読み込んだレコード値もクエリパラメータに追加 + self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} + + def make_query(self): + # 修正区分がC(削除)の場合、論理削除 + if self.record.maint_flag == 'C': + self.queries.append(self.LOGICAL_DELETE_QUERY) + return + + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): + # レコードの存在確認 + record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) + # 存在しない場合はInsert + if record_count[0]['count_num'] == 0: + return self.INSERT_QUERY + + # 存在する場合ではUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py new file mode 100644 index 00000000..a51e5e3b --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_inst_div.py @@ -0,0 +1,14 @@ +from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable + + +class ComInstDiv(UltmarcTable): + """レイアウト区分011: COM_施設区分""" + inst_div_cd: str # 施設区分コード + inst_div_name: str # 施設区分名称 + maint_flag: str # 修正区分 + + def __init__(self, record: list[str]): + super().__init__(record) + self.inst_div_cd = record[1] + self.maint_flag = record[2] + self.inst_div_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index 5742af25..b5adf693 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -70,8 +70,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper impo ComSosietyMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialst_license_mapper import \ ComSpecialstLicenseMapper -from src.batch.ultmarc.utmp_tables.table_mapper.concrete.null_mapper import \ - NullMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_div_mapper import \ + ComInstDivMapper # テーブルとのマッピング COM_TABLE_LIST = { @@ -123,7 +123,7 @@ COM_TABLE_LIST = { # COM_専門医資格 "010": ComSpecialstLicenseMapper, # COM_施設区分 - "011": NullMapper, + "011": ComInstDivMapper, # COM_高度先進医療 "021": ComHamtecMapper, # COM_先端医療機器 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv new file mode 100644 index 00000000..904e9593 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_delete.csv @@ -0,0 +1,7 @@ +"011","01","A","20141113","20141114","" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","C","20141113","20141114","国立療養所" +"011","06","A","20141113","20141114","高次救急医療機関" +"011","07","A","20141113","20141114","社会福祉施設附属病院" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv new file mode 100644 index 00000000..7d7d994d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_insert.csv @@ -0,0 +1,7 @@ +"011","01","A","20141113","20141114","病院(大学HP以外)" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","A","20141113","20141114","高次救急医療機関" +"011","06","A","","","国立療養所" +"011","99","A","","","あいうえおかきくけこあいうえおかきくけこあいうえお" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv new file mode 100644 index 00000000..b220b54f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/com_inst_div_update.csv @@ -0,0 +1,6 @@ +"011","01","A","20141113","20141114","" +"011","02","A","20141113","20141114","大学附属病院" +"011","03","A","20141113","20141114","大学附属病院分院" +"011","04","A","20141113","20141114","歯科病院(歯学部附属病院)" +"011","05","A","20141113","20141114","国立療養所" +"011","06","A","20141113","20141114","高次救急医療機関" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv new file mode 100644 index 00000000..b5d0a632 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_delete.csv @@ -0,0 +1,7 @@ +"inst_div_cd","inst_div_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"02","大学附属病院","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"03","大学附属病院分院","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"04","歯科病院(歯学部附属病院)","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"05","国立療養所","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" +"06","高次救急医療機関","20171020","20171020","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:26:40","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv new file mode 100644 index 00000000..96935038 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/db_com_inst_div_before_update.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","病院(大学HP以外)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"02","大学附属病院","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"03","大学附属病院分院","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"04","歯科病院(歯学部附属病院)","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"05","高次救急医療機関","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"06","国立療養所","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" +"99","ああああ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv new file mode 100644 index 00000000..8928715b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_delete.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"02","大学附属病院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"03","大学附属病院分院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:30:16","com_inst_div_mapper" +"05","国立療養所","20171020","20171020","20230515","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"06","高次救急医療機関","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:30:16","com_inst_div_mapper" +"07","社会福祉施設附属病院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:30:16","com_inst_div_mapper","2023/05/15 17:30:16","com_inst_div_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv new file mode 100644 index 00000000..b482c0bf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_insert.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","病院(大学HP以外)","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"02","大学附属病院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"03","大学附属病院分院","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"05","高次救急医療機関","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"06","国立療養所","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" +"99","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 17:17:48","com_inst_div_mapper","2023/05/15 17:17:48","com_inst_div_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv new file mode 100644 index 00000000..1f416568 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/expect_com_inst_div_update.csv @@ -0,0 +1,8 @@ +"inst_div_cd","inst_div_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"01","","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"02","大学附属病院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"03","大学附属病院分院","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"04","歯科病院(歯学部附属病院)","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"05","国立療養所","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"06","高次救急医療機関","20171020","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2023/05/15 17:26:40","com_inst_div_mapper" +"99","ああああ","20171020","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/20 17:17:48","clsComInstDiv","2017/10/20 17:17:48","clsComInstDiv" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py new file mode 100644 index 00000000..17091505 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_div/test_com_inst_div_mapper.py @@ -0,0 +1,197 @@ +import os.path as path +from datetime import datetime + +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_inst_div_mapper +from src.db.database import Database +from tests.testing_utility import (assert_table_results, + create_db_data_from_csv, + create_delete_sql_with_parameter, + create_insert_sql_with_parameter, + create_ultmarc_table_mapper_sut, + create_ultmarc_test_data_from_csv) + + +class TestComInstDivMapper: + """レイアウト区分011: COM_施設区分""" + + db: Database + batch_context: BatchContext + test_file_path: str = path.dirname(__file__) + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + self.batch_context = BatchContext.get_instance() + # setup + self.db = database + self.db.connect() + self.db.begin() + + # testing + yield + + # teardown + self.db.rollback() + self.db.disconnect() + + def test_insert_record(self): + """ + Cases: + COM_施設区分テーブルにレコードを登録する + Arranges: + - CSVデータを用意し、読み込む + - 追加対象となるレコードを削除する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_insert.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_insert.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_update_record(self): + """ + Cases: + COM_施設区分テーブルのレコードを更新する + Arranges: + - CSVデータを用意し、読み込む + - 更新対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_update.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_div_before_update.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_div', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_update.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' + + def test_logical_delete(self): + """ + Cases: + COM_施設区分テーブルのレコードを1件論理削除する + Arranges: + - CSVデータを用意し、読み込む + - 削除対象となるレコードを登録する + Expects: + - 登録内容が期待値と一致すること + """ + + # Arrange + # 処理日設定 + self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') + # テスト用のCSVを読み込む + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_inst_div_delete.csv')) + # 一旦全データをDBから削除 + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_inst_div', {'1': '1'}) + self.db.execute(delete_sql, delete_parameter) + # テストデータをDBに登録 + # DBデータを読み込む + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_inst_div_before_delete.csv')) + for test_data in test_sql_data_list: + insert_sql, insert_parameter = create_insert_sql_with_parameter( + 'src05.com_inst_div', + test_data.keys(), + test_data.values() + ) + self.db.execute(insert_sql, insert_parameter) + + # Act + for line_number, line in enumerate(test_dat_file, start=1): + sut: com_inst_div_mapper.ComInstDivMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_inst_div_mapper.ComInstDivMapper, f'{line_number}行目:マッパークラスが期通りか' + sut.make_query() + sut.execute_queries() + + # Assert + # 期待値ファイルを読み込む + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_div_delete.csv')) + primary_keys = [f"'{primary_key['inst_div_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_inst_div WHERE inst_div_cd IN ({','.join(primary_keys)})" + actual_data_list = self.db.execute_select(actual_select_sql) + # 期待値検査 + ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] + assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) + # 動的日付項目の個別確認 + line_number = 0 + for actual_row, expect_row in zip(actual_data_list, expect_data_list): + line_number += 1 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + if actual_col_name in ignore_columns: + if expect_row[expect_col_name] is None: + assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' + else: + assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' From a0698a425de25537f37c21ac4a0ad30bd710dc8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 16 May 2023 14:26:37 +0900 Subject: [PATCH 286/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC=E6=8C=87=E6=91=98?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/create_dcf_inst_merge.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/create_dcf_inst_merge.py index bbeb86d3..0dad2288 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 @@ -90,13 +90,13 @@ def _insert_dcf_inst_merge_from_com_inst(db: Database) -> tuple[bool, list[dict] """ duplication_inst_records = db.execute_select(sql) logging_sql(logger, sql) - logger.info('重複コードがあるデータの取得に成功') + logger.info('施設統合対象データの取得に成功') except Exception as e: - logger.debug('重複コードがあるデータの取得に失敗') + logger.debug('施設統合対象データの取得に失敗') raise e if len(duplication_inst_records) == 0: - logger.info('重複コードがあるデータはありません') + logger.info('施設統合対象データはありません') return (False, None) # DCF施設統合マスタ追加 From 88ee68a7dd68dead92bea4aff2739aaf57d86ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 14:40:19 +0900 Subject: [PATCH 287/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expect_com_specialst_license_insert.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv index 11f44661..ef609890 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv @@ -1,4 +1,6 @@ "specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","皮膚科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" +"0002","整形外科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" "0003","麻酔科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" "0004","産婦人科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" "0005","眼科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" From bed40f038a5328641700dd406ce0e2d8ec69ee98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 16 May 2023 15:23:27 +0900 Subject: [PATCH 288/962] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=82=A2=E3=82=A4?= =?UTF-8?q?=E3=83=86=E3=83=A0=E6=9B=B4=E6=96=B0=E6=96=B9=E6=B3=95=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_forfront_med_equip_mapper.py | 17 ++++++++--------- .../table_mapper/concrete/com_hamtec_mapper.py | 7 ++----- .../concrete/com_med_func_valuation_mapper.py | 7 ++----- .../concrete/com_nurse_assrt_mapper.py | 9 +++------ .../concrete/com_policy_med_mapper.py | 17 ++++++++--------- .../concrete/com_regn_critic_pass_mapper.py | 6 ++---- .../concrete/com_rehabili_mapper.py | 8 +++----- .../expect_com_forfront_med_equip_delete.csv | 2 +- .../expect_com_forfront_med_equip_update.csv | 2 +- .../com_hamtec/com_hamtec_delete.csv | 2 +- .../com_hamtec/com_hamtec_update.csv | 2 +- .../com_hamtec/expect_com_hamtec_delete.csv | 2 +- .../com_hamtec/expect_com_hamtec_update.csv | 2 +- .../expect_com_med_func_valuation_delete.csv | 2 +- .../expect_com_med_func_valuation_update.csv | 2 +- .../expect_com_nurse_assrt_delete.csv | 2 +- .../expect_com_nurse_assrt_update.csv | 2 +- .../expect_com_policy_med_delete.csv | 2 +- .../expect_com_policy_med_update.csv | 2 +- .../expect_com_regn_critic_pass_update.csv | 2 +- .../com_rehabili/expect_com_rehabili_delete.csv | 2 +- .../com_rehabili/expect_com_rehabili_update.csv | 2 +- 22 files changed, 43 insertions(+), 58 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py index 2892d074..089ef73d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_forfront_med_equip_mapper.py @@ -80,17 +80,16 @@ class ComForfrontMedEquipMapper(UltmarcTableMapper): self.queries.append(self.LOGICAL_DELETE_QUERY) return + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): # レコードの存在確認 record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: - self.queries.append(self.INSERT_QUERY) - return + return self.INSERT_QUERY - # 更新の場合 - if self.record.hi_medicmach_name != '': - self.queries.append(self.UPDATE_QUERY) - return - else: - self.queries.append(None) - return + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py index 4cb71bbf..4d43560a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_hamtec_mapper.py @@ -40,6 +40,7 @@ class ComHamtecMapper(UltmarcTableMapper): ) """ + # 更新用SQL UPDATE_QUERY = """\ UPDATE src05.com_hamtec @@ -92,8 +93,4 @@ class ComHamtecMapper(UltmarcTableMapper): return self.INSERT_QUERY # 存在する場合はUpdate - # 更新データがある場合のみ更新 - if self.record.hamtec_div != '' or self.record.hamtec_name != '': - return self.UPDATE_QUERY - else: - return None + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py index 530a1334..f7c03fef 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_med_func_valuation_mapper.py @@ -93,8 +93,5 @@ class ComMedFuncValuationMapper(UltmarcTableMapper): if record_count[0]['count_num'] == 0: return self.INSERT_QUERY - # med_func_valuation_nameが空で無い場合はUpdate - if len(self.record.med_func_valuation_name) == 0: - return None - else: - return self.UPDATE_QUERY + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py index 6d1086f0..37a4c889 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_nurse_assrt_mapper.py @@ -40,6 +40,7 @@ class ComNurseAssrtMapper(UltmarcTableMapper): ) """ + # 更新用SQL UPDATE_QUERY = """\ UPDATE src05.com_nurse_assrt @@ -90,9 +91,5 @@ class ComNurseAssrtMapper(UltmarcTableMapper): if record_count[0]['count_num'] == 0: return self.INSERT_QUERY - # 更新する項目が無い場合 - if self.record.nurse_assrt_name == '': - return None - else: - # 更新する項目がある場合はUpdate - return self.UPDATE_QUERY + # 存在する場合はupdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py index 17b1d937..0eba2a49 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_policy_med_mapper.py @@ -81,17 +81,16 @@ class ComPolicyMedMapper(UltmarcTableMapper): self.queries.append(self.LOGICAL_DELETE_QUERY) return + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): # レコードの存在確認 record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: - self.queries.append(self.INSERT_QUERY) - return + return self.INSERT_QUERY - # 更新の場合 - if self.record.field_name != '': - self.queries.append(self.UPDATE_QUERY) - return - else: - self.queries.append(None) - return + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py index 1bfbb38e..e3ac5f0d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_regn_critic_pass_mapper.py @@ -40,6 +40,7 @@ class ComRegnCriticPassMapper(UltmarcTableMapper): ) """ + # 更新用SQL UPDATE_QUERY = """\ UPDATE src05.com_regn_critic_pass @@ -91,7 +92,4 @@ class ComRegnCriticPassMapper(UltmarcTableMapper): return self.INSERT_QUERY # 存在する場合はUpdate - if len(self.record.disease_name_kanji) == 0: - return None - else: - return self.UPDATE_QUERY + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py index 1ff87694..363f7684 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_rehabili_mapper.py @@ -38,6 +38,7 @@ class ComRehabiliMapper(UltmarcTableMapper): ) """ + # 更新用SQL UPDATE_QUERY = """\ UPDATE src05.com_rehabili @@ -89,8 +90,5 @@ class ComRehabiliMapper(UltmarcTableMapper): if record_count[0]['count_num'] == 0: return self.INSERT_QUERY - # 存在する場合ではUpdate - if self.record.rehabili_name == '': - return None - else: - return self.UPDATE_QUERY + # 存在する場合はUpdate + return self.UPDATE_QUERY diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv index 0eead53f..0642d2d5 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_delete.csv @@ -1,5 +1,5 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"11","MRI","20171023","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","clsComForfrontMedEqu" +"11","","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:07:41","com_forfront_med_equip_mapper" "12","X線CT","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" "13","CR","20171023","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" "14","血管造影システム","20171023","20171023","20230421","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:14:25","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv index 133e13a9..3b8e7904 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_forfront_med_equip/expect_com_forfront_med_equip_update.csv @@ -1,5 +1,5 @@ "forfront_med_equip_cd","forfront_med_equip_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"11","MRI","20230421","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 10:07:41","com_forfront_med_equip_mapper" +"11","","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2023/04/21 10:01:26","clsComForfrontMedEqu","2017/10/23 10:07:41","com_forfront_med_equip_mapper" "12","X線CT","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" "13","CR","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 10:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" "14","血管造影システム","20230421","20230421","NULL","NULL","NULL","NULL","NULL","2017/10/23 15:01:26","clsComForfrontMedEqu","2017/10/23 15:10:02","com_forfront_med_equip_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv index 7cbc586b..18531d8d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_delete.csv @@ -1,4 +1,4 @@ -"021","001",,"A","20141113","20141114", +"021","001","","A","20141113","20141114","" "021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)" "021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療" "021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv index 43b1e27c..90620670 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/com_hamtec_update.csv @@ -1,4 +1,4 @@ -"021","001",,"B","20141113","20141114", +"021","001","","B","20141113","20141114","" "021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)" "021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療" "021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv index 9b5b62d9..e41f75a8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_delete.csv @@ -1,5 +1,5 @@ "hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"001",,,"20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","com_hamtec_mapper" "002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" "003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" "004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","20171018","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:21:01","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv index 1d9a61d4..fcdce90b 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_hamtec/expect_com_hamtec_update.csv @@ -1,5 +1,5 @@ "hamtec_cd","hamtec_div","hamtec_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"001","2","直流電流による骨電気治療法","20171018","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","clsComHamtec" +"001","","","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:03:10","com_hamtec_mapper" "002","1","電磁波温熱療法(放射線療法と併用しないもの)","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" "003","2","微小銅線による脳血管性病変に対しての電気的凝固治療","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" "004","1","顔面骨、頭蓋骨の観血的移動術","20171018","20171018","NULL","NULL","NULL","NULL","NULL","2017/10/18 17:03:10","clsComHamtec","2017/10/18 17:08:06","com_hamtec_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv index 1d74c427..ec7302e3 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_delete.csv @@ -1,5 +1,5 @@ "med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"01","","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","com_med_func_valuation_mapper" "02","一般病院B","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" "03","精神病院A","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:22:50","com_med_func_valuation_mapper" "04","精神病院B","20171024","20171024","20230424","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2023/04/23 10:22:50","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv index 2d8e985a..b5292152 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_med_func_valuation/expect_com_med_func_valuation_update.csv @@ -1,5 +1,5 @@ "med_func_valuation_cd","med_func_valuation_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date",update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","一般病院A","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","clsComMedFuncValuati" +"01","","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:17:22","com_med_func_valuation_mapper" "02","一般病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" "03","精神病院A","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" "04","精神病院B","20171024","20230424","NULL","NULL","NULL","NULL","NULL","2017/10/24 10:17:22","clsComMedFuncValuati","2017/10/24 10:19:04","com_med_func_valuation_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv index 2c4cc78a..97e10546 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_delete.csv @@ -1,5 +1,5 @@ "nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"3991","","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","com_nurse_assrt_mapper" "4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" "4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" "4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","20230421","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:31:18","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv index 664f4879..82c4ee0a 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_nurse_assrt/expect_com_nurse_assrt_update.csv @@ -1,5 +1,5 @@ "nurse_assrt_cd","nurse_assrt_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"3991","診療所療養型種別不明","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","clsComNurseAssrt" +"3991","","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:16:17","com_nurse_assrt_mapper" "4101","療養型介護療養施設サービス費(Ⅰ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" "4102","療養型介護療養施設サービス費(Ⅱ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" "4103","療養型介護療養施設サービス費(Ⅲ)","20171019","20171019","NULL","NULL","NULL","NULL","NULL","2017/10/19 10:16:17","clsComNurseAssrt","2017/10/19 10:18:12","com_nurse_assrt_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv index 33d4b95f..8863326e 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_delete.csv @@ -1,5 +1,5 @@ "policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"01","","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 15:06:43","com_policy_med_mapper" "02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" "03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" "04","神経・筋疾患(筋ジスを含む)","20171019","20171019","20230425","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2022/10/20 17:36:27","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv index 284e516f..b0d08781 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_policy_med/expect_com_policy_med_update.csv @@ -1,5 +1,5 @@ "policy_med_cd","field_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","がん","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2017/10/19 15:06:43","clsComPolicyMed" +"01","","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:06:43","com_policy_med_mapper" "02","循環器病","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" "03","精神疾患","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" "04","神経・筋疾患(筋ジスを含む)","20171019","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/19 15:06:43","clsComPolicyMed","2023/04/19 15:12:57","com_policy_med_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv index 68d07075..35151deb 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_regn_critic_pass/expect_com_regn_critic_pass_update.csv @@ -1,4 +1,4 @@ "regn_co_critic_pass_cd","disease_name_kanji","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "01","頸部骨折","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" "55","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこくけこあいうえおかきくけこあいうえおかき","20230423","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","com_regn_critic_pass_mapper","2023/03/24 10:04:58","com_regn_critic_pass_mapper" -"99","不明","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","clsComRegnCriticPass" +"99","","20171024","20230423","NULL","NULL","NULL","NULL","NULL","2023/03/24 10:04:58","clsComRegnCriticPass","2023/03/24 10:04:58","com_regn_critic_pass_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv index fa1a79eb..e2554dc6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_delete.csv @@ -1,5 +1,5 @@ "rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"01","","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","com_rehabili_mapper" "02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" "03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" "04","廃用症候群リハビリテーション","20171019","20171019","20230423","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 15:01:11","com_rehabili_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv index f39d0ed8..00891218 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_rehabili/expect_com_rehabili_update.csv @@ -1,5 +1,5 @@ "rehabili_cd","rehabili_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"01","脳血管疾患等リハビリテーション","20171019","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","clsComRehabili" +"01","","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2017/10/19 14:44:23","com_rehabili_mapper" "02","運動器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" "03","呼吸器リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" "04","廃用症候群リハビリテーション","20171019","20230423","NULL","NULL","NULL","NULL","NULL","2017/10/19 14:44:23","clsComRehabili","2022/10/19 14:51:32","com_rehabili_mapper" From 647d8836ff8012ae8c2169080e206ccc883597c7 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 16 May 2023 22:30:09 +0900 Subject: [PATCH 289/962] =?UTF-8?q?=E5=AE=9F=E6=B6=88=E5=8C=96=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E5=8F=97=E9=A0=98=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=AE=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/Pipfile | 1 + ecs/jskult-batch-daily/Pipfile.lock | 292 ++-- .../batch/vjsk/vjsk_file_check/conftest.py | 1226 +++++++++++++++++ .../vjsk_file_check/test_vjsk_file_check.py | 269 +++- ecs/jskult-batch-daily/tests/conftest.py | 10 - 5 files changed, 1666 insertions(+), 132 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile index a5d5dddd..1e6adf91 100644 --- a/ecs/jskult-batch-daily/Pipfile +++ b/ecs/jskult-batch-daily/Pipfile @@ -18,6 +18,7 @@ autopep8 = "*" flake8 = "*" pytest = "*" pytest-cov = "*" +boto3 = "*" [requires] python_version = "3.9" diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index 519c60a0..10b5f555 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9bce8f43bcad5d6ae8e5a558b8ade00a83f6e1671993e91b0a883fffa6b95df9" + "sha256": "df8b09869c6ad0daff24cf808bac56f528d8ae5835fe70a50d58c2bed724e717" }, "pipfile-spec": 6, "requires": { @@ -18,19 +18,19 @@ "default": { "boto3": { "hashes": [ - "sha256:816a198a6cc4f283af6b21439d85be6dbe4b73c2232dd906c6bafb4fece28d19", - "sha256:9de90a2c0b853f84436b032b28947fc8a765dc462573a8d543b13f16c6579b40" + "sha256:2da4a4caa789312ae73d29be9d3e79ce3328e3aaf7e9de0da6f243455ad3aae6", + "sha256:a49b47621c71adfa952127222809ae50867ae4fd249bb932eb1a98519baefa40" ], "index": "pypi", - "version": "==1.26.107" + "version": "==1.26.134" }, "botocore": { "hashes": [ - "sha256:ee1e43e6cd0864cc6811ba3f05123647612ee3f07a286a4c94f5885aa86d6922", - "sha256:f63942b4b7248c0b3d6ecbc2852cf0787c23ace2a91a012f7ee0b3ae3eb08f4f" + "sha256:0e907b0cab771ab7c9e25efd6b6bc0041ec1b17eb0bab316fd012ef2f8fd99ba", + "sha256:8a070ee14a430bd3c9cd16fd142e5c2900749060490698b2b981d6d9dadf5f1f" ], "markers": "python_version >= '3.7'", - "version": "==1.29.107" + "version": "==1.29.134" }, "greenlet": { "hashes": [ @@ -124,11 +124,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": [ @@ -140,50 +140,50 @@ }, "sqlalchemy": { "hashes": [ - "sha256:07950fc82f844a2de67ddb4e535f29b65652b4d95e8b847823ce66a6d540a41d", - "sha256:0a865b5ec4ba24f57c33b633b728e43fde77b968911a6046443f581b25d29dd9", - "sha256:0b49f1f71d7a44329a43d3edd38cc5ee4c058dfef4487498393d16172007954b", - "sha256:13f984a190d249769a050634b248aef8991acc035e849d02b634ea006c028fa8", - "sha256:1b69666e25cc03c602d9d3d460e1281810109e6546739187044fc256c67941ef", - "sha256:1d06e119cf79a3d80ab069f064a07152eb9ba541d084bdaee728d8a6f03fd03d", - "sha256:246712af9fc761d6c13f4f065470982e175d902e77aa4218c9cb9fc9ff565a0c", - "sha256:34eb96c1de91d8f31e988302243357bef3f7785e1b728c7d4b98bd0c117dafeb", - "sha256:4c3020afb144572c7bfcba9d7cce57ad42bff6e6115dffcfe2d4ae6d444a214f", - "sha256:4f759eccb66e6d495fb622eb7f4ac146ae674d829942ec18b7f5a35ddf029597", - "sha256:68ed381bc340b4a3d373dbfec1a8b971f6350139590c4ca3cb722fdb50035777", - "sha256:6b72dccc5864ea95c93e0a9c4e397708917fb450f96737b4a8395d009f90b868", - "sha256:6e84ab63d25d8564d7a8c05dc080659931a459ee27f6ed1cf4c91f292d184038", - "sha256:734805708632e3965c2c40081f9a59263c29ffa27cba9b02d4d92dfd57ba869f", - "sha256:78612edf4ba50d407d0eb3a64e9ec76e6efc2b5d9a5c63415d53e540266a230a", - "sha256:7e472e9627882f2d75b87ff91c5a2bc45b31a226efc7cc0a054a94fffef85862", - "sha256:865392a50a721445156809c1a6d6ab6437be70c1c2599f591a8849ed95d3c693", - "sha256:8d118e233f416d713aac715e2c1101e17f91e696ff315fc9efbc75b70d11e740", - "sha256:8d3ece5960b3e821e43a4927cc851b6e84a431976d3ffe02aadb96519044807e", - "sha256:93c78d42c14aa9a9e0866eacd5b48df40a50d0e2790ee377af7910d224afddcf", - "sha256:95719215e3ec7337b9f57c3c2eda0e6a7619be194a5166c07c1e599f6afc20fa", - "sha256:9838bd247ee42eb74193d865e48dd62eb50e45e3fdceb0fdef3351133ee53dcf", - "sha256:aa5c270ece17c0c0e0a38f2530c16b20ea05d8b794e46c79171a86b93b758891", - "sha256:ac6a0311fb21a99855953f84c43fcff4bdca27a2ffcc4f4d806b26b54b5cddc9", - "sha256:ad5363a1c65fde7b7466769d4261126d07d872fc2e816487ae6cec93da604b6b", - "sha256:b3e5864eba71a3718236a120547e52c8da2ccb57cc96cecd0480106a0c799c92", - "sha256:bbda1da8d541904ba262825a833c9f619e93cb3fd1156be0a5e43cd54d588dcd", - "sha256:c6e27189ff9aebfb2c02fd252c629ea58657e7a5ff1a321b7fc9c2bf6dc0b5f3", - "sha256:c8239ce63a90007bce479adf5460d48c1adae4b933d8e39a4eafecfc084e503c", - "sha256:d209594e68bec103ad5243ecac1b40bf5770c9ebf482df7abf175748a34f4853", - "sha256:d5327f54a9c39e7871fc532639616f3777304364a0bb9b89d6033ad34ef6c5f8", - "sha256:db4bd1c4792da753f914ff0b688086b9a8fd78bb9bc5ae8b6d2e65f176b81eb9", - "sha256:e4780be0f19e5894c17f75fc8de2fe1ae233ab37827125239ceb593c6f6bd1e2", - "sha256:e4a019f723b6c1e6b3781be00fb9e0844bc6156f9951c836ff60787cc3938d76", - "sha256:e62c4e762d6fd2901692a093f208a6a6575b930e9458ad58c2a7f080dd6132da", - "sha256:e730603cae5747bc6d6dece98b45a57d647ed553c8d5ecef602697b1c1501cf2", - "sha256:ebc4eeb1737a5a9bdb0c24f4c982319fa6edd23cdee27180978c29cbb026f2bd", - "sha256:ee2946042cc7851842d7a086a92b9b7b494cbe8c3e7e4627e27bc912d3a7655e", - "sha256:f005245e1cb9b8ca53df73ee85e029ac43155e062405015e49ec6187a2e3fb44", - "sha256:f49c5d3c070a72ecb96df703966c9678dda0d4cb2e2736f88d15f5e1203b4159", - "sha256:f61ab84956dc628c8dfe9d105b6aec38afb96adae3e5e7da6085b583ff6ea789" + "sha256:0aa2cbde85a6eab9263ab480f19e8882d022d30ebcdc14d69e6a8d7c07b0a871", + "sha256:0d6979c9707f8b82366ba34b38b5a6fe32f75766b2e901f9820e271e95384070", + "sha256:0eb14a386a5b610305bec6639b35540b47f408b0a59f75999199aed5b3d40079", + "sha256:2424a84f131901fbb20a99844d47b38b517174c6e964c8efb15ea6bb9ced8c2b", + "sha256:2ad9688debf1f0ae9c6e0706a4e2d33b1a01281317cee9bd1d7eef8020c5baac", + "sha256:2f0a355264af0952570f18457102984e1f79510f856e5e0ae652e63316d1ca23", + "sha256:31f72bb300eed7bfdb373c7c046121d84fa0ae6f383089db9505ff553ac27cef", + "sha256:375b7ba88f261dbd79d044f20cbcd919d88befb63f26af9d084614f10cdf97a6", + "sha256:37de4010f53f452e94e5ed6684480432cfe6a7a8914307ef819cd028b05b98d5", + "sha256:49c138856035cb97f0053e5e57ba90ec936b28a0b8b0020d44965c7b0c0bf03a", + "sha256:4f9832815257969b3ca9bf0501351e4c02c8d60cbd3ec9f9070d5b0f8852900e", + "sha256:566a0ac347cf4632f551e7b28bbd0d215af82e6ffaa2556f565a3b6b51dc3f81", + "sha256:6777673d346071451bf7cccf8d0499024f1bd6a835fc90b4fe7af50373d92ce6", + "sha256:72746ec17a7d9c5acf2c57a6e6190ceba3dad7127cd85bb17f24e90acc0e8e3f", + "sha256:755f653d693f9b8f4286d987aec0d4279821bf8d179a9de8e8a5c685e77e57d6", + "sha256:7612a7366a0855a04430363fb4ab392dc6818aaece0b2e325ff30ee77af9b21f", + "sha256:7ad24c85f2a1caf0cd1ae8c2fdb668777a51a02246d9039420f94bd7dbfd37ed", + "sha256:881cc388dded44ae6e17a1666364b98bd76bcdc71b869014ae725f06ba298e0e", + "sha256:8d97b37b4e60073c38bcf94e289e3be09ef9be870de88d163f16e08f2b9ded1a", + "sha256:9119795d2405eb23bf7e6707e228fe38124df029494c1b3576459aa3202ea432", + "sha256:9136d596111c742d061c0f99bab95c5370016c4101a32e72c2b634ad5e0757e6", + "sha256:9ad883ac4f5225999747f0849643c4d0ec809d9ffe0ddc81a81dd3e68d0af463", + "sha256:a25b4c4fdd633501233924f873e6f6cd8970732859ecfe4ecfb60635881f70be", + "sha256:a30e4db983faa5145e00ef6eaf894a2d503b3221dbf40a595f3011930d3d0bac", + "sha256:a5e9e78332a5d841422b88b8c490dfd7f761e64b3430249b66c05d02f72ceab0", + "sha256:b4e08e3831671008888bad5d160d757ef35ce34dbb73b78c3998d16aa1334c97", + "sha256:bf1aae95e80acea02a0a622e1c12d3fefc52ffd0fe7bda70a30d070373fbb6c3", + "sha256:c61b89803a87a3b2a394089a7dadb79a6c64c89f2e8930cc187fec43b319f8d2", + "sha256:cdf80359b641185ae7e580afb9f88cf560298f309a38182972091165bfe1225d", + "sha256:d93ebbff3dcf05274843ad8cf650b48ee634626e752c5d73614e5ec9df45f0ce", + "sha256:db24d2738add6db19d66ca820479d2f8f96d3f5a13c223f27fa28dd2f268a4bd", + "sha256:e0d20f27edfd6f35b388da2bdcd7769e4ffa374fef8994980ced26eb287e033a", + "sha256:e2f3b5236079bc3e318a92bab2cc3f669cc32127075ab03ff61cacbae1c392b8", + "sha256:e481e54db8cec1457ee7c05f6d2329e3298a304a70d3b5e2e82e77170850b385", + "sha256:e5e5dc300a0ca8755ada1569f5caccfcdca28607dfb98b86a54996b288a8ebd3", + "sha256:ec2f525273528425ed2f51861b7b88955160cb95dddb17af0914077040aff4a5", + "sha256:f234ba3bb339ad17803009c8251f5ee65dcf283a380817fe486823b08b26383d", + "sha256:f463598f9e51ccc04f0fe08500f9a0c3251a7086765350be418598b753b5561d", + "sha256:f717944aee40e9f48776cf85b523bb376aa2d9255a268d6d643c57ab387e7264", + "sha256:fd0febae872a4042da44e972c070f0fd49a85a0a7727ab6b85425f74348be14e", + "sha256:fec56c7d1b6a22c8f01557de3975d962ee40270b81b60d1cfdadf2a105d10e84" ], "index": "pypi", - "version": "==2.0.9" + "version": "==2.0.13" }, "tenacity": { "hashes": [ @@ -211,14 +211,6 @@ } }, "develop": { - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" - }, "autopep8": { "hashes": [ "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", @@ -227,65 +219,89 @@ "index": "pypi", "version": "==2.0.2" }, + "boto3": { + "hashes": [ + "sha256:2da4a4caa789312ae73d29be9d3e79ce3328e3aaf7e9de0da6f243455ad3aae6", + "sha256:a49b47621c71adfa952127222809ae50867ae4fd249bb932eb1a98519baefa40" + ], + "index": "pypi", + "version": "==1.26.134" + }, + "botocore": { + "hashes": [ + "sha256:0e907b0cab771ab7c9e25efd6b6bc0041ec1b17eb0bab316fd012ef2f8fd99ba", + "sha256:8a070ee14a430bd3c9cd16fd142e5c2900749060490698b2b981d6d9dadf5f1f" + ], + "markers": "python_version >= '3.7'", + "version": "==1.29.134" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, "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:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3", + "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a", + "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813", + "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0", + "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a", + "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd", + "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139", + "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b", + "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252", + "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790", + "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045", + "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce", + "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200", + "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718", + "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b", + "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f", + "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5", + "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade", + "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5", + "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a", + "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8", + "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33", + "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e", + "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c", + "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3", + "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969", + "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068", + "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2", + "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771", + "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed", + "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212", + "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614", + "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88", + "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3", + "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c", + "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84", + "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11", + "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1", + "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1", + "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e", + "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1", + "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd", + "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47", + "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a", + "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c", + "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31", + "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5", + "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6", + "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303", + "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5", + "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47" ], "markers": "python_version >= '3.7'", - "version": "==7.2.2" + "version": "==7.2.5" }, "exceptiongroup": { "hashes": [ @@ -311,6 +327,14 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, "mccabe": { "hashes": [ "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", @@ -321,11 +345,11 @@ }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.1" }, "pluggy": { "hashes": [ @@ -353,11 +377,11 @@ }, "pytest": { "hashes": [ - "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", - "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" + "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362", + "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3" ], "index": "pypi", - "version": "==7.2.2" + "version": "==7.3.1" }, "pytest-cov": { "hashes": [ @@ -367,6 +391,30 @@ "index": "pypi", "version": "==4.0.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" + }, + "s3transfer": { + "hashes": [ + "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", + "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.1" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", @@ -374,6 +422,14 @@ ], "markers": "python_version < '3.11'", "version": "==2.0.1" + }, + "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" } } } diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py new file mode 100644 index 00000000..c341b2e8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -0,0 +1,1226 @@ +"""vjsk_file_cheak用テストフィクスチャoverride""" + + +import os + +import boto3 +import pytest + + +@pytest.fixture +def s3_client(): + conn = boto3.client('s3') + yield conn + + +@pytest.fixture +def bucket_name(): + return os.environ["JSKULT_DATA_BUCKET"] + + +@pytest.fixture +def receive_folder(): + return os.environ["JSKULT_DATA_FOLDER_RECV"] + + +@pytest.fixture +def init_check_received_files_ok1(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ok2(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng01(s3_client, bucket_name, receive_folder): + # setup + + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng02(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng03(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng04(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng05(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng06(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng07(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng08(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng09(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng10(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng11(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng12(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng13(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng14(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng15(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py index e9f88d81..44ece095 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -1,6 +1,267 @@ -def test1(): - pass +import pytest + +from src.batch.common.batch_context import BatchContext +from src.batch.vjsk.vjsk_importer import _check_received_files +from src.error.exceptions import BatchOperationException -def test2(): - pass +def test_check_received_files_ok1(init_check_received_files_ok1): + """ + 観点 + 正常系 : 卸在庫データ取込対象日 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + received_s3_files = _check_received_files() + + assert received_s3_files is not None + + +def test_check_received_files_ok2(init_check_received_files_ok2): + """ + 観点 + 正常系 : 卸在庫データ取込対象日以外 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = False + + received_s3_files = _check_received_files() + # with pytest.raises(BatchOperationException): + # received_s3_files = _check_received_files() + + assert received_s3_files is not None + + +def test_check_received_files_ng01(init_check_received_files_ng01): + """ + 観点 + 異常系 : 卸在庫データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸在庫データファイルがありません") > 0 + + +def test_check_received_files_ng02(init_check_received_files_ng02): + """ + 観点 + 異常系 : 卸販売データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸販売データファイルがありません") > 0 + + +def test_check_received_files_ng03(init_check_received_files_ng03): + """ + 観点 + 異常系 : 卸組織変換マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸組織変換マスタファイルがありません") > 0 + + +def test_check_received_files_ng04(init_check_received_files_ng04): + """ + 観点 + 異常系 : 施設統合マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("施設統合マスタファイルがありません") > 0 + + +def test_check_received_files_ng05(init_check_received_files_ng05): + """ + 観点 + 異常系 : 卸マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸マスタファイルがありません") > 0 + + +def test_check_received_files_ng06(init_check_received_files_ng06): + """ + 観点 + 異常系 : 卸ホールディングスマスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸ホールディングスマスタファイルがありません") > 0 + + +def test_check_received_files_ng07(init_check_received_files_ng07): + """異常系 : 施設マスタファイルが欠落""" + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("施設マスタファイルがありません") > 0 + + +def test_check_received_files_ng08(init_check_received_files_ng08): + """ + 観点 + 異常系 : メーカー卸組織展開表ファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("メーカー卸組織展開表ファイルがありません") > 0 + + +def test_check_received_files_ng09(init_check_received_files_ng09): + """異常系 : 取引区分マスタファイルが欠落""" + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("取引区分マスタファイルがありません") > 0 + + +def test_check_received_files_ng10(init_check_received_files_ng10): + """ + 観点 + 異常系 : 製品マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製品マスタファイルがありません") > 0 + + +def test_check_received_files_ng11(init_check_received_files_ng11): + """ + 観点 + 異常系 : 製品価格マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製品価格マスタファイルがありません") > 0 + + +def test_check_received_files_ng12(init_check_received_files_ng12): + """ + 観点 + 異常系 : 卸得意先情報マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("卸得意先情報マスタファイルがありません") > 0 + + +def test_check_received_files_ng13(init_check_received_files_ng13): + """ + 観点 + 異常系 : MDBコード変換マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("MDBコード変換マスタファイルがありません") > 0 + + +def test_check_received_files_ng14(init_check_received_files_ng14): + """ + 観点 + 異常系 : 生物由来データファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("生物由来データファイルがありません") > 0 + + +def test_check_received_files_ng15(init_check_received_files_ng15): + """ + 観点 + 異常系 : 製造ロット番号マスタファイルが欠落 + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("製造ロット番号マスタファイルがありません") > 0 diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py index a03a8638..d2afff68 100644 --- a/ecs/jskult-batch-daily/tests/conftest.py +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -1,11 +1 @@ """共通テストフィクスチャ""" - -import pytest - -from src.db.database import Database - - -@pytest.fixture -def database() -> Database: - """データベース接続モジュールを作成""" - return Database.get_instance() From 34c260d96fc371dfbf9d95d258b640c5b9808c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 17 May 2023 11:44:32 +0900 Subject: [PATCH 290/962] =?UTF-8?q?=E7=89=A9=E7=90=86=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com_cop_hp/test_com_cop_hp_mapper.py | 6 ++- .../expect_com_dr_trt_course_update.csv | 11 ++++-- .../table_mapper/com_dr/test_com_dr_mapper.py | 4 ++ .../test_com_dr_sosiety_mapper.py | 8 ++-- .../com_inst/db_com_trt_before_update.csv | 6 +-- .../com_inst/expect_com_trt_update.csv | 37 +++++++++++++++++++ .../com_inst/test_com_inst_mapper.py | 4 ++ .../com_inst_att/test_com_inst_att_mapper.py | 6 ++- .../test_com_prefc_med_base_mapper.py | 6 ++- .../test_com_prefc_med_dis_treat_mapper.py | 6 ++- .../test_com_prefc_med_equpment_mapper.py | 6 ++- .../test_com_prefc_med_sojourn_ope_mapper.py | 6 ++- .../test_com_prefc_med_sp_outpat_mapper.py | 6 ++- .../com_sp_field/com_sp_field_delete.csv | 11 +++--- .../db_com_sp_field_before_delete.csv | 8 ++-- .../expect_com_sp_field_delete.csv | 4 -- .../com_sp_field/test_com_sp_field_mapper.py | 6 ++- 17 files changed, 102 insertions(+), 39 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py index 29b840e2..553c4261 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_cop_hp/test_com_cop_hp_mapper.py @@ -173,10 +173,10 @@ class TestComCopHpMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_臨床研修病院テーブルのレコードを1件論理削除する + COM_臨床研修病院テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -213,6 +213,8 @@ class TestComCopHpMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_cop_hp_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_cop_hp')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_cophp_cd = [{'cophp_cd': columns['cophp_cd']} for columns in expect_data_list] primary_keys_openyear = [{'openyear': columns['openyear']} for columns in expect_data_list] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv index fa2ab558..6141d0cc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_trt_course_update.csv @@ -1,14 +1,19 @@ "trt_course_cd","dcf_pcf_dr_cd","sequence","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"A01","0199578300","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" "A01","0199768200","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" -"A01","9999999900","1","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" -"A03","9999999900","3","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" -"A05","9999999900","5","20141125","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A01","9999999900","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" "A01","9999999999","4","20141125","NULL","NULL","NULL","NULL","NULL","2014/12/03 16:26:05","PKG_03_1_F1101_011","2014/12/03 16:26:05","PKG_03_1_F1101_011" +"A03","9999999900","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" +"A05","9999999900","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 16:26:05","com_dr_mapper","2023/04/12 16:26:05","com_dr_mapper" "A26","0122222233","1","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" "A58","0199768200","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" +"C04","0199578300","4","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" "C27","0122222233","2","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"E02","0199578300","3","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" "I28","0122222233","3","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" "K29","0122222233","4","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" +"L01","0199578300","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" +"L03","0199578300","5","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","com_dr_mapper","2017/10/08 20:57:12","com_dr_mapper" "L30","0122222233","5","20230427","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_dr_mapper","2023/04/12 00:00:00","com_dr_mapper" "U91","0199790600","1","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" "U92","0199790600","2","20230427","NULL","NULL","NULL","NULL","NULL","2017/10/09 18:06:51","com_dr_mapper","2017/10/09 18:06:51","com_dr_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py index 5d45b49b..528a8ef1 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/test_com_dr_mapper.py @@ -107,6 +107,8 @@ class TestComDrMapper: # 期待値ファイルを読み込む(医師診察科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_insert.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] actual_data_list = [] @@ -218,6 +220,8 @@ class TestComDrMapper: # 期待値ファイルを読み込む(医師診察科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_trt_course_update.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py index d577cfa1..4e8dbad8 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr_sosiety/test_com_dr_sosiety_mapper.py @@ -169,10 +169,10 @@ class TestComDrSosietyMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_所属学会テーブルのレコードを1件論理削除する + COM_所属学会テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -209,6 +209,8 @@ class TestComDrSosietyMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_sosiety_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_dr_sosiety')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] primary_keys_sosiety_cd = [{'sosiety_cd': columns['sosiety_cd']} for columns in expect_data_list] actual_data_list = [] @@ -219,7 +221,7 @@ class TestComDrSosietyMapper: AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd \ - """ + """ for param_dcf_pcf_dr_cd, param_sosiety_cd in zip(primary_keys_sosiety_cd, primary_keys_dcf_pcf_dr_cd): dr_sosiety_data = self.db.execute_select( dr_sosiety_select_sql, diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv index 46080fbc..0873cb36 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/db_com_trt_before_update.csv @@ -9,6 +9,9 @@ "009900146","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" "009900194","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" "009900194","O02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-01-31 11:38:26","clsComInstInfo" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" "009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" "009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" "009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" @@ -43,6 +46,3 @@ "009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" "009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" "009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" -"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" -"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" -"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv index 8d4e9a35..9adf2bb7 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_trt_update.csv @@ -3,6 +3,43 @@ "009900194","U18","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" "009900194","U21","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" "009900194","U23","20220201","NULL","NULL","NULL","NULL","NULL","2023/05/01 14:52:43","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" +"009904439","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A12","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A34","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","A41","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A56","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A58","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A61","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A65","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","A81","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","B04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B11","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B22","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","B31","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","C01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C04","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","C05","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","D02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","E02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","F08","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","G06","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","H02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009904439","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","J01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","K01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","M01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","N03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","O01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P02","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-01-31 11:38:27","clsComInstInfo" +"009904439","P03","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","A57","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" +"009929798","I01","20220131","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-01-31 11:38:28","clsComInstInfo" "223333344","100","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","101","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333344","102","20230427","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 4c4058d8..2643f734 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -112,6 +112,8 @@ class TestComInstMapper: # 期待値ファイルを読み込む(施設診療科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_insert.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] actual_data_list = [] @@ -263,6 +265,8 @@ class TestComInstMapper: # 期待値ファイルを読み込む(施設診療科目) expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_trt_update.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_trt_course')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_trt_course_cd = [{'trt_course_cd': columns['trt_course_cd']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py index 0721905d..ac83cbcf 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst_att/test_com_inst_att_mapper.py @@ -167,10 +167,10 @@ class TestComInstAttMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_施設属性テーブルのレコードを1件論理削除する + COM_施設属性テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -207,6 +207,8 @@ class TestComInstAttMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_inst_att_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_inst_att')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] actual_select_sql = f"SELECT * FROM src05.com_inst_att WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py index ab6fca06..84905c02 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_base/test_com_prefc_med_base_mapper.py @@ -138,10 +138,10 @@ class TestComPrefcMedBaseMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_都道府県医療機能情報(基本)テーブルのレコードを1件論理削除する + COM_都道府県医療機能情報(基本)テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -178,6 +178,8 @@ class TestComPrefcMedBaseMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_base_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_base')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys = [f"'{primary_key['dcf_dsf_inst_cd']}'" for primary_key in expect_data_list] actual_select_sql = f"SELECT * FROM src05.com_prefc_med_base WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py index a0597df9..003b87b1 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_dis_treat/test_com_prefc_med_dis_treat_mapper.py @@ -175,10 +175,10 @@ class TestComPrefcMedDisTreatMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_都道府県医療機能情報(疾患治療)テーブルのレコードを1件論理削除する + COM_都道府県医療機能情報(疾患治療)テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -215,6 +215,8 @@ class TestComPrefcMedDisTreatMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_dis_treat_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_dis_treat')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_treatment_code = [{'treatment_code': columns['treatment_code']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py index 78d33244..5372b7cd 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_equpment/test_com_prefc_med_equpment_mapper.py @@ -174,10 +174,10 @@ class TestComPrefcMedEqupmentMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_都道府県医療機能情報(施設設備)テーブルのレコードを1件論理削除する + COM_都道府県医療機能情報(施設設備)テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -214,6 +214,8 @@ class TestComPrefcMedEqupmentMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_equpment_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_equpment')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_equipment_code = [{'equipment_code': columns['equipment_code']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py index ad87a43a..f08193a6 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sojourn_ope/test_com_prefc_med_sojourn_ope_mapper.py @@ -166,10 +166,10 @@ class TestComPrefcMedSojournOpeMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_都道府県医療機能情報(短期滞在手術)テーブルのレコードを1件論理削除する + COM_都道府県医療機能情報(短期滞在手術)テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -206,6 +206,8 @@ class TestComPrefcMedSojournOpeMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sojourn_ope_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_sojourn_ope')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_cos_surgery_code = [{'cos_surgery_code': columns['cos_surgery_code']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py index 04932cf8..54d034a3 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_prefc_med_sp_outpat/test_com_prefc_med_sp_outpat_mapper.py @@ -166,10 +166,10 @@ class TestComPrefcMedSpOutpatMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_都道府県医療機能情報(専門外来)テーブルのレコードを1件論理削除する + COM_都道府県医療機能情報(専門外来)テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -206,6 +206,8 @@ class TestComPrefcMedSpOutpatMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_prefc_med_sp_outpat_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_prefc_med_sp_outpat')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list] primary_keys_specialclinic_name = [{'specialclinic_name': columns['specialclinic_name']} for columns in expect_data_list] actual_data_list = [] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv index 350bb655..11bd1155 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/com_sp_field_delete.csv @@ -1,6 +1,5 @@ -"511","01","994301","00","B","0003","1","20161113","20161114","1","20170401","@","","","" -"511","01","995783","00","C","0003","2","20161113","20161114","1","20170221","1","20140810","","" -"511","01","997906","00","B","0032","2","","","","","","","","" -"511","01","997906","99","B","0032","2","","","","","","","","" -"511","01","994301","99","B","0003","1","","","","","","","","" -"511","01","995783","99","C","0003","","","","","","","","","" +"511","01","994301","00","B","0003","1","20141211","20141213","","","","","","" +"511","01","995783","00","B","0003","1","20141211","20141213","","","","","","" +"511","01","997682","00","B","0004","1","20141211","20141213","","","","","","" +"511","01","997906","00","B","0032","1","20141211","20141213","","","","","","" +"511","01","999613","00","B","0056","1","20141211","20141213","","","","","","" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv index e88fa5e0..2329287f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv @@ -1,7 +1,7 @@ "dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0199430100","0003","2","1","20170401","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" -"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199430100","0003","2","1","20170401","NULL","NULL","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" -"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" -"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199790600","0032","2","NULL","NULL","","","NULL","NULL","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" +"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" "0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv index 20feb37e..eab607dc 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv @@ -1,6 +1,2 @@ "dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" -"0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" -"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" -"0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py index 44798884..bc9eda78 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py @@ -165,10 +165,10 @@ class TestComSpFieldMapper: else: assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること' - def test_logical_delete(self): + def test_physical_delete(self): """ Cases: - COM_専門分野テーブルのレコードを1件論理削除する + COM_専門分野テーブルのレコードを1件物理削除する Arranges: - CSVデータを用意し、読み込む - 削除対象となるレコードを登録する @@ -205,6 +205,8 @@ class TestComSpFieldMapper: # Assert # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_delete.csv')) + actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_sp_field')[0]['count_num'] + assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] actual_data_list = [] From 4af4a6ca60c99c983e35c39c69a67ba1084ab0ac Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 17 May 2023 11:46:15 +0900 Subject: [PATCH 291/962] =?UTF-8?q?=E3=83=A1=E3=83=A2=E6=9B=B8=E3=81=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/batch/vjsk/vjsk_file_check/conftest.py | 1 + .../tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index c341b2e8..cfab500f 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -23,6 +23,7 @@ def receive_folder(): return os.environ["JSKULT_DATA_FOLDER_RECV"] +# TODO 共通fixtureにして15個固定でput/delete、各個別fixtureで15個から引き算でdeleteする @pytest.fixture def init_check_received_files_ok1(s3_client, bucket_name, receive_folder): # setup diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py index 44ece095..43062be1 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -19,6 +19,10 @@ def test_check_received_files_ok1(init_check_received_files_ok1): assert received_s3_files is not None + # target_path = path.dirname(__file__) + # target_file = "xxxxxxxxxxxx000000000000.gz" + # s3_client.upload_file() + def test_check_received_files_ok2(init_check_received_files_ok2): """ From 7a7d5597407b24d946be9183dce687311963ef67 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 17 May 2023 12:03:51 +0900 Subject: [PATCH 292/962] =?UTF-8?q?=E9=96=93=E9=81=95=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E6=B6=88=E3=81=97=E3=81=A6=E3=81=9F=E3=81=AE=E3=81=A7=E6=88=BB?= =?UTF-8?q?=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/tests/conftest.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/conftest.py b/ecs/jskult-batch-daily/tests/conftest.py index d2afff68..a03a8638 100644 --- a/ecs/jskult-batch-daily/tests/conftest.py +++ b/ecs/jskult-batch-daily/tests/conftest.py @@ -1 +1,11 @@ """共通テストフィクスチャ""" + +import pytest + +from src.db.database import Database + + +@pytest.fixture +def database() -> Database: + """データベース接続モジュールを作成""" + return Database.get_instance() From 052e6c5408b83544919a6f45a58447ad66e614e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 17 May 2023 13:45:00 +0900 Subject: [PATCH 293/962] =?UTF-8?q?=E3=80=8Cmake=5Fupsert=5Fquery=E3=80=8D?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 8be2741b..54ff1ca2 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -138,27 +138,29 @@ class ComPharmMapper(UltmarcTableMapper): self.queries.append(self.LOGICAL_DELETE_QUERY) return + # 追加、更新の場合 + self.queries.append(self.__make_upsert_query()) + return + + def __make_upsert_query(self): # レコードの存在確認 record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter) # 存在しない場合はInsert if record_count[0]['count_num'] == 0: - self.queries.append(self.INSERT_QUERY) - return + return self.INSERT_QUERY # 更新の場合 update_columns = ','.join(self.__make_update_query()) # 何も更新項目が無い場合はNoneとする(更新処理は行わない) if len(update_columns) == 0: - self.queries.append(None) - return + return None else: # 末尾にカンマを付けてSET句を完成させる update_columns += ',' update_query = self.UPDATE_QUERY.format( update_columns=update_columns ) - self.queries.append(update_query) - return + return update_query def __make_update_query(self): set_clauses = [] # 設定項目 From c1c9fd68b53178b31a52bc56adf0d807925ea1e6 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 17 May 2023 19:24:45 +0900 Subject: [PATCH 294/962] =?UTF-8?q?load=E5=87=A6=E7=90=86=E3=81=AE?= =?UTF-8?q?=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83=E3=82=B8=E7=A2=BA=E8=AA=8D?= =?UTF-8?q?=E5=88=86=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_file_check/conftest.py | 2 +- .../tests/batch/vjsk/vjsk_load/conftest.py | 41 +++++ .../batch/vjsk/vjsk_load/test_vjsk_load.py | 146 +++++++++++++++++- .../testdata/bio_slip_data_202304270000.gz | Bin 0 -> 2868 bytes .../batch/vjsk/vjsk_load/testdata/dummy.gz | Bin 0 -> 107 bytes .../testdata/fcl_mst_202304270000.gz | Bin 0 -> 2009 bytes .../testdata/hld_mst_202304270000.gz | Bin 0 -> 500 bytes .../testdata/lot_num_mst_202304270000.gz | Bin 0 -> 303 bytes .../testdata/mdb_conv_mst_202304270000.gz | Bin 0 -> 426 bytes .../testdata/mkr_org_horizon_202304270000.gz | Bin 0 -> 729 bytes .../testdata/org_cnv_mst_202304270000.gz | Bin 0 -> 402 bytes .../testdata/phm_prd_mst_202304270000.gz | Bin 0 -> 1134 bytes .../testdata/phm_price_mst_202304270000.gz | Bin 0 -> 413 bytes .../testdata/slip_data_202304270000.gz | Bin 0 -> 3134 bytes .../testdata/stock_slip_data_202304270000.gz | Bin 0 -> 899 bytes .../testdata/tran_kbn_mst_202304270000.gz | Bin 0 -> 419 bytes .../testdata/vop_hco_merge_202304270000.gz | Bin 0 -> 286 bytes .../testdata/whs_customer_mst_202304270000.gz | Bin 0 -> 1307 bytes .../testdata/whs_mst_202304270000.gz | Bin 0 -> 499 bytes 19 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/dummy.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index cfab500f..0778241d 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -1,4 +1,4 @@ -"""vjsk_file_cheak用テストフィクスチャoverride""" +"""vjsk_file_check用テストフィクスチャoverride""" import os diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py new file mode 100644 index 00000000..ea29eb63 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py @@ -0,0 +1,41 @@ +"""vjsk_load用テストフィクスチャoverride""" +import os + +import boto3 +import pytest + +from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper + + +@pytest.fixture +def s3_client(): + conn = boto3.client('s3') + yield conn + + +@pytest.fixture +def bucket_name(): + return os.environ["JSKULT_DATA_BUCKET"] + + +@pytest.fixture +def receive_folder(): + return os.environ["JSKULT_DATA_FOLDER_RECV"] + + +@pytest.fixture +def mapper(): + return VjskReceiveFileMapper() + +# @pytest.fixture +# def init_Load_ok(s3_client, bucket_name, receive_folder): +# # setup + +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') +# s3_client.put_object(Bucket=bucket_name, +# Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + +# # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index e9f88d81..43afd62c 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -1,6 +1,144 @@ -def test1(): - pass +from os import path + +import pytest + +from src.batch.common.batch_context import BatchContext +# from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager +from src.batch.vjsk.vjsk_importer import (_check_received_files, + _import_file_to_db) +from src.db.database import Database -def test2(): - pass +class TestImportFileToDb: + db: Database + batch_context: BatchContext + test_file_path: str + + @pytest.fixture(autouse=True, scope='function') + def pre_test(self, database: Database): + """テスト実行前後処理""" + # setup + self.test_file_path = path.join(path.dirname(__file__), "testdata") + + self.batch_context = BatchContext.get_instance() + + self.db = database + self.db.connect() + # self.db.begin() + + # testing + yield + + # teardown + # self.db.rollback() + self.db.disconnect() + + def test_import_file_to_db_ok(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 正常系 : すべての受領データをデータベースに登録できる + 期待値 + 例外が発生しない + """ + # setup + self.batch_context.is_vjsk_stock_import_day = True + + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz", + "dummy.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_SLIP_DATA)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_HLD_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_FCL_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA)}") + # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST)}") + + # assertion + received_s3_files = _check_received_files() + _import_file_to_db(received_s3_files) + + # self.db.connect() + + # # 検証 (卸在庫データファイル) + # table_name_org = mapper.get_org_table(mapper.CONDKEY_STOCK_SLIP_DATA) + # table_name_src = mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA) + # result = self.db.execute(f"select * from {table_name_org}") + # assert result.rowcount == 10 + # result = self.db.execute(f"select * from {table_name_src}") + # assert result.rowcount == 10 + + # # 検証 (卸販売データ) + # table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) + # table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) + # result = self.db.execute(f"select * from {table_name_org}") + # assert result.rowcount == 10 + # result = self.db.execute(f"select * from {table_name_src}") + # assert result.rowcount == 10 + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + # def test_load_stock_slip_data_ok(self, mapper): + # table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) + # table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) + + # # setup + # self.batch_context.is_vjsk_stock_import_day = True + # self.db.execute(f"truncate table {table_name_src}") + + # # assertion (insert) + # target_dict = { + # "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + # "src_file_path": path.join(self.test_file_path, "stock_slip_data_202304280000.tsv") + # } + # VjskDataLoadManager.load(target_dict) + + # result = self.db.execute(f"select * from {table_name_org}") + # assert result.rowcount == 4 + # result = self.db.execute(f"select * from {table_name_src}") + # assert result.rowcount == 4 + + # # assertion (update) + # target_dict = { + # "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + # "src_file_path": path.join(self.test_file_path, "stock_slip_data_202304290000.tsv") + # } + # VjskDataLoadManager.load(target_dict) + + # result_org = self.db.execute(f"select * from {table_name_org}") + # assert result_org.rowcount == 4 + # result_src1 = self.db.execute(f"select * from {table_name_src}") + # assert result_src1.rowcount == 6 + + # # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..36d1af4593f1b83a34e64c586b11a47eb6cae724 GIT binary patch literal 2868 zcmV-43(NE$iwFn=tX*UT0AguxUvq3}a9?C$bYWjIFfubRG%`0ZFfcGKbYXG;?VDLs z6G0GwebryF<(m(&X7*m+#H+k5Ewy|~q2di%Nxa@9@iv~Ih=TVm9z?}RlJ&nBHZf28 z7wqZTD+z?GiGa!!gr44+*-dxPx4pB&?t@38@goP1MfY|lI-?>HB_fL&fwD9aKe3=K zg-}8?OCsrf6Z5~T~MEQ_iv6DotAilAE{kOebPj>i+7u?1vC&NT;%o%_Bx*0l%S zzjz^vClADVf#)o?YF0qbFmB zYcz3Bb3E3$KiYFNI9yM+Q|sx8A6~uZNVOum4>X;7_r@IEk)w%d&+%^RR6Dy9wEBqX z9}%ZKB01veZuVW`okzO(4B69}fI7~YeFs6=)9qHf_a~g|K6;W31`_*r&Inznn2}lE z6KEA~BiBBBm@3nrV3yvDHUCg`yTd(hJFgLMz|6u`U>i?>V_e`JU9&|`K*e{PZ}9^O z?whVy%<BKAy{=R?U&@m0WSf|bIu6@yfwVaENbsh6O?Q48*`^q|x zvy0nzWIy#q(HA9Olzmb0Mb#HIU(|ik2%LfhWEzmgfGh=MIUp+mSq;cqK-L3t;JhL` z@8LtIk3uA|kU1RRwEJ+C2fFqI=2$%8`r}|v93svUj>lt*7cE{XE25zikTbZC=ICVcYDr3twzA1v2|Ad=&}V zxJIBmgvp9s_-+?I*@bcF%>?rnbV4~}7shOJ&^FK8<~0}$+F;8u9QX>JEom3B&iM;@ z!8XsZ!-X82RL~Sj2vs_k@92O#l3OLL)DA(gOsxd7f+gXTF!$Hk6Ewa_q2gK)n_}#s zolzj3=vW=3)(i~;v|?-M-d=OVfUd=T4L3Rn^^Lie8yxb?h6AjF-yQ3=t&eo9-5gyP z-MDJ&iuFGz7suZWZ^)xe)z3ey{{zy20q~Woz z!`A0(*42Sh{|9S)05muXFKliXlTV7Nx5d=$VrrzAN)?k|N{`-H`Rfz;d*x?lZJekY zT!3Q0A1c8$DtMJvI#(V{mOkB{7$1i|*8Qi&-o9e*`C{*tVzLhgDxNu08hBnB8mU~# zm)}1w51gwEK7o$R+2&ol@E#-J8oD{pBZ>)y5pb(p^@9LDp`*|sK=_C_`Y`*tlthTG zh(h`K1MB%kFiCkR?HDGTbcFOczqrbodv^ZjkBhhL{4M;v8Jr$dg}zYw^ve2p*1Gge z5Wu?K`yuq#F5ke-P5B>*8I%1wArbr`ZT{sUQ#HIOMTi_B5?tRhSzLybJbpT!=<2S* z?i$L9q-mg$iD*bfl>^w7B#|ls?6OGJoM~*Hi?E4X_-vbL=7_==Gmd#1e1YbA2Ms#7Q3~nXgwpWn#P~=hRp3Sf zLQmu_1Fh|R9|tpj!cTwotnp`rUHItD388%N{Y3T(aN3&=f&dd@?RJ4~S+%K()Z$-3 z>K#A_5q^kDWC%FTFqB||tb#GrYEnyb2v`_oYFO}_Z!acmxrpn=0=oA$4;6Q`H1l@h z3(wAA*lJB)K<$ui4j?GZKK$v$o9uPqgBDQ)ZM86cS+m+$5g;?pG14NZgBE5Q-^ft$ zY}%01jvvBtx}oV|sNc6fbpBHgfT3L<_!{np*`u_Ml&0Y*y~C%pY%sa};<}Z2Tpk&j z$e#IqM7zP`=h3<@$q-;LqsioXbmi^cO7aEIp!r2uqod_(SDK@AZ3gYN@iOT8$$1G5 zPl{!o0+QG**fGXXnhTIYmj+({yz~M1Tplzly?v!GLoTB4;Ag*`za5+~p%875NfAxS zU%}{g9gH9nG2olSD7pqK89t*GQBrl|&t=o#x}^JDbk*WqW%DjUIlOmAT!!-*6hz#7qXLUeemqe?8qf*p#%lZ%e?ljY@uZk@7kz#=7z+X(`%oVtsQik!&Ejf>5`oZGCtt0o zjOWVz4}rDT^=GBb6Uc(?{D8Mq(e6Z;{soX-5BV89Ov59Cs2ZvQ?o>1?2O+Czps9i^ zB_U?M)Ho6DLqA`_J81#s{+em;H1!^U&f(1e21D~F^q2#tUhRe_s?Vf)jV^)XjTJ+{uhtz5WTJ~LA8 zABQWm-Va&V9^&FfpPj#33vWt7!CRU1KYz2_Re|D)Auk0_#OC=$|JH}oLAbzK*OTkO~&aGCSU z312NFUBC2t@1ERA`;|_$2Ml47<*%u{*AYmB;o!ajJk4->_TRMIE`@jg8^mC|OxmLURiX!L zs!a#$XLl-h`rH-no1D}&69#V}AN}c2_`s(_a6cZMVn3ezZ!)^|ZP1~~FmqUNw&~6^ zou}Ox&Hd1pjnSd4Khs=xd@zT&EF+h-c`nZZF1NTz`fq?TrJBNahRLF+QMRo^(Ihzt zWtlB{{E@^N1Hs*Bo92E+c^G?UptHLjeiTo0!{4`CzfTtrpW^|-b|AR_LNO-D5gLJ4 z&^T6>p9zNJk8U*s1^c10AFc-d{}8_4PTsmY!Dbs2+KBKff1rlDBxHh(UTb55-GZ;6 z`&@AsT#DndIRtzKfv<-FJ_{0mONn8CJdwW)dyHGyPr`%D=R8E0LNyisUl<_4PX6vi z>Ct0{^Y;std-pl{Vdq@=`6cVwOK1StZ*Zu5ezf%Et9K)Cmrp)`r|a(p-2LdDp3ewGX9H`Nnka<;OX0$$w)$i zmRc_C3X|KNp1$Y4Z*#iuLgr#Nmk~_p%n&xiIF`#^J@6X`zfPR+50Z1AV6sA3U7Baxyb;353*1E^{ge zvVY)|BKj^|%Jw(ufs1&YAIQ*m_DrrtM2i>C52`cIWzT0W4_@laoIg2$>FJBP%!yN{ z28op0quJ$4*_?Xg^5E$f)jYcIZ0@?EHCPdoMnQbx4)E!~sJ%&F)PRk_sGzQ#PlKAYr z84gD7Hl{1}l@EgTY!5qjg2@bY1GHLRAxsvB0<<zumqcx)14z&jj)QBH4J; z#C{XZQa>)a1Z^m+mQx*Za?R325(r3LK4Lr(-GYRb?x>h!387nt<`cV~!`56uOk$=*>i4)^c~! z+7`XKhPSzC>l)XL;|ZkFy3!?Lz@U?uG5uNC%uXA^Ff4A<;exX+u4X%?p~Jb-yw^@JdP+m5%qnEvo8LY)40G_DVr%9r7wd>ik0mM1B4}a@_W-uaGX1 zaU$~jGLCE2^Bfq_b|)L0B9rj_cu17eP2nWnIWN#}?z zrQAvD4ikoD8j1EyFjKTE9cdNGwY{JRPu<47kziw~zO?D*S5;+ijIN;jsFhcO#nr~l z@Xp)|oS?F%s>?r9*0->krsFD9)K1E~Bh4z0O{#k$y{^!4U+CyjY>k3pO(oWLa4M5R zp18j6|G?A{1-Px&!<{v*Gb^Pu1S=}WWhyE?pRO8i?;MHxkHZuM{jw8VZ_nty) z@Rs_*Bxq`CCZaSKHwnXWztw8#BNv`mv7d@|P0G1<2Tz+hnw?-T6)bCC5(TD7AeeT+ z!el5L+;JQ_N+@3t9SsMo3ESp^8T&U}eSTzTZX#;3zRFIj_`)yVj$4%WMKZ(#3YSe4 z(XBSB73p)KHwAm`Ze6pfo?t33Tih|3VS~jt zwaSC2)=eg=-0WVRkDGJ~CCg0`_zQj342?VZBv^N9dSVcud*Wca4uf(l>U&t4?AO`) zmSOA2^p4T1+JfiK>@qdb1=T&1-VtqXz5Ki}^gb@Hk!)Ke_kHR+pQt_KM<$@{&P;zZ^I9OcXDc(a}jg^dNe2t-Sd))?QER~#t z^RB9)8s81IL{J}tP}K!~py??8#}gQ(Ib^uSP(in&#p3<}GYkEI&P?Xe;aoU-H3j%* z4Yw^DotxG3e>OjV>H137ny)Hcf7cajg03|a?HOVhzg;(`yqaZc7#_5I5qh6Rt-V9EBfG!0A-x rV_=~7kBu3Qa2$CRQuUtcZHeQ+|M7qPAOFYyksRLv3aT>602}}ShH~>@ literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..efedd921426c1148d8eee36540901f014c0e1cc0 GIT binary patch literal 500 zcmVgiwFoqtX*UT0BCGvUu|=AUotQjGz?i?+QbkJ`-ZXd z>#rprSO=G}7|B#%zyv7fpmUnadGL<`1i(2DV4dANMU(`HQXEo35azlcQQdw5!5%V` z>G?E(y?oaJ=KJHTH5bKG(2H9~EjjCoWUL3tNWTpevAWAax*in2RVw0C5Bo{H9>j7Y z#_?2-rv09fsT9L*qCZ_Ea@{bStU8ZdNdMVL7m91ScvJa}%0E^9sPZe7-KqRVWzQ;m zUtTW&wTmW|J*fOiWv_p=s{B@E_qy9`SuQP}=QbeyIzjjh;0(5_D=F3wE(!FN@i-Tw1kYs|D9uu+@UMEX2h^yewwRa%t5~i))t0k zbluRpHblo@1cSj`;N`iz1`!M>{k+=TY;a7+R#Iw; zgo<#8YK>}*dd0ZZ={XGFZsXl!PQw|Ep{i7)CJkZMSZYc&I-{vsm1?StreRyEG2>hf z`qHEVF5VlP(WJXqs;M&?29;`>Ni!cfBUKb?2pJ8d{#hdy78Vx%8=o133Tprg001U# Bhw1c3*9CbYC(sGBYqVGB+?VFfcB3VR8WNl3Pl{ zP!NXms;ek@ugvXSH*>I!V6Ycy(t>OA!6mr`=k%_&L5dWS{BX$3obb(0@=vQ#8qa5| zG;P{MKny|-RCjH&DtRGcH zFQ2Pi+?Lh>QE(mrF_^$;^cM91u%HG_a;=AQ2rS^Pr6KST!T>oM8!?=kZTSq~5s|DB zZz%)Te8r;>9Qf*C&Ce`!Lxdr^0lEk_8v4YSsAHCMeBALR1oxc}Cs=%Hw&!D}i5K+N z?ESMP(zO@*=P2PEAGdtA;^7DWGpm!&4A!v|@`m^Rl`XpE68|O=L^kL6xZ^w4m%98P zSlxWj&Kgp_Kgv(g|IQcXN5knOyK{Wp@{w(jPX7m1Ctn~~1S5jhANxlExy(OtBr0!< UUcGwt>h*v10l?2|!vG8b0P#W2IRF3v literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..835d236007b3aa749ac63f3d9bf9ef9681cf26f4 GIT binary patch literal 729 zcmV;~0w(<*iwFoetX*UT0Bvh>UvF|}UubV~X?kyNUotQZe$^pE)mmp?sM}$KnVXEROs?X=IDIxoL(NmN2(5<-?TI z!WCb^b9yWsb-v(unaO!>`q2KMrRRT6yPV8e>CAm=DV<3?Os6aa5C$qT0IfS&JEx4H z00h7=3?6Zm(GBc!u>uh(d@sL;^%2#395SVgX_isv%T4R0XJtPz#~Pp(a30 zgn9^d4s`+QA~Zs1aA*k75MeZgQ4XU5jEc|yxa*dp9_g+-`mru#7JyP82Up|w3rW^rYM$khO zsDMpSlNLl6epAq#2kJb8a}dTbh-oI%IM|2gpb^th3`f7q2*fPNq_EQ~zwve(e(9vs zu69q?#jyNz#n5CEuXkAPIiE?T=pVKGdev_}_RmYwPQ^|t4x=s^NN4FeI3j!dVrV5C zE1cA5(|0g7+D_GVp1ApaH-GFp$G@HVC^#`)D7@w;H-GNt+pgod&T~>|`7iU5&y-Ip zCL=EjELHqT=GSVSi-H(w$!E$Zl@X}2p2m^B#PERl&4#y8`{f&iKH!63N%c?asv!+q z6N76E>8MW!XyQQvz0yZ=u_MXVSpi`OdoO!-a82xLD=wl_)ffHXGf>#BIIlFyWnH6w~FS+Zow`p@bs LCB`z%03HAUu3ciK literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..89eb4a65c860810433383f7aec3b85d0c884d501 GIT binary patch literal 402 zcmV;D0d4*tiwFoatX*UT0B>?dERpN z)P{Uvvrac}r@UmG0`ehrT#lHq&;DD+|)V}rP=_b5cfu>xDx9z#)G578HhAG>6CTS3_-?8Dub{HI%;&W w>2V-6a75>DBy1Ukzd@%u681Qd890*Xa6}BMMvWRZYScya39mPJQ~(SB0D^V7aR2}S literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..169f6761a19b359dec7013fb730d8675dbeffc6d GIT binary patch literal 1134 zcmV-!1d;n6iwFoWtX*UT0B~q+UvP3{Uu|=AUotQh=`FRcs%&hsNhW@l)oQPXAgYlLGNlrcs@iT`*I#^IGXJRJ}2$Kh4-`Sgts zCvFpB($+r0>9+iOFoNGkgBjGyqf69(69o^W;C$4-69rGv14B$;t-lq|=fGz+_x zNs&3!kp@g8&zYTOEKRe7Svk|l35Gf+O`SAz2xB<`I&*}{u>V_3HWgEt%mpxU$d}2O z64UEAycUPY;=ytpUWy0L02%po`O*8Ar#?Qt8;57&@H+A%;8xmBSglae;F#l3i)Q80 zpGCpRD0mwM52F5EV2}g=`7)y9a?!(RavM&l3?@QPAY}+q#+FPOa?m-mF`@}ZbBd@86~%N!HFWI!)FTBeGolG+Af5R@cu<7JR=Z3(@{CSqH)VLd~+7WV17B zmgVTM3oy=19TzwPx};y;i3e{1F@bzPEFaZfQxT;*O8G6CsjzL`IC0q{5HA2O`hruk zrh0W_ert)8NxodmNIj98U$;+VW(;(c43)t!n+bZdtVUBQ;KM}Oe0|hfsE=~^ENj2y zLvtw(gLnY7ctRHGxp9cLi3rCCGMiIN=8}9i9wc4wtgO%*HQPkPLVa7QQmvPXyoERS z9T&8({TQ2k_qLfp!-z?0Y#wCUg@_5pvO{7gvE~NLdRq@(%FTUIa=ZF{Zq|s~IaoFB z>HcyQ+?NENf~(|IE7XhCV!cqPB;3TeT+q7s=b3iiwFoRtX*UT0B~q+UvP41V`X1$b97%aFfubRG%`0ZFfcGKbYXG;?NUo_ zgD?!L^M6*`8bK@_B* zlY&Xn#E4dqm1;_bx-Np$S;eqs*f0zfgug1|j?zLtRU50&(966PnzUl9)Yn*{p_O?j z^gky>=yOShn-wCHx1}Pr1(>$-SA{y2T&qmqJC&0P4ZX?oGx?QjMS`%xKSipuwcQ01)Yh`hg%2vrqg;^Ye0hc6`RdwR662!sl!G)6P8dwQAq`t|oszZoYkcV3CLwIo|&x~3bNsXH2MuO<_H zO*PvzrfH7jG-kMxG#@4xb zdutzefpaf$GxqJ*iCAk}D3Q2&u{fhQeo1At0)nAbZ+Ev!CF3nUv960fnCy#vooMU% zs=F=rZM>@_CjmKBt)L5 zh_|=LI+N|;ld%ps+tSt+FU`Bsn@E=CCEG8Htc&d(c)_vnyW2upd!jw8y zT&}A}mJ13|0e-WT1$P`6RK7zZDM5?%K|+kPuw*NIywJem`k0RpCWFD^*+mIaqYXx# z@U+2Q>Ly= zLz$*BEoIuubd>2TGaBkb3)w7W>ml0+*=ESLLbe^UosjK@>`=ct@3-rl?|T6b?oC~Z z4=;8V0oUHjlfsu1NeN?TPXe4#7*`YVb1$EJ6Bt|L{}{6wJ8wp4)0k^Gh7k#Epeu&P z48zu~C}T|H>4+J%4NK!T-*osHaEdlthjislH0fuTn*H2}pL^)%Qhsj0&#wE~te@-m zb3ggnWk0*==O+B@-+p!t8olriR+5&kUHITj_JyCj;b${YA6vN=s=NYw+4^0~dG6;P z@Fs*}xt42{RL3sIpcu46wG0D_;K>I%mV5}AkwZ5C8Bm2i?j*YEqyU%_0g7NV^eO@y z8wpGSJ+BNKwkz=lQ$mi3S^x{p90yydcDm3)2dCGvxOA`tqzI=tFNZ_dIri_t?~C_7 zeLwbI?7~~0yzxFgdeJFa3>%<4JsKL#z+^D{Oco5g_vHD``VHwYaHM%*%9>{DDENx#~F7-9rfsW0nVOoxDM@`-3 z*ToUc&iUC@9LF@c3t>vWLO_;*p24#@s3Jzcg1cnrOWh^A5V#9;3>V8U`M2@H>~Mbh zr=3iO?$R5ZDoi}uyZ`HUDn&Uv>+{~sLSb?cGHIZi;m%paOHbxk*7o}Eh>Gh2`RTdB zM8@B|1AqSx-S#(cho>0L4nMo7=12A!&5uZa`Kh;f-5Z|4$;;Q(gs)d7d^b$^y6L(N!ml~u^X3TbV#1e@HwgbEEuRkI8%W&^!hc~2-whGIm}H9a zb&FY=8KQjM)lEk~)0_|9r7^f8*q?WWdt1x|L@RKm48LSem(^LbPUOvi8;I;!qk zj$Q}OzYaBVf6veTfUV@9LM29$d~drjvzb#=HTw?~DbCr1KWYGS;MxL8Vaz!Kf6%PO z2`8@$=8-dX!*`xs`q9?{C zn^Yl!cs?VX_bXbF-1C#Oz{R^OGu~*wH$TZQFqNXa2{Hphw_PN3Cqe}Z(`hn*(7nYe zFSm@GehdF5PfX}IljJlKQ%Eto;W)Y#euy_YdT0A7zFJ0yE-Ev+=7ty@3Pm;3Z7_N* z8J$C4@)R#!Q9<5d^pmxII*iWqnA2eNv&ZOeh|p;Uz2J}N6qYd=kotKh{1!YQYPqbO z&^3V0arTMBJMhz^wk?A4j;+@tEOQ+v?ifzopRw8o_|ZXx4iCDnWgFm;kWI@-TwHFV zH>}W-9@JN889B;U9Fmd9s*?iTYCh2IrhlkoWKyy9o)m;trH6ccNRHAc_zrSyJ22`Y6nD`Nvlx9`gXCeHMj=&~udjKX z+#u|++%&m+xJB^@nH!=qNIv6olB~egV$IAxx@bt0)ky(#Ric4IAVmXjAkf%-PE@%xABya%;;`JP zpL+x@V_LFO1kBIniiZ}oICB3W4WyuIz+m#R@)|nqX7FeO#V8Zi0z+AjF5hgeK>x%s z#W|ZLFF0{d42CJkXx5vZgLwwPlkp;nxH>67r$m74f$<_S9FnxSA(1CjC29pWGn<8hOX+-hq#@ZDF;)Lq^i~++?@j9fRGRO8+dc-J%3E3SwTMZ(s)u~Yhw5Aobtr5 za6~Q3wRI3DOE;t_r)AJ+jVIOeZmz^Z0yUsA_*C*ts>FJv+S2>FSD6}aaVZ>F17r8k zEg*BaJ8vlkx^loNZ{`m!D(Ojpi^jK^4{$_)Ih`g0G=^R}!)j#jr!`QTU>$<{$>KSz zrXT1{FaaZlsfC^O5fGbT?%|Ys_wxw*_^l6xV2By4j?k_aK01~jmB%wJHS`+7WB|%} zDJ~W~#zZx@!eRuXCkET+#WMOYtQ4bxQIEw4)c+Zaj{Dgys78ZY@oSe?V0fj6u44Fy zKVq7CxDm-oH{gQg=N0`jwEd7850>Pt*=RNnjfsR_NJyO3Nda{=FC=IXik2f1aBfPw zrpuAzq70Q!A7tp{bX%uesIj2n_eIqOwa|Tnm57Noyv#Lkd9^S%x3iwA`UQn>KBXz} zdcxw~!ysa&Rm8REGosuu+A7i|H9^I-jFb&P{oI(bp;R zOH_k})+x+%3|*_RPBB2U9kV==CDjAp@xW17r!OAal^`H{D6P@G@y#;$D_?Z*ajY;- z4_O!pS;Y(4P#-pug-zZzgO42DBYosp9Lth8tCIriYGPSp5W=eyi8q=uQA6>l8fB`vdgWqcAoC5xcMufI5_C(m*xyky2l(2JnD7 z?2gRtjt;|{aH$IuxW9LDb&zkl<*`&7N~GazFDs6r3|3`jFhhC(4T5gg;p?VD9qs?B z43;D(vsf7d@N4;w%@508y6m6%hO8;Umpg z;Jul|j*Ch{9FiXLq}XpJW555r-)s)Tc6HYa8udMI%MX2z5ypvNE&;m~2K%`Q7@>r? zuA3v)(s%gNz;Ig$u?#xE^@b zt${+&-ApQAz<7HNzgp{+?Et#j?EhbFH=9XozZn{DAKUGEt+p4`cUrxw8-6Qkx!tMN zyn0w`+H&uWf#0avfm!wOO=h5O*P*i2>=&CmA-otLYae*6F4or$u}dL(osPHN*rAEb z5|<~gNL-n?PU5yaIOE??2G?OC#r|C#(bx*5TTHVsod*h#Ibz7@vI{KiapISZD>N)u25|iZ>c!X|1 zYzPNef*CMD;cnxC6Nd)hMn}gM@HRmiW?|tJ^Slbbjn&H9LS_BR(wevGm6xx=z25>C zp2HB^#Wltxsx+5=JtM+&>mPoMFA%;!MV^sGK^G-rtz4_DFPAMGCJ_#E(r~C<5J^u7 z)zNp;>-#!-r`55JK5F$?t4BKeoTNe>Y4ujCH$obm6jBA%;xt zK8OcFxoJ?bfd0~#ZAOhCCOatXjl*XG%I;B=jst3hZDBYlvqxDCnLv#oCOas6))6xS z#l`qDYJ_cJI4CYAGowZjlO2>qP;wTaI4zn3m+XU5ug!Y@)hzrEz&9zmV~@K!`erhB zTq1DlMRT=!0*%Il1i`_#@zandD`zA0kkz<4yq- zEwMpR61E1G{(e#qO-hd7YDcfh)?M)N8hwH0cI=wZM_2w84ung?iG!Z;%`_PS*@2)| Zr}+PXt?|0HD!Db zFo%8>zg61--L9NL*6j|e=&C0M_cJ)j;3R_w8JuMB9s~UhBpFCDFvviXfjx%sGX%*H zBtrxlf@FvuL;4w#WJr=BgA7SBq+{?0x9fBMUMzl94$^5@IAYgTa7ts{UkjyF-SnPNFem#*F!! Nd;xuB%U}Qu004LWxEBBb literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..58fbc63dc9c6a6172a51e020e1c64a029b77860f GIT binary patch literal 286 zcmV+(0pb21iwFoAtX*UT0CsP1Uua`*Uu|V_XJub9FfubRG%`0ZFfcG*E_7jX0PWI2 zYQr!P1yF69Qv@HNjHIz;okp0(w1u`dwrl7ay6r`}Z5O>vAJ(k%t}D#u_b=Q1|MYKN0k?F%1%8`e9 zKSw!vDgS>y*I(b#owWgNqS}DAplwuJ&2Ca$jw8bYC(sGBYqVGB+?VFfcB3VR8WN znB8*HKorNh)u&**(hHpZ$OrMx(FbtG2Vm58)KSp^)ETb|ZMA5pMJd!OSU=kFV``_g z+R`>j-$h75ul5x@*(C|I3IS#uFSUnbmGRtbmsoO@l@hoI+GxX zP$Ur*K|7yGKZ=ar5JpH<)d&);`x{QmvJ%0PL==fiR8e6*l@uisMUj8dVDHyb5%f>) z^&d92e{hCB17l}S@lN{Tbzyiq(+uSTOV~d$j!HmMF`!TC9`>?cQ{g`tqv+(1lQE1l7&4a2{ z&pB_NIumQo!XDFKF@34;je9O=8t&>Y$k=Db4l{P))=_Sl%$(yVbiT|@7~u=giuFc` z2EUKXDuO6<9jeKSq=5@H&$~2+q!^Z>7+;X-1uXq(>=+?g3PFhQ1ICxAgk>4aU;+}vgZ!w`#U8ROLKvl^UN@~S>WT<_T*q% zxd%eADhNUt=ggKkydu-feb+V=!tNEj0F8B6Ya3jgkTy7qsY2;!;Nqdd5e|+JOpky& z%odybSrLI&F>CEqLrP{pa8uCf91)=y1v~JgSqY<~_VOFM@Xyj>6DC?bhJB5ceT{?)b+k~^aA;7(1w|wx zG_qE+=06Pq=ZIfCS*eTM9)^njdevTB^~(=0XD#%--OyAZzzs3aM?y4kYa0lJP8$e3 z$O=ZI0Z|75BKg{9SMrBT1<*TZ#dHghPwTC32UdQiRbI1dkRi61zQOdB5H2af_RcZ0 z2omUT7hJ-fvB`Pmz*l^{e)Y=bUh%X1(c0P&r1+;Oa#UY5!;&%=cxsyI5IFES^#g}` zfrH|ThDYIq5e?1BRX7R_u5zrna4O3%0@(UGA$*P!xv1)wiM^_bm9Ng~J1F=(Z7X(E zfrY;77=q9wj0P)}y9z-Hl^_zZFjghMpiosZlFDH;SV0k}Tp@2)*5K7^xJ2aphHp{l zF*PM#y~3s-U+g%Vf{33XUb;d9`jgm2DT-0;xZ1h@aTzU&aG2MvKS5XW=X zr;y&2oy|w7FSDpARJ3X7rWL%o0YysnAXV^CZ0*Hr4=REm#Xij1YEQm`n{0@sjaY*Q z5Bal6W@l%1f9y=Qa+Kt$O)$bL(r_9HE!ni9{Gt#bluoA=BsKX}F(3sr4I7%OX|5kY z2SZsvN(?Gfd!?kHSkC%~dVlJtD#Y!AH8VArqUBX$6@+2s#cRVN-k0WVX>6|-W!#Es zmSli$+1X7mQEZmmG-Z%`voaM?2$WVrgP^W+puM3`a7v;?i4rA>RUa~aF$@3>004!C=xqQ1 literal 0 HcmV?d00001 From e625a030c7aed62f81b3e86aab8e98fc126299c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 18 May 2023 09:48:49 +0900 Subject: [PATCH 295/962] =?UTF-8?q?NULL=E5=AF=BE=E5=BF=9C=EF=BC=88?= =?UTF-8?q?=E4=BD=9C=E6=A5=AD=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_dr_mapper.py | 44 +++++----- .../table_mapper/concrete/com_inst_mapper.py | 48 +++++------ .../concrete/com_sp_field_mapper.py | 12 +-- .../com_dr/expect_com_dr_update.csv | 12 +-- .../com_inst/expect_com_inst_update.csv | 14 ++-- .../com_inst/test_com_inst_mapper.py | 83 ++++--------------- .../expect_com_sp_field_update.csv | 4 +- 7 files changed, 84 insertions(+), 133 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py index ac2bd53a..394bb47b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_mapper.py @@ -248,13 +248,13 @@ class ComDrMapper(UltmarcTableMapper): if len(self.record.drdel_code) > 0: set_clauses.append('delete_sche_reason_cd = :drdel_code') if self.record.drdel_code == '@': - self.query_parameter['drdel_code'] = '' + self.query_parameter['drdel_code'] = None # 重複時相手先コード if len(self.record.opp_dup_code) > 0: set_clauses.append('opp_dup_cd = :opp_dup_code') if self.record.reptdr_id == '@': - self.query_parameter['opp_dup_code'] = '' + self.query_parameter['opp_dup_code'] = None # 医師名(漢字) if len(self.record.dr_name) > 0: @@ -276,11 +276,11 @@ class ComDrMapper(UltmarcTableMapper): set_clauses.append('birthday_day = :birthday_day') set_clauses.append('birthday = :birth_day') if self.record.birthday_era == '@': - self.query_parameter['birthday_era'] = '' - self.query_parameter['birthday_year'] = '' - self.query_parameter['birthday_month'] = '' - self.query_parameter['birthday_day'] = '' - self.query_parameter['birth_day'] = '' + self.query_parameter['birthday_era'] = None + self.query_parameter['birthday_year'] = None + self.query_parameter['birthday_month'] = None + self.query_parameter['birthday_day'] = None + self.query_parameter['birth_day'] = None # 出身都道府県コード if len(self.record.home_town_code) > 0: @@ -296,9 +296,9 @@ class ComDrMapper(UltmarcTableMapper): set_clauses.append('grad_era = :grad_yearera') set_clauses.append('grad_y = :grad_y') if self.record.grad_yearera == '@': - self.query_parameter['grad_yearera'] = '' - self.query_parameter['grad_year'] = '' - self.query_parameter['grad_y'] = '' + self.query_parameter['grad_yearera'] = None + self.query_parameter['grad_year'] = None + self.query_parameter['grad_y'] = None # 出身校コード if len(self.record.graduniv_code) > 0: @@ -314,15 +314,15 @@ class ComDrMapper(UltmarcTableMapper): set_clauses.append('drday_year = :drday_year') set_clauses.append('drday_y = :drday_y') if self.record.drda_yera == '@': - self.query_parameter['drda_yera'] = '' - self.query_parameter['drday_year'] = '' - self.query_parameter['drday_y'] = '' + self.query_parameter['drda_yera'] = None + self.query_parameter['drday_year'] = None + self.query_parameter['drday_y'] = None # 住所不明 if len(self.record.dr_addr_lost_code) > 0: set_clauses.append('addr_unknown_reason_cd = :dr_addr_lost_code') if self.record.dr_addr_lost_code == '@': - self.query_parameter['dr_addr_lost_code'] = '' + self.query_parameter['dr_addr_lost_code'] = None # 住所 # 集合項目のいずれかに入力がある場合に更新 @@ -341,31 +341,31 @@ class ComDrMapper(UltmarcTableMapper): if len(self.record.dr_tel) > 0: set_clauses.append('home_phone_number = :dr_tel') if self.record.dr_tel == '@': - self.query_parameter['dr_tel'] = '' + self.query_parameter['dr_tel'] = None # 利用停止区分 if len(self.record.use_stop_flag) > 0: set_clauses.append('use_stop_div = :use_stop_flag') if self.record.use_stop_flag == '@': - self.query_parameter['use_stop_flag'] = '' + self.query_parameter['use_stop_flag'] = None # 利用停止理由 if len(self.record.use_stopc_ode) > 0: set_clauses.append('use_stop_reason_cd = :use_stopc_ode') if self.record.use_stopc_ode == '@': - self.query_parameter['use_stopc_ode'] = '' + self.query_parameter['use_stopc_ode'] = None # 利用停止登録年月日 if len(self.record.cre_stop_date) > 0: set_clauses.append('use_stop_regist_ymd = :cre_stop_date') if self.record.cre_stop_date == '@': - self.query_parameter['cre_stop_date'] = '' + self.query_parameter['cre_stop_date'] = None # 利用停止解除年月日 if len(self.record.release_date) > 0: set_clauses.append('use_stop_cancel_ymd = :release_date') if self.record.release_date == '@': - self.query_parameter['release_date'] = '' + self.query_parameter['release_date'] = None # 開勤区分 if len(self.record.pract_class_code) > 0: @@ -377,9 +377,9 @@ class ComDrMapper(UltmarcTableMapper): set_clauses.append('estab_year = :pract_year') set_clauses.append('estab_y = :estab_y') if self.record.pract_yearera == '@': - self.query_parameter['pract_yearera'] = '' - self.query_parameter['pract_year'] = '' - self.query_parameter['estab_y'] = '' + self.query_parameter['pract_yearera'] = None + self.query_parameter['pract_year'] = None + self.query_parameter['estab_y'] = None # 一括登録フラグ if len(self.record.bskregst_flag) > 0: diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py index a7146b42..3802ed62 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_mapper.py @@ -345,83 +345,83 @@ class ComInstMapper(UltmarcTableMapper): if len(self.record.uncheck_flag) > 0: set_clauses.append('unconf_flg = :uncheck_flag') if self.record.uncheck_flag == '@': - self.query_parameter['uncheck_flag'] = '' + self.query_parameter['uncheck_flag'] = None # 削除予定理由コード if len(self.record.hpdel_code) > 0: set_clauses.append('delete_sche_reason_cd = :hpdel_code') if self.record.hpdel_code == '@': - self.query_parameter['hpdel_code'] = '' + self.query_parameter['hpdel_code'] = None # 重複時相手先コード if len(self.record.dup_opp_code) > 0: set_clauses.append('dup_opp_cd = :dup_opp_code') if self.record.duphp_id == '@': - self.query_parameter['dup_opp_code'] = '' + self.query_parameter['dup_opp_code'] = None # 住所不明理由コード if len(self.record.hp_addr_lost_code) > 0: set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') if self.record.hp_addr_lost_code == '@': - self.query_parameter['hp_addr_lost_code'] = '' + self.query_parameter['hp_addr_lost_code'] = None # 電話番号なしフラグ if len(self.record.tel_nothing_flag) > 0: set_clauses.append('phone_number_non_flg = :tel_nothing_flag') if self.record.tel_nothing_flag == '@': - self.query_parameter['tel_nothing_flag'] = '' + self.query_parameter['tel_nothing_flag'] = None # 電話番号 if len(self.record.hp_tel) > 0: set_clauses.append('inst_phone_number = :hp_tel') if self.record.hp_tel == '@': - self.query_parameter['hp_tel'] = '' + self.query_parameter['hp_tel'] = None # 施設代表者コード if len(self.record.inst_repre_code) > 0: set_clauses.append('inst_repre_cd = :inst_repre_code') if self.record.president_id == '@': - self.query_parameter['inst_repre_code'] = '' + self.query_parameter['inst_repre_code'] = None # 代表者(カナ) if len(self.record.president_kana) > 0: set_clauses.append('inst_repre_kana = :president_kana') if self.record.president_kana == '@': - self.query_parameter['president_kana'] = '' + self.query_parameter['president_kana'] = None # 代表者(漢字) ※「@」が大文字 if len(self.record.president) > 0: set_clauses.append('inst_repre = :president') if self.record.president == '@': - self.query_parameter['president'] = '' + self.query_parameter['president'] = None # 開業予定フラグ・開業予定年月 if len(self.record.open_flag + self.record.open_year_month) > 0: set_clauses.append('estab_sche_flg = :open_flag') set_clauses.append('estab_sche_ym = :open_year_month') if self.record.open_flag == '@': - self.query_parameter['open_flag'] = '' - self.query_parameter['open_year_month'] = '' + self.query_parameter['open_flag'] = None + self.query_parameter['open_year_month'] = None # 休院フラグ・休院開始年月 if len(self.record.close_flag + self.record.close_year_month) > 0: set_clauses.append('close_flg = :close_flag') set_clauses.append('close_start_ym = :close_year_month') if self.record.close_flag == '@': - self.query_parameter['close_flag'] = '' - self.query_parameter['close_year_month'] = '' + self.query_parameter['close_flag'] = None + self.query_parameter['close_year_month'] = None # 関連大学親コード if len(self.record.univ_prnt_code) > 0: set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code') if self.record.assoc_parrent_id == '@': - self.query_parameter['univ_prnt_code'] = '' + self.query_parameter['univ_prnt_code'] = None # 病棟閉鎖フラグ if len(self.record.close_flag2) > 0: set_clauses.append('ward_abolish_flg = :close_flag2') if self.record.close_flag2 == '@': - self.query_parameter['close_flag2'] = '' + self.query_parameter['close_flag2'] = None # 病床数(定員) if self.record.bed_num is not None: @@ -433,7 +433,7 @@ class ComInstMapper(UltmarcTableMapper): if len(self.record.bed_class_maint_date) > 0: set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date') if self.record.bed_class_maint_date == '@': - self.query_parameter['bed_class_maint_date'] = '' + self.query_parameter['bed_class_maint_date'] = None # 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床) if not self.record.prmit_bed.count(None) == len(self.record.prmit_bed): @@ -463,13 +463,13 @@ class ComInstMapper(UltmarcTableMapper): set_clauses.append('insp_item_biochem = :inspect_code6') set_clauses.append('insp_item_ri = :inspect_code7') if self.record.inspect_code1 == '@': - self.query_parameter['inspect_code1'] = '' - self.query_parameter['inspect_code2'] = '' - self.query_parameter['inspect_code3'] = '' - self.query_parameter['inspect_code4'] = '' - self.query_parameter['inspect_code5'] = '' - self.query_parameter['inspect_code6'] = '' - self.query_parameter['inspect_code7'] = '' + self.query_parameter['inspect_code1'] = None + self.query_parameter['inspect_code2'] = None + self.query_parameter['inspect_code3'] = None + self.query_parameter['inspect_code4'] = None + self.query_parameter['inspect_code5'] = None + self.query_parameter['inspect_code6'] = None + self.query_parameter['inspect_code7'] = None update_columns = ','.join(set_clauses) # 何も更新項目が無い場合は更新処理は行わない @@ -521,7 +521,7 @@ class ComInstMapper(UltmarcTableMapper): # 存在する場合はUpdate if self.record.dcfhp_92id == "@": - self.query_parameter['dcf_prnt_inst_code'] = '' + self.query_parameter['dcf_prnt_inst_code'] = None self.query_parameter['delete_ymd'] = self.query_parameter['execute_date_str_ymd'] else: self.query_parameter['delete_ymd'] = None diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 18b4c64f..efa11062 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -116,22 +116,22 @@ class ComSpFieldMapper(UltmarcTableMapper): set_clauses.append('specialst_flg = :specialst_flg') set_clauses.append('specialst_publsh_ymd = :specialst_publsh_ymd') if self.record.specialst_flg == '@': - self.query_parameter['specialst_flg'] = '' - self.query_parameter['specialst_publsh_ymd'] = '' + self.query_parameter['specialst_flg'] = None + self.query_parameter['specialst_publsh_ymd'] = None if len(self.record.ackn_med_flg) > 0: set_clauses.append('ackn_med_flg = :ackn_med_flg') set_clauses.append('ackn_med_publsh_ymd = :ackn_med_publsh_ymd') if self.record.ackn_med_flg == '@': - self.query_parameter['ackn_med_flg'] = '' - self.query_parameter['ackn_med_publsh_ymd'] = '' + self.query_parameter['ackn_med_flg'] = None + self.query_parameter['ackn_med_publsh_ymd'] = None if len(self.record.guide_med_flg) > 0: set_clauses.append('guide_med_flg = :guide_med_flg') set_clauses.append('guide_med_publsh_ymd = :guide_med_publsh_ymd') if self.record.guide_med_flg == '@': - self.query_parameter['guide_med_flg'] = '' - self.query_parameter['guide_med_publsh_ymd'] = '' + self.query_parameter['guide_med_flg'] = None + self.query_parameter['guide_med_publsh_ymd'] = None update_columns = ','.join(set_clauses) # 何も更新項目が無い場合はNoneとする(更新処理は行わない) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv index 882e4c9e..24ac98c0 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_dr/expect_com_dr_update.csv @@ -1,9 +1,9 @@ "dcf_pcf_dr_cd","dr_name_kana","dr_name","birthday_era","birthday_year","birthday_month","birthday_day","birthday","hometown_cd","estab_era","estab_year","estab_y","home_phone_number","home_addr_kana","home_addr","home_postal_number","addr_village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","dr_circle_cd","estab_div_cd","sex_cd","delete_sche_reason_cd","addr_unknown_reason_cd","alma_cd","depart_disc_cd","grad_era","grad_year","grad_y","lump_regist_flg","opp_dup_cd","dr_ph_div","use_stop_div","use_stop_reason_cd","use_stop_regist_ymd","use_stop_cancel_ymd","drday_era","drday_year","drday_y","cor_dnfdr_cd","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0122222233","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" -"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37","","","NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2-7-10-10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2","","","022","2","3","44","1969","1","0199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" -"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992","","","","","00000000000","00","000","","00000000","00000000","55","2","1","5","7","039","1","3","53","1978","","NULL","1","02","A05","20051003","","3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" -"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99","","","NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2","","","057","1","3","52","1977","1","NULL","1","","","","","3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" -"0199790600","オカ モリマサ","丘 守正","","","","","","99","","","","","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1","","5","799","1","","","","","NULL","1","","","","","","","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" -"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37","","","NULL","","カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2-8-30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","","","799","1","","","NULL","","0148106500","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" -"9999999990","12","11","","","","","","18","","","","","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","","","022","3","","","","6","","1","","","","","","","","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" +"0199430100","カンマ セイキ","菅間 正気","3","16","01","14","19410114","37",,,"NULL","045-999-9999","トウキヨウト チユウオウク ニホンバシニンギヨウチヨウ 2-7-10-10","東京都中央区日本橋人形町2-7-10-10","103-0013","13102022002","13","102","2-7-10-10","09090909","09090909","37","1","2",,,"022","2","3","44","1969","1","0199809900","1","03","B06","20160831","20161125","3","44","1969","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199578300","フナコシ マサノブ","船越 正信","3","29","01","06","19540106","53","4","04","1992",,,,,"00000000000","00","000",,"00000000","00000000","55","2","1","5","7","039","1","3","53","1978",,"NULL","1","02","A05","20051003",,"3","53","1978","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199768200","ヨコハマ ミキコ","横浜 三紀子","4","3","11","12","19911112","99",,,"NULL","03-3579-1698","トウキヨウト イタバシク ホンチヨウ 6-3-301","東京都板橋区本町6-3-301","173-0001","13119047000","13","119","6-3-301","07070600","03030200","99","2","2",,,"057","1","3","52","1977","1","NULL","1",,,,,"3","10","1935","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199790600","オカ モリマサ","丘 守正","NULL","NULL","NULL","NULL","NULL","99","NULL","NULL","NULL","NULL","イバラキケン ヒタチナカシ オオアザミタンダ 3892-4","茨城県ひたちなか市大字三反田3892−4","312-0021","08221095000","08","221","3892-4","08071100","03060500","31","1","1",,"5","799","1","NULL","NULL","NULL",,"NULL","1",,,,,,,"NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"0199961300","フジタ アカネ","藤田 茜","4","2","09","22","19900922","37",,,"NULL",,"カナガワケン カマクラシ タマナワ 2-8-30","神奈川県鎌倉市玉縄2-8-30","555-6666","01002033444","01","002","2-8-30","00000000","00000000","11","9","2","NULL","NULL","799","1",,,"NULL",,"0148106500","1",,,,,"NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 20:57:12","clsComDrInfo","2017/10/09 18:06:51","com_dr_mapper" +"9999999990","12","11","NULL","NULL","NULL","NULL","NULL","18","NULL","NULL","NULL","NULL","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","NULL","NULL","022","3","NULL","NULL","NULL","6","NULL","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_dr_mapper" "9999999999","12","11","4","15","06","17","20030617","18","4","55","2043","045-625-2048","38","37","231-0036","32033034035","32","033","126-1-39","44454647","40414243","19","3","1","7","1","022","3","1","21","1888","6","8910","1","49","50","20200501","20200502","4","25","2013","NULL","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv index f2aa0ac2..3353e7ae 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_inst_update.csv @@ -1,11 +1,11 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","rltd_univ_prnt_cd","bed_num","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","ward_abolish_flg","inst_repre_cd","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","hp_assrt_cd","dup_opp_cd","insp_item_micrb","insp_item_serum","insp_item_blood","insp_item_patho","insp_item_paras","insp_item_biochem","insp_item_ri","re_exam_cd","prmit_bed_num_other","prmit_bed_num_mental","prmit_bed_num_tuber","prmit_bed_num_infection","prmit_bed_num_sum","prmit_bed_num_gen","prmit_bed_num_rcup","prmit_bed_maint_ymd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"009900146","10","","テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","","NULL","","","","","","01092029","バンドウ シヨウジ","板東 章二","","","088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462","","","","","","","","3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:28","com_inst_mapper" -"009900194","10","","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院","","0","","","","","","","","","1","","","トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","","7","","","","","","","","","6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" -"009901649","60","","シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)","","50","","1","","201801","","","","","","","0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322","","07180000","03060000","435","","1","","","","","","","","","9","","","","","","","","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" -"009901679","60","","カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター","","0","","","","","1","01148013","カイエダ タケル","海江田 健","","","","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470","","9","","","","","","","","","9","","","","","","","","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" -"009904439","01","","カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370","","","","","","","","","","","044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221","","1","","3","","1","","2","","3","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" -"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL","","0","","","","","","","","","","","","トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472","","7","","","","","","","","","6","95","92","93","94","91","96","97","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 11:08:30","com_inst_mapper" +"009900146","10",,"テストイリヨウホウジンケイロウカイモリオカナイカ","モリオカナイカ イリヨウ","医療法人敬老会森岡内科","森岡内科 医療","NULL","NULL","NULL",,"NULL",,"NULL","01092029","バンドウ シヨウジ","板東 章二",,,"088-623-6161","トクシマケン トクシマシ トクシマホンチヨウ 2-31","徳島県徳島市徳島本町2-31","770-0854","36201117002","36","201","2-31","07061002","03030402","221","2","7","003631462",,,,,,,,"3","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:28","com_inst_mapper" +"009900194","10","NULL","イチゴザキイイン","イチゴザキイイン","一期崎医院","一期崎医院",,"0",,,,,,,,,"1","NULL",,"トウキヨウト ミナトク アザブジユウバン 1-5-18 カ-トブランアザブジユウバン 3F","東京都港区麻布十番1-5-18 カートブラン麻布十番3F","106-0045","11222333444","11","222","1-5-18-10-3","07051302","03020402","472","NULL","7","NULL",,,,,,,,"6","0","0","0","0","0","0","0","20090430","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901649","60",,"シヤフクメイワカイトクベツヨウゴロウジンホ-ムアヅキ","アヅキ シヤフク","社会福祉法人明和会特別養護老人ホームあづき","あづき(てすと)",,"50",,"1",,"201801",,,,,,,"0879-62-7707","カガワケン シヨウズグン トノシヨウチヨウ アザハンノイケコウ 1360-143","香川県小豆郡土庄町字半ノ池甲1360-143","761-4100","37322000000","37","322",,"07180000","03060000","435",,"1",,,,,,,,,"9",,,,,,,,,"1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:26","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009901679","60",,"カゴシマシイシカイリンシヨウケンサセンタ-","カゴシマテスト","鹿児島市医師会臨床検査センター","鹿児島市医師会臨床検査センター",,"0",,"NULL",,"NULL","1","01148013","カイエダ タケル","海江田 健",,,"NULL","カゴシマケン カゴシマシ カジヤチヨウ 3-10","鹿児島県鹿児島市加治屋町3-10","892-0846","46201017000","46","201","3-10","08070800","04040400","470",,"9",,"NULL","NULL","NULL","NULL","NULL","NULL","NULL","9",,,,,,,,,"1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009904439","01",,"カワサキシリツイダビヨウイン","イダビヨウイン シリツ","川崎市立テスト病院","井田病院 市立","111234567","370",,,,,,,,,,,"044-766-2188","カナガワケン カワサキシ ナカハラク イダ 2-27-1","神奈川県川崎市中原区井田2-27-1","211-0035","14133001002","14","133","2-27-1","08120402","04060202","221",,"1",,"3",,"1",,"2",,"3","3","343","0","27","0","370","343","0","20140811","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:27","clsComInstInfo","2022-02-01 11:08:29","com_inst_mapper" +"009929798","10","6","パ-ソナルヘルスマナビノクリニツク","パ-ソナルヘルスマナビノクリニツク","パーソナルヘルス学びのクリニック","パーソナルヘルス学びのCL",,"0",,,,,,"NULL","NULL","NULL","NULL",,,"トウキヨウト ミナトク ミナミアオヤマ 2-2-1 ウインアオヤマ 405","東京都港区南青山2-2-15 ウイン青山405","107-0062","13103025002","13","103","2-2-15-405","07050802","03020302","472",,"7",,,,,,,,,"6","95","92","93","94","91","96","97","20130415","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2022-01-31 11:38:28","clsComInstInfo","2022-02-01 11:08:30","com_inst_mapper" "223333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" "223333399","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","com_inst_mapper","2023/04/12 00:00:00","com_inst_mapper" "993333344","37","7","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","81011","113","5","3","202306","202304","2","383940","アイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこ","4","8","35","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","9","7","101112","2","3","4","5","6","7","8","8","9","6","7","8","115","0","1","20230114","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","aaaa" -"999999999","37","","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","","NULL","","","","","","","","","","","","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","","7","","","","","","","","","8","NULL","NULL","NULL","NULL","NULL","NULL","NULL","","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" +"999999999","37","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","アイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","あいうえおかきくけこあいうえおかきくけこあいうえお","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","アイウエオカクキケコアイウエオカクキケコアイウエオカクキケコ","あいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこあいうえおかきくけこ","123-4522","18192021","18","19","25","30313233","26272829","36","NULL","7","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","8","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/12 00:00:00","aaaa","2023/04/12 00:00:00","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py index 4c4058d8..15bc42a1 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/test_com_inst_mapper.py @@ -21,6 +21,17 @@ class TestComInstMapper: batch_context: BatchContext test_file_path: str = path.dirname(__file__) + smallint_columns = [ + 'bed_num', + 'prmit_bed_num_other', + 'prmit_bed_num_mental', + 'prmit_bed_num_tuber', + 'prmit_bed_num_infection', + 'prmit_bed_num_sum', + 'prmit_bed_num_gen', + 'prmit_bed_num_rcup' + ] + @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" @@ -76,19 +87,7 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup', - 'regist_ymd', - 'regist_ymd', - 'sys_update_date', - 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -96,15 +95,7 @@ class TestComInstMapper: line_number += 1 for actual_col_name, expect_col_name in zip(actual_row, expect_row): if actual_col_name in ignore_columns: - if actual_col_name in [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup']: + if actual_col_name in self.smallint_columns: if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' else: @@ -224,19 +215,7 @@ class TestComInstMapper: actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 # 期待値検査 - ignore_columns = [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup', - 'regist_ymd', - 'regist_ymd', - 'sys_update_date', - 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -247,15 +226,7 @@ class TestComInstMapper: if expect_row[expect_col_name] is None: assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - if actual_col_name in [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup']: + if actual_col_name in self.smallint_columns: if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' else: @@ -379,19 +350,7 @@ class TestComInstMapper: actual_select_sql = f"SELECT * FROM src05.com_inst WHERE dcf_dsf_inst_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 - ignore_columns = [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup', - 'regist_ymd', - 'regist_ymd', - 'sys_update_date', - 'sys_regist_date'] + ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] + self.smallint_columns assert_table_results(actual_data_list, expect_data_list, ignore_col_name=ignore_columns) # 動的日付項目の個別確認 line_number = 0 @@ -402,15 +361,7 @@ class TestComInstMapper: if expect_row[expect_col_name] is None: assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと' else: - if actual_col_name in [ - 'bed_num', - 'prmit_bed_num_other', - 'prmit_bed_num_mental', - 'prmit_bed_num_tuber', - 'prmit_bed_num_infection', - 'prmit_bed_num_sum', - 'prmit_bed_num_gen', - 'prmit_bed_num_rcup']: + if actual_col_name in self.smallint_columns: if expect_row[expect_col_name] is not None and len(expect_row[expect_col_name]) > 0: assert actual_row[actual_col_name] == int(expect_row[expect_col_name]), f'{line_number}行目:{actual_col_name}が、期待値と一致すること' else: diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv index 73bf0e1b..4a120687 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv @@ -1,6 +1,6 @@ "dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0199430100","0003","2","1","20170401","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199430100","0003","2","1","20170401","NULL","NULL","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" -"0199790600","0032","2","","","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" +"0199790600","0032","2","NULL","NULL","","","NULL","NULL","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199961300","0056","2","1","20180706","1","20170101","1","20180706","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" From f2657409c23e8846c09d392dd497cacd6924b089 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 18 May 2023 10:34:55 +0900 Subject: [PATCH 296/962] =?UTF-8?q?feat:=202023=E5=B9=B45=E6=9C=88?= =?UTF-8?q?=E3=81=AE=E8=84=86=E5=BC=B1=E6=80=A7=E3=82=B9=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 899 ++++++++++-------- .../check-view-security-option/Pipfile.lock | 18 +- 2 files changed, 505 insertions(+), 412 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 0e05bb05..53cba0b7 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,350 +26,27 @@ }, "boto3": { "hashes": [ - "sha256:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", - "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" + "sha256:23523d5d6aa51bba2461d67f6eb458d83b6a52d18e3d953b1ce71209b66462ec", + "sha256:ba7ca9215a1026620741273da10d0d3cceb9f7649f7c101e616a287071826f9d" ], "index": "pypi", - "version": "==1.26.116" + "version": "==1.26.135" }, "botocore": { "hashes": [ - "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", - "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" + "sha256:06502a4473924ef60ac0de908385a5afab9caee6c5b49cf6a330fab0d76ddf5f", + "sha256:0c61d4e5e04fe5329fa65da6b31492ef9d0d5174d72fc2af69de2ed0f87804ca" ], "markers": "python_version >= '3.7'", - "version": "==1.29.116" + "version": "==1.29.135" }, "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:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08", - "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e" - ], - "markers": "python_version >= '3.7'", - "version": "==3.2.0" - }, - "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:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" - ], - "version": "==2023.3" - }, - "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": { - "autopep8": { - "hashes": [ - "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", - "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" - ], - "index": "pypi", - "version": "==2.0.2" - }, - "boto3": { - "hashes": [ - "sha256:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", - "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" - ], - "index": "pypi", - "version": "==1.26.116" - }, - "botocore": { - "hashes": [ - "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", - "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" - ], - "markers": "python_version >= '3.7'", - "version": "==1.29.116" - }, - "certifi": { - "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" - ], - "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.5.7" }, "cffi": { "hashes": [ @@ -521,73 +198,489 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.1.0" }, - "colorama": { + "cryptography": { "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440", + "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288", + "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b", + "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958", + "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b", + "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d", + "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a", + "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404", + "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b", + "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e", + "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2", + "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c", + "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b", + "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9", + "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b", + "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636", + "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99", + "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e", + "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9" ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" + "markers": "python_version >= '3.6'", + "version": "==40.0.2" + }, + "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:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f", + "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5" + ], + "markers": "python_version >= '3.7'", + "version": "==3.5.1" + }, + "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:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294", + "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.30.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: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": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "boto3": { + "hashes": [ + "sha256:23523d5d6aa51bba2461d67f6eb458d83b6a52d18e3d953b1ce71209b66462ec", + "sha256:ba7ca9215a1026620741273da10d0d3cceb9f7649f7c101e616a287071826f9d" + ], + "index": "pypi", + "version": "==1.26.135" + }, + "botocore": { + "hashes": [ + "sha256:06502a4473924ef60ac0de908385a5afab9caee6c5b49cf6a330fab0d76ddf5f", + "sha256:0c61d4e5e04fe5329fa65da6b31492ef9d0d5174d72fc2af69de2ed0f87804ca" + ], + "markers": "python_version >= '3.7'", + "version": "==1.29.135" + }, + "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:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93", - "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013", - "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f", - "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21", - "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462", - "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc", - "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df", - "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1", - "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235", - "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934", - "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9", - "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1", - "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48", - "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4", - "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe", - "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a", - "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b", - "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21", - "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d", - "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa", - "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367", - "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535", - "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152", - "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e", - "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539", - "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1", - "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925", - "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0", - "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2", - "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab", - "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841", - "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30", - "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91", - "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c", - "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257", - "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9", - "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040", - "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911", - "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623", - "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259", - "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c", - "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79", - "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5", - "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4", - "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4", - "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22", - "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd", - "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1", - "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910", - "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859", - "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312" + "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3", + "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a", + "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813", + "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0", + "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a", + "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd", + "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139", + "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b", + "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252", + "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790", + "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045", + "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce", + "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200", + "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718", + "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b", + "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f", + "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5", + "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade", + "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5", + "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a", + "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8", + "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33", + "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e", + "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c", + "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3", + "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969", + "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068", + "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2", + "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771", + "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed", + "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212", + "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614", + "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88", + "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3", + "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c", + "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84", + "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11", + "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1", + "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1", + "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e", + "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1", + "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd", + "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47", + "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a", + "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c", + "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31", + "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5", + "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6", + "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303", + "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5", + "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47" ], "markers": "python_version >= '3.7'", - "version": "==7.2.3" + "version": "==7.2.5" }, "cryptography": { "hashes": [ @@ -728,11 +821,11 @@ }, "moto": { "hashes": [ - "sha256:56de986179f79920f59243bc532e03a7039d24a5ee5aec2eb3b666dcd23d6262", - "sha256:fb9a7615f744da4ea7f154ff8e79782b19781344a6356ca4c0d6217c1237d379" + "sha256:d4bb629686b8b92e480f9784316bd0f379b148a5caee7c07aecbde6033a885e1", + "sha256:d9f5d0e3d027df350ff3552da851644ce192cbf7e7a9e8766fca4b5b6b550df0" ], "index": "pypi", - "version": "==4.1.7" + "version": "==4.1.9" }, "packaging": { "hashes": [ @@ -869,11 +962,11 @@ }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294", + "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.28.2" + "markers": "python_version >= '3.7'", + "version": "==2.30.0" }, "responses": { "hashes": [ @@ -885,11 +978,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": [ @@ -924,11 +1017,11 @@ }, "werkzeug": { "hashes": [ - "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe", - "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612" + "sha256:1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76", + "sha256:48e5e61472fee0ddee27ebad085614ebedb7af41e88f687aaf881afb723a162f" ], - "markers": "python_version >= '3.7'", - "version": "==2.2.3" + "markers": "python_version >= '3.8'", + "version": "==2.3.4" }, "xmltodict": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index 3aa17556..0b63764e 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -43,19 +43,19 @@ }, "boto3": { "hashes": [ - "sha256:40d6fb099f7e6041ddcc72aadc37d2eaae6f32d1f7cf2ef5c02199a114be60a3", - "sha256:bfb16f1978be69fdee39b692fe639b5f9c430d33843d282889a59e61ae132051" + "sha256:23523d5d6aa51bba2461d67f6eb458d83b6a52d18e3d953b1ce71209b66462ec", + "sha256:ba7ca9215a1026620741273da10d0d3cceb9f7649f7c101e616a287071826f9d" ], "index": "pypi", - "version": "==1.26.116" + "version": "==1.26.135" }, "botocore": { "hashes": [ - "sha256:907dec71437386867000912c2427845f482feef5327e7c659e3e81766aac3d34", - "sha256:c058baa1d374111ad2036e1f7d9fe715571b6d66d180a224208fc7fef9bc3c80" + "sha256:06502a4473924ef60ac0de908385a5afab9caee6c5b49cf6a330fab0d76ddf5f", + "sha256:0c61d4e5e04fe5329fa65da6b31492ef9d0d5174d72fc2af69de2ed0f87804ca" ], "markers": "python_version >= '3.7'", - "version": "==1.29.116" + "version": "==1.29.135" }, "cffi": { "hashes": [ @@ -184,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": [ From d6e631bb6a7c936117288f8907b413e707112f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 18 May 2023 10:52:48 +0900 Subject: [PATCH 297/962] =?UTF-8?q?=EF=BC=A0=E3=83=9E=E3=83=BC=E3=82=AF?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E6=99=82=E3=81=AENULL=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table_mapper/concrete/com_pharm_mapper.py | 36 +++++----- .../ultmarc/utmp_tables/tables/com_pharm.py | 6 +- .../com_inst/expect_com_spcare_update.csv | 4 +- .../com_pharm/expect_com_pharm_update.csv | 66 +++++++++---------- 4 files changed, 55 insertions(+), 57 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py index 54ff1ca2..5b6a423d 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_pharm_mapper.py @@ -175,7 +175,7 @@ class ComPharmMapper(UltmarcTableMapper): # 住所不明理由コード if self.record.hp_addr_lost_code != '': set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code') - self.query_parameter['hp_addr_lost_code'] = '' if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code + self.query_parameter['hp_addr_lost_code'] = None if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code # 正式施設名カナ if self.record.hp_name_kana != '': @@ -198,41 +198,41 @@ class ComPharmMapper(UltmarcTableMapper): set_clauses.append('close_flg = :close_flg') set_clauses.append('close_start_ym = :close_yearmonth') if self.record.close_flg == '@': - self.query_parameter['close_flg'] = '' - self.query_parameter['close_yearmonth'] = '' + self.query_parameter['close_flg'] = None + self.query_parameter['close_yearmonth'] = None # 開業予定フラグ、開業予定年月 if len(self.record.open_flag + self.record.open_yearmonth) > 0: set_clauses.append('estab_sche_flg = :open_flag') set_clauses.append('estab_sche_ym = :open_yearmonth') if self.record.open_flag == '@': - self.query_parameter['open_flag'] = '' - self.query_parameter['open_yearmonth'] = '' + self.query_parameter['open_flag'] = None + self.query_parameter['open_yearmonth'] = None # 施設代表者カナ if self.record.president_Kana != '': set_clauses.append('inst_repre_kana = :president_Kana') - self.query_parameter['president_Kana'] = '' if self.record.president_Kana == '@' else self.record.president_Kana + self.query_parameter['president_Kana'] = None if self.record.president_Kana == '@' else self.record.president_Kana # 施設代表者 ※@が大文字 if self.record.president != '': set_clauses.append('inst_repre = :president') - self.query_parameter['president'] = '' if self.record.president == '@' else self.record.president + self.query_parameter['president'] = None if self.record.president == '@' else self.record.president # 電話番号なしフラグ if self.record.tel_nothing_flag != '': set_clauses.append('phone_number_non_flg = :tel_nothing_flag') - self.query_parameter['tel_nothing_flag'] = '' if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag + self.query_parameter['tel_nothing_flag'] = None if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag # 未確認フラグ if self.record.unconf_flg != '': set_clauses.append('unconf_flg = :unconf_flg') - self.query_parameter['unconf_flg'] = '' if self.record.unconf_flg == '@' else self.record.unconf_flg + self.query_parameter['unconf_flg'] = None if self.record.unconf_flg == '@' else self.record.unconf_flg # 施設電話番号 if self.record.tel_number != '': set_clauses.append('inst_phone_number = :tel_number') - self.query_parameter['tel_number'] = '' if self.record.tel_number == '@' else self.record.tel_number + self.query_parameter['tel_number'] = None if self.record.tel_number == '@' else self.record.tel_number # 施設住所カナ if self.record.addr_kana != '': @@ -255,7 +255,7 @@ class ComPharmMapper(UltmarcTableMapper): # 住所表示番号 if self.record.addr_number != '': set_clauses.append('addr_display_number = :addr_number') - self.query_parameter['addr_number'] = '' if self.record.addr_number == '@' else self.record.addr_number + self.query_parameter['addr_number'] = None if self.record.addr_number == '@' else self.record.addr_number # 住所カウント(集合項目である県コードが入っていればカウントをセットする) if len(self.record.prefc_cd) > 0: @@ -265,34 +265,32 @@ class ComPharmMapper(UltmarcTableMapper): # 経営体コード if self.record.mgtclass_code != '': set_clauses.append('manage_cd = :mgtclass_code') - self.query_parameter['mgtclass_code'] = '' if self.record.mgtclass_code == '@' else self.record.mgtclass_code + self.query_parameter['mgtclass_code'] = None if self.record.mgtclass_code == '@' else self.record.mgtclass_code # 削除予定理由コード if self.record.del_cd != '': set_clauses.append('delete_sche_reason_cd = :del_cd') - self.query_parameter['del_cd'] = '' if self.record.del_cd == '@' else self.record.del_cd + self.query_parameter['del_cd'] = None if self.record.del_cd == '@' else self.record.del_cd # 重複時相手先コード if self.record.dup_opp_cd != '': set_clauses.append('dup_opp_cd = :dup_opp_cd') - self.query_parameter['dup_opp_cd'] = '' if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd + self.query_parameter['dup_opp_cd'] = None if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd # 管理薬剤師名(漢字)※@が大文字 if self.record.pharmacist != '': set_clauses.append('supervising_pharmacist = :pharmacist') - self.query_parameter['pharmacist'] = '' if self.record.pharmacist == '@' else self.record.pharmacist + self.query_parameter['pharmacist'] = None if self.record.pharmacist == '@' else self.record.pharmacist # 管理薬剤師名(カナ) if self.record.pharmacist_kana != '': set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana') - self.query_parameter['pharmacist_kana'] = '' if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana + self.query_parameter['pharmacist_kana'] = None if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana # チェーン店本部コード if self.record.franchise_hq_id != '': set_clauses.append('franchise_hq_cd = :franchise_hq_cd') if self.record.franchise_hq_id == '@': - self.query_parameter['franchise_hq_id'] = '' - self.query_parameter['franchise_hq_cd'] = '' - self.query_parameter['franchise_hq_yobi'] = '' + self.query_parameter['franchise_hq_cd'] = None return set_clauses diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py index bca8175a..977e8f0b 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_pharm.py @@ -48,7 +48,7 @@ class ComPharm(UltmarcTable): pharmacist: str # 管理薬剤師名(漢字) pharmacist_kana: str # 管理薬剤師名(カナ) franchise_hq_id: str # チェーン店本部コード(レコードID) - franchise_hq_cd: str # チェーン店本部コード(施設コード) + franchise_hq_code: str # チェーン店本部コード(施設コード) franchise_hq_yobi: str # チェーン店本部コード(予備) dcfdsf_inst_cd: str # 施設コード @@ -105,7 +105,7 @@ class ComPharm(UltmarcTable): self.pharmacist = record[43] self.pharmacist_kana = record[44] self.franchise_hq_id = record[45] - self.franchise_hq_cd = record[46] + self.franchise_hq_code = record[46] self.franchise_hq_yobi = record[47] # 施設コード(2+3+4) @@ -124,4 +124,4 @@ class ComPharm(UltmarcTable): self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi]) # チェーン店本部コード(46+47+48) - self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_cd, self.franchise_hq_yobi]) + self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_code, self.franchise_hq_yobi]) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv index b85d46c8..4b14fe3d 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_inst/expect_com_spcare_update.csv @@ -1,7 +1,7 @@ "dcf_chld_inst_cd","dcf_prnt_inst_cd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "009900146","09912345","20220201","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 11:08:29","com_inst_mapper","2023/05/01 14:52:43","com_inst_mapper" -"009901649","","20220131","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 14:52:43","com_inst_mapper" +"009901649","NULL","20220131","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 11:38:27","clsComInstInfo","2023/05/01 14:52:43","com_inst_mapper" "223333344","9933333311","20230508","20230508","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "223333399","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","com_inst_mapper","2023/05/01 16:16:43","com_inst_mapper" "993333344","9933333311","20230508","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","aaaa" -"999999999","","20230508","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","com_inst_mapper" +"999999999","NULL","20230508","20230508","20230508","NULL","NULL","NULL","NULL","2023/05/01 16:16:43","aaaa","2023/05/01 16:16:43","com_inst_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv index dccf6b06..9dc7e113 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_pharm/expect_com_pharm_update.csv @@ -1,37 +1,37 @@ "dcf_dsf_inst_cd","inst_div_cd","addr_unknown_reason_cd","form_inst_name_kana","inst_name_kana","form_inst_name_kanji","inst_name_kanji","close_flg","estab_sche_flg","close_start_ym","estab_sche_ym","inst_repre_kana","inst_repre","phone_number_non_flg","unconf_flg","inst_phone_number","inst_addr_kana","inst_addr","postal_number","village_cd","prefc_cd","city_cd","addr_display_number","addr_cnt_kana","addr_cnt","manage_cd","delete_sche_reason_cd","dup_opp_cd","supervising_pharmacist","supervising_pharmacist_kana","franchise_hq_cd","inst_pharm_div","abolish_ymd","delete_flg","filler_1","filler_2","filler_3","filler_4","filler_5","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"033673002","85","6","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","5","033673003","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673011","85","","セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673012","85","6","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","1","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","2","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673014","85","6","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","5","033673015","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673016","85","6","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673020","85","6","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673022","85","","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673023","85","","セイシキテンポメイ03B03Aサブン","リヤクシキ03B03Aサブン","正式店舗名03B03a差分","略式03B03a差分","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673024","85","","セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8","リヤクシキ03B03B---+----2----+----3----+----4","正式店舗名03B03b---+----2----+----3----+----4----+----5","略式03B03b-1----+","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673025","85","1","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673026","85","2","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673030","85","","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673032","85","","セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6","東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5","103-0007","13102024002","13","102","2-45-1-03B05B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673033","85","","セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673034","85","","セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b","","","","","","","","","03-3249-8232","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673035","85","","セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c","","","","","","","1","","","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673036","85","","セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","472","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673040","86","","セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673041","85","","セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a","","","","","ダイヒヨウシヤメイ 03B09A","代表者名 03B09a","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673042","85","","セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b","","","","","ダイヒヨウシヤメイ 03B09B--2","代表者名 03B09b---+----2","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673043","85","","セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673044","85","","セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a","","1","","201301","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673045","85","","セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673046","85","","セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","1","","201210","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673047","85","","セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1","","201209","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673048","85","","セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673051","85","","セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471","","","管理薬剤師名 03B12a","カンリヤクザイシメイ 03B12A","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673052","85","","セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471","","","管理薬剤師名 03B12b-+----2","カンリヤクザイシメイ 03B12B-2","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673053","85","","セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673055","85","","セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471","","","","","033673054","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" -"033673061","85","","セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b","","","","","","","","","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471","","","","","033673060","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673002","85","6","セイシキテンポメイ03A01B-01","リヤクシキ03A01B-01","正式店舗名03A01b-01","略式03A01b-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03A01B","東京都中央区日本橋浜町2-45-1 03A01b","103-0007","13102242","13","102","2-45-1-03A01B","77122","3352","471","5","033673003",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673011","85",,"セイシキテンポメイ03B01A","リヤクシキ03B01A","正式店舗名03B01a","略式03B01a",,,,,,,,"NULL","03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B01A","東京都中央区日本橋浜町2-45-1 03B01a","103-0007","13102242","13","102","2-45-1-03B01A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673012","85","6","セイシキテンポメイ03B02A","リヤクシキ03B02A","正式店舗名03B02a","略式03B02a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02A","東京都中央区日本橋浜町2-45-1 03B02a","103-0007","13102242","13","102","2-45-1-03B02A","77122","3352","471","1",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673013","85","6","セイシキテンポメイ03B02B","リヤクシキ03B02B","正式店舗名03B02b","略式03B02b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02B","東京都中央区日本橋浜町2-45-1 03B02b","103-0007","13102242","13","102","2-45-1-03B02B","77122","3352","471","2",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673014","85","6","セイシキテンポメイ03B02C-01","リヤクシキ03B02C-01","正式店舗名03B02c-01","略式03B02c-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02C","東京都中央区日本橋浜町2-45-1 03B02c","103-0007","13102242","13","102","2-45-1-03B02C","77122","3352","471","5","033673015",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673016","85","6","セイシキテンポメイ03B02D-01","リヤクシキ03B02D-01","正式店舗名03B02d-01","略式03B02d-01",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673020","85","6","セイシキテンポメイ03B02D-02","リヤクシキ03B02D-02","正式店舗名03B02d-02","略式03B02d-02",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02D","東京都中央区日本橋浜町2-45-1 03B02d","103-0007","13102242","13","102","2-45-1-03B02D","77122","3352","471","7","033673021",,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673022","85","NULL","セイシキテンポメイ03B02E","リヤクシキ03B02E","正式店舗名03B02e","略式03B02e",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B02E","東京都中央区日本橋浜町2-45-1 03B02e","103-0007","13102242","13","102","2-45-1-03B02E","77122","3352","471","NULL",,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673023","85",,"セイシキテンポメイ03B03Aサブン","リヤクシキ03B03Aサブン","正式店舗名03B03a差分","略式03B03a差分",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03A","東京都中央区日本橋浜町2-45-1 03B03a","103-0007","13102242","13","102","2-45-1-03B03A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673024","85",,"セイシキテンポメイ03B03B---2----+----3----+----4----+----5----+----6----+----7----+----8","リヤクシキ03B03B---+----2----+----3----+----4","正式店舗名03B03b---+----2----+----3----+----4----+----5","略式03B03b-1----+",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B03B","東京都中央区日本橋浜町2-45-1 03B03b","103-0007","13102242","13","102","2-45-1-03B03B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673025","85","1","セイシキテンポメイ03B04A","リヤクシキ03B04A","正式店舗名03B04a","略式03B04a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04A","東京都中央区日本橋浜町2-45-1 03B04a","103-0007","13102242","13","102","2-45-1-03B04A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673026","85","2","セイシキテンポメイ03B04B","リヤクシキ03B04B","正式店舗名03B04b","略式03B04b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04B","東京都中央区日本橋浜町2-45-1 03B04b","103-0007","13102242","13","102","2-45-1-03B04B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673030","85","NULL","セイシキテンポメイ03B04C","リヤクシキ03B04C","正式店舗名03B04c","略式03B04c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B04C","東京都中央区日本橋浜町2-45-1 03B04c","103-0007","13102242","13","102","2-45-1-03B04C","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673032","85",,"セイシキテンポメイ03B05B","リヤクシキ03B05B","正式店舗名03B05b","略式03B05b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B05B4----+----5----+----6","東京都中央区日本橋浜町2-45-1 03B05b+----3----+----4----+----5","103-0007","13102024002","13","102","2-45-1-03B05B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673033","85",,"セイシキテンポメイ03B06A","リヤクシキ03B06A","正式店舗名03B06a","略式03B06a",,,,,,,"NULL",,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06A","東京都中央区日本橋浜町2-45-1 03B06a","103-0007","13102242","13","102","2-45-1-03B06A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673034","85",,"セイシキテンポメイ03B06B","リヤクシキ03B06B","正式店舗名03B06b","略式03B06b",,,,,,,,,"03-3249-8232","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06B","東京都中央区日本橋浜町2-45-1 03B06b","103-0007","13102242","13","102","2-45-1-03B06B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673035","85",,"セイシキテンポメイ03B06C","リヤクシキ03B06C","正式店舗名03B06c","略式03B06c",,,,,,,"1",,"NULL","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B06C","東京都中央区日本橋浜町2-45-1 03B06c","103-0007","13102242","13","102","2-45-1-03B06C","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673036","85",,"セイシキテンポメイ03B07A","リヤクシキ03B07A","正式店舗名03B07a","略式03B07a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B07A","東京都中央区日本橋浜町2-45-1 03B07a","103-0007","13102242","13","102","2-45-1-03B07A","77122","3352","472",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673040","86",,"セイシキテンポメイ03B08A","リヤクシキ03B08A","正式店舗名03B08a","略式03B08a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B08A","東京都中央区日本橋浜町2-45-1 03B08a","103-0007","13102242","13","102","2-45-1-03B08A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673041","85",,"セイシキテンポメイ03B09A","リヤクシキ03B09A","正式店舗名03B09a","略式03B09a",,,,,"ダイヒヨウシヤメイ 03B09A","代表者名 03B09a",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09A","東京都中央区日本橋浜町2-45-1 03B09a","103-0007","13102242","13","102","2-45-1-03B09A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673042","85",,"セイシキテンポメイ03B09B","リヤクシキ03B09B","正式店舗名03B09b","略式03B09b",,,,,"ダイヒヨウシヤメイ 03B09B--2","代表者名 03B09b---+----2",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09B","東京都中央区日本橋浜町2-45-1 03B09b","103-0007","13102242","13","102","2-45-1-03B09B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673043","85",,"セイシキテンポメイ03B09C","リヤクシキ03B09C","正式店舗名03B09c","略式03B09c",,,,,"NULL","NULL",,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B09C","東京都中央区日本橋浜町2-45-1 03B09c","103-0007","13102242","13","102","2-45-1-03B09C","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673044","85",,"セイシキテンポメイ03B10A","リヤクシキ03B10A","正式店舗名03B10a","略式03B10a",,"1",,"201301",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10A","東京都中央区日本橋浜町2-45-1 03B10a","103-0007","13102242","13","102","2-45-1-03B10A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673045","85",,"セイシキテンポメイ03B10B","リヤクシキ03B10B","正式店舗名03B10b","略式03B10b",,"NULL",,"NULL",,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B10B","東京都中央区日本橋浜町2-45-1 03B10b","103-0007","13102242","13","102","2-45-1-03B10B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673046","85",,"セイシキテンポメイ03B11A","リヤクシキ03B11A","正式店舗名03B11a","略式03B11a","1",,"201210",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11A","東京都中央区日本橋浜町2-45-1 03B11a","103-0007","13102242","13","102","2-45-1-03B11A","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673047","85",,"セイシキテンポメイ03B11B","リヤクシキ03B11B","正式店舗名03B11b","略式03B11b","1",,"201209",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11B","東京都中央区日本橋浜町2-45-1 03B11b","103-0007","13102242","13","102","2-45-1-03B11B","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673048","85",,"セイシキテンポメイ03B11C","リヤクシキ03B11C","正式店舗名03B11c","略式03B11c","NULL",,"NULL",,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B11C","東京都中央区日本橋浜町2-45-1 03B11c","103-0007","13102242","13","102","2-45-1-03B11C","77122","3352","471",,,,,,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673051","85",,"セイシキテンポメイ03B12A","リヤクシキ03B12A","正式店舗名03B12a","略式03B12a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12A","東京都中央区日本橋浜町2-45-1 03B12a","103-0007","13102242","13","102","2-45-1-03B12A","77122","3352","471",,,"管理薬剤師名 03B12a","カンリヤクザイシメイ 03B12A",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673052","85",,"セイシキテンポメイ03B12B","リヤクシキ03B12B","正式店舗名03B12b","略式03B12b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12B","東京都中央区日本橋浜町2-45-1 03B12b","103-0007","13102242","13","102","2-45-1-03B12B","77122","3352","471",,,"管理薬剤師名 03B12b-+----2","カンリヤクザイシメイ 03B12B-2",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673053","85",,"セイシキテンポメイ03B12C","リヤクシキ03B12C","正式店舗名03B12c","略式03B12c",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B12C","東京都中央区日本橋浜町2-45-1 03B12c","103-0007","13102242","13","102","2-45-1-03B12C","77122","3352","471",,,"NULL","NULL",,"2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673055","85",,"セイシキテンポメイ03B13A","リヤクシキ03B13A","正式店舗名03B13a","略式03B13a",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13A","東京都中央区日本橋浜町2-45-1 03B13a","103-0007","13102242","13","102","2-45-1-03B13A","77122","3352","471",,,,,"033673054","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" +"033673061","85",,"セイシキテンポメイ03B13B","リヤクシキ03B13B","正式店舗名03B13b","略式03B13b",,,,,,,,,"03-3249-8231","トウキヨウト チユウオウク ニホンバシハマチヨウ 2-45-1 03B13B","東京都中央区日本橋浜町2-45-1 03B13b","103-0007","13102242","13","102","2-45-1-03B13B","77122","3352","471",,,,,"033673060","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/19 00:00:00","com_pharm_mapper","2023/04/19 00:00:00","com_pharm_mapper" "123","2","6","13","15","12","14","1","9","204201","204001","38","37","3","6","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/19 08:27:33","com_pharm_mapper" "456","66","0","正カナ","略カナ","正漢字","略漢字","8","4","204812","204411","代カナ","代漢","0","6","119991234","住所カナ","住所漢字","001-6234","61626364","61","62","11","ケシトチ","県市通丁目","11","7","555657","薬剤師漢字","薬剤師カナ","998877","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" -"789","66","","正カナ","略カナ","正漢字","略漢字","","","","","","","","6","","住所カナ","住所漢字","001-6234","61626364","61","62","","ケシトチ","県市通丁目","","","","","","","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" +"789","66","NULL","正カナ","略カナ","正漢字","略漢字","NULL","NULL","NULL","NULL","NULL","NULL","NULL","6","NULL","住所カナ","住所漢字","001-6234","61626364","61","62","NULL","ケシトチ","県市通丁目","NULL","NULL","NULL","NULL","NULL","NULL","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/4/18 10:27:00","com_pharm_mapper","2023/4/19 08:27:00","com_pharm_mapper" "999","2","6","13","15","12","14","1","9","204201","204001","38","37","3","7","34","23","22","221-000","17181920","17","18","24","29303132","25262728","35","8","91011","43","44","454647","2","NULL","0","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2023/04/18 10:27:33","com_pharm_mapper","2023/04/18 10:27:33","com_pharm_mapper" From 12ed6a50e07d1e533cabfbd288e5fedd90ff3e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 18 May 2023 14:29:48 +0900 Subject: [PATCH 298/962] =?UTF-8?q?SPECIALIST=E9=A0=85=E7=9B=AE=E5=90=8D?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concrete/com_dr_sosiety_mapper.py | 2 +- .../concrete/com_sp_field_mapper.py | 40 +++++++------- ...er.py => com_specialist_license_mapper.py} | 32 +++++------ .../utmp_tables/tables/com_dr_sosiety.py | 4 +- .../utmp_tables/tables/com_sp_field.py | 16 +++--- ...t_license.py => com_specialist_license.py} | 10 ++-- .../ultmarc_table_mapper_factory.py | 6 +-- .../db_com_sp_field_before_delete.csv | 2 +- .../db_com_sp_field_before_update.csv | 2 +- .../expect_com_sp_field_delete.csv | 2 +- .../expect_com_sp_field_insert.csv | 2 +- .../expect_com_sp_field_update.csv | 2 +- .../com_sp_field/test_com_sp_field_mapper.py | 24 ++++----- .../__init__.py | 0 .../com_specialist_license_delete.csv} | 0 .../com_specialist_license_insert.csv} | 0 .../com_specialist_license_update.csv} | 0 ..._com_specialist_license_before_delete.csv} | 2 +- ..._com_specialist_license_before_update.csv} | 2 +- .../expect_com_specialist_license_delete.csv} | 16 +++--- .../expect_com_specialist_license_insert.csv | 8 +++ .../expect_com_specialist_license_update.csv} | 14 ++--- .../test_com_specialist_license_mapper.py} | 54 +++++++++---------- .../expect_com_specialst_license_insert.csv | 8 --- 24 files changed, 124 insertions(+), 124 deletions(-) rename ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/{com_specialst_license_mapper.py => com_specialist_license_mapper.py} (76%) rename ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/{com_specialst_license.py => com_specialist_license.py} (55%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license => com_specialist_license}/__init__.py (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/com_specialst_license_delete.csv => com_specialist_license/com_specialist_license_delete.csv} (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/com_specialst_license_insert.csv => com_specialist_license/com_specialist_license_insert.csv} (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/com_specialst_license_update.csv => com_specialist_license/com_specialist_license_update.csv} (100%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/db_com_specialst_license_before_delete.csv => com_specialist_license/db_com_specialist_license_before_delete.csv} (82%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/db_com_specialst_license_before_update.csv => com_specialist_license/db_com_specialist_license_before_update.csv} (84%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/expect_com_specialst_license_delete.csv => com_specialist_license/expect_com_specialist_license_delete.csv} (56%) create mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/expect_com_specialst_license_update.csv => com_specialist_license/expect_com_specialist_license_update.csv} (65%) rename ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/{com_specialst_license/test_com_specialst_license_mapper.py => com_specialist_license/test_com_specialist_license_mapper.py} (77%) delete mode 100644 ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py index 309362e6..51ee1c63 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_dr_sosiety_mapper.py @@ -78,7 +78,7 @@ class ComDrSosietyMapper(UltmarcTableMapper): def make_query(self): # 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』 - if self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1': + if self.record.maint_flag == 'B' and self.record.cont_flag == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py index 18b4c64f..5cb5a0d4 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_sp_field_mapper.py @@ -15,17 +15,17 @@ class ComSpFieldMapper(UltmarcTableMapper): WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd and - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ # データ登録用SQL INSERT_QUERY = """\ INSERT INTO src05.com_sp_field ( dcf_pcf_dr_cd, - specialst_cd, - specialst_maint_div, - specialst_flg, - specialst_publsh_ymd, + specialist_cd, + specialist_maint_div, + specialist_flg, + specialist_publsh_ymd, ackn_med_flg, ackn_med_publsh_ymd, guide_med_flg, @@ -39,10 +39,10 @@ class ComSpFieldMapper(UltmarcTableMapper): ) VALUES ( :dcf_pcf_dr_cd, - :specialst_cd, - :specialst_maint_div, - :specialst_flg, - :specialst_publsh_ymd, + :specialist_cd, + :specialist_maint_div, + :specialist_flg, + :specialist_publsh_ymd, :ackn_med_flg, :ackn_med_publsh_ymd, :guide_med_flg, @@ -67,7 +67,7 @@ class ComSpFieldMapper(UltmarcTableMapper): WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd and - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 @@ -77,7 +77,7 @@ class ComSpFieldMapper(UltmarcTableMapper): WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd and - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ record: ComSpField @@ -91,7 +91,7 @@ class ComSpFieldMapper(UltmarcTableMapper): def make_query(self): # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 - if self.record.maint_flag == 'B' and self.record.specialst_maint_div == '1': + if self.record.maint_flag == 'B' and self.record.specialist_maint_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return @@ -109,15 +109,15 @@ class ComSpFieldMapper(UltmarcTableMapper): return self.INSERT_QUERY # 存在する場合ではUpdate - if len(self.record.specialst_maint_div) > 0: - set_clauses.append('specialst_maint_div = :specialst_maint_div') + if len(self.record.specialist_maint_div) > 0: + set_clauses.append('specialist_maint_div = :specialist_maint_div') - if len(self.record.specialst_flg) > 0: - set_clauses.append('specialst_flg = :specialst_flg') - set_clauses.append('specialst_publsh_ymd = :specialst_publsh_ymd') - if self.record.specialst_flg == '@': - self.query_parameter['specialst_flg'] = '' - self.query_parameter['specialst_publsh_ymd'] = '' + if len(self.record.specialist_flg) > 0: + set_clauses.append('specialist_flg = :specialist_flg') + set_clauses.append('specialist_publsh_ymd = :specialist_publsh_ymd') + if self.record.specialist_flg == '@': + self.query_parameter['specialist_flg'] = '' + self.query_parameter['specialist_publsh_ymd'] = '' if len(self.record.ackn_med_flg) > 0: set_clauses.append('ackn_med_flg = :ackn_med_flg') diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py similarity index 76% rename from ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py index bf5ac147..1c55e406 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialst_license_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_specialist_license_mapper.py @@ -1,9 +1,9 @@ from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \ UltmarcTableMapper -from src.batch.ultmarc.utmp_tables.tables.com_specialst_license import ComSpecialstLicense +from src.batch.ultmarc.utmp_tables.tables.com_specialist_license import ComSpecialistLicense -class ComSpecialstLicenseMapper(UltmarcTableMapper): +class ComSpecialistLicenseMapper(UltmarcTableMapper): """レイアウト区分010: COM_専門医資格 登録処理""" # レコード存在確認SQL @@ -11,16 +11,16 @@ class ComSpecialstLicenseMapper(UltmarcTableMapper): SELECT COUNT(*) AS count_num FROM - src05.com_specialst_license + src05.com_specialist_license WHERE - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ # データ登録用SQL INSERT_QUERY = """\ - INSERT INTO src05.com_specialst_license + INSERT INTO src05.com_specialist_license ( - specialst_cd, - specialst_licens_name, + specialist_cd, + specialist_license_name, regist_ymd, sys_regist_date, regist_prgm_id, @@ -28,8 +28,8 @@ class ComSpecialstLicenseMapper(UltmarcTableMapper): update_prgm_id ) VALUES ( - :specialst_cd, - :specialst_licens_name, + :specialist_cd, + :specialist_license_name, :execute_date_str_ymd, :execute_datetime, :program_name, @@ -41,31 +41,31 @@ class ComSpecialstLicenseMapper(UltmarcTableMapper): # 変更用SQL UPDATE_QUERY = """\ UPDATE - src05.com_specialst_license + src05.com_specialist_license SET - specialst_licens_name = :specialst_licens_name, + specialist_license_name = :specialist_license_name, update_ymd = :execute_date_str_ymd, sys_update_date = :execute_datetime, update_prgm_id = :program_name WHERE - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ # 修正区分が「C(削除)」の場合の更新SQL LOGICAL_DELETE_QUERY = """\ UPDATE - src05.com_specialst_license + src05.com_specialist_license SET delete_ymd = :execute_date_str_ymd, sys_update_date = :execute_date_str_ymd, update_prgm_id = :program_name WHERE - specialst_cd = :specialst_cd + specialist_cd = :specialist_cd """ - record: ComSpecialstLicense + record: ComSpecialistLicense def __init__(self, record: list[str], db) -> None: - super().__init__(record, db, ComSpecialstLicense) + super().__init__(record, db, ComSpecialistLicense) program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている) # モジュール名をクエリパラメータに設定 self.query_parameter['program_name'] = program_name diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py index 53284e4d..c2e44d8e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_dr_sosiety.py @@ -8,7 +8,7 @@ class ComDrSosiety(UltmarcTable): dcf_dr_yobi: str # 個人コード(予備) maint_flag: str # 修正区分 sosiety_cd: str # 学会コード - specialst_maint_div: str # 予備/専門医メンテ区分 + cont_flag: str # 予備/所属学会メンテ区分 sosiety_f: str # 学会年度 dcf_pcf_dr_cd: str # DCFPCF医師コード @@ -21,7 +21,7 @@ class ComDrSosiety(UltmarcTable): self.dcf_dr_yobi = record[3].strip() self.maint_flag = record[4] self.sosiety_cd = record[5] - self.specialst_maint_div = record[6] + self.cont_flag = record[6] self.sosiety_f = record[9] # DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備)) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py index cc761c54..d26fe53e 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_sp_field.py @@ -8,10 +8,10 @@ class ComSpField(UltmarcTable): dcf_dr_code: str # 個人コード dcf_dr_yobi: str # 個人コード(予備) maint_flag: str # 修正区分 - specialst_cd: str # 専門医コード - specialst_maint_div: str # 予備/専門医メンテ区分 - specialst_flg: str # 専門医フラグ - specialst_publsh_ymd: str # 専門医掲載年月日 + specialist_cd: str # 専門医コード + specialist_maint_div: str # 予備/専門医メンテ区分 + specialist_flg: str # 専門医フラグ + specialist_publsh_ymd: str # 専門医掲載年月日 ackn_med_flg: str # 認定医フラグ ackn_med_publsh_ymd: str # 認定医掲載年月日 guide_med_flg: str # 指導医フラグ @@ -26,11 +26,11 @@ class ComSpField(UltmarcTable): self.dcf_dr_code = record[2].strip() self.dcf_dr_yobi = record[3].strip() self.maint_flag = record[4].strip() - self.specialst_cd = record[5].strip() - self.specialst_maint_div = record[6].strip() + self.specialist_cd = record[5].strip() + self.specialist_maint_div = record[6].strip() - self.specialst_flg = record[9].strip() - self.specialst_publsh_ymd = record[10].strip() + self.specialist_flg = record[9].strip() + self.specialist_publsh_ymd = record[10].strip() self.ackn_med_flg = record[11].strip() self.ackn_med_publsh_ymd = record[12].strip() diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py similarity index 55% rename from ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py index 98ce930f..f79acceb 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialst_license.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/tables/com_specialist_license.py @@ -1,14 +1,14 @@ from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable -class ComSpecialstLicense(UltmarcTable): +class ComSpecialistLicense(UltmarcTable): """レイアウト区分010: COM_専門医資格""" - specialst_cd: str # 専門医コード - specialst_licens_name: str # 専門医資格名 + specialist_cd: str # 専門医コード + specialist_license_name: str # 専門医資格名 maint_flag: str # 修正区分 def __init__(self, record: list[str]): super().__init__(record) - self.specialst_cd = record[1] + self.specialist_cd = record[1] self.maint_flag = record[2] - self.specialst_licens_name = record[5] + self.specialist_license_name = record[5] diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py index b5adf693..ecd1f111 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/ultmarc_table_mapper_factory.py @@ -68,8 +68,8 @@ from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper imp ComBlngSecMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper import \ ComSosietyMapper -from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialst_license_mapper import \ - ComSpecialstLicenseMapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialist_license_mapper import \ + ComSpecialistLicenseMapper from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_div_mapper import \ ComInstDivMapper @@ -121,7 +121,7 @@ COM_TABLE_LIST = { # COM_学会 "009": ComSosietyMapper, # COM_専門医資格 - "010": ComSpecialstLicenseMapper, + "010": ComSpecialistLicenseMapper, # COM_施設区分 "011": ComInstDivMapper, # COM_高度先進医療 diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv index 2329287f..978f2a55 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_delete.csv @@ -1,4 +1,4 @@ -"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0199430100","0003","2","1","20170401","NULL","NULL","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" "0199578300","0003","2","1","20170221","1","20140810","","","20171008","20171011","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/11 21:20:37","clsComSpField" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv index 9167aa40..5c48b4e0 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/db_com_sp_field_before_update.csv @@ -1,4 +1,4 @@ -"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0199430100","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" "0199578300","0003","2","","","1","20140401","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv index eab607dc..f5423592 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_delete.csv @@ -1,2 +1,2 @@ -"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0199961300","9999","2","1","20140706","1","20140401","1","20140706","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv index f8720d26..b52c8c90 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_insert.csv @@ -1,4 +1,4 @@ -"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0199430100","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" "0199578300","0003","2","","","1","20140401","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" "0199768200","0004","2","1","20131112","","","","","20230425","NULL","NULL","NULL","NULL","NULL","NULL","2023/01/08 17:05:14","com_sp_field_mapper","2023/01/08 17:05:14","com_sp_field_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv index 73bf0e1b..64c17858 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/expect_com_sp_field_update.csv @@ -1,4 +1,4 @@ -"dcf_pcf_dr_cd","specialst_cd","specialst_maint_div","specialst_flg","specialst_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"dcf_pcf_dr_cd","specialist_cd","specialist_maint_div","specialist_flg","specialist_publsh_ymd","ackn_med_flg","ackn_med_publsh_ymd","guide_med_flg","guide_med_publsh_ymd","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0199430100","0003","2","1","20170401","","","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199578300","0003","2","1","20170221","1","20140810","","","20171008","20230425","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/09 20:21:51","com_sp_field_mapper" "0199768200","0004","2","1","20131112","","","","","20171008","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/08 17:05:14","clsComSpField","2017/10/08 17:05:14","clsComSpField" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py index bc9eda78..3f9a4d1f 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_sp_field/test_com_sp_field_mapper.py @@ -69,18 +69,18 @@ class TestComSpFieldMapper: # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_insert.csv')) primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] - primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] actual_data_list = [] sp_field_select_sql = """\ SELECT * FROM src05.com_sp_field WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd - AND specialst_cd = :specialst_cd\ + AND specialist_cd = :specialist_cd\ """ - for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): sp_field_data = self.db.execute_select( sp_field_select_sql, - {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) @@ -136,18 +136,18 @@ class TestComSpFieldMapper: # 期待値ファイルを読み込む expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_sp_field_update.csv')) primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] - primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] actual_data_list = [] sp_field_select_sql = """\ SELECT * FROM src05.com_sp_field WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd - AND specialst_cd = :specialst_cd\ + AND specialist_cd = :specialist_cd\ """ - for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): sp_field_data = self.db.execute_select( sp_field_select_sql, - {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) @@ -208,18 +208,18 @@ class TestComSpFieldMapper: actual_record_count = self.db.execute_select('SELECT COUNT(*) AS count_num FROM src05.com_sp_field')[0]['count_num'] assert actual_record_count == len(expect_data_list), 'DBのレコード件数が期待値の件数と一致すること' primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list] - primary_keys_specialst_cd = [{'specialst_cd': columns['specialst_cd']} for columns in expect_data_list] + primary_keys_specialist_cd = [{'specialist_cd': columns['specialist_cd']} for columns in expect_data_list] actual_data_list = [] sp_field_select_sql = """\ SELECT * FROM src05.com_sp_field WHERE dcf_pcf_dr_cd = :dcf_pcf_dr_cd - AND specialst_cd = :specialst_cd\ + AND specialist_cd = :specialist_cd\ """ - for param_dcf_pcf_dr_cd, param_specialst_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialst_cd): + for param_dcf_pcf_dr_cd, param_specialist_cd in zip(primary_keys_dcf_pcf_dr_cd, primary_keys_specialist_cd): sp_field_data = self.db.execute_select( sp_field_select_sql, - {**param_dcf_pcf_dr_cd, **param_specialst_cd}) + {**param_dcf_pcf_dr_cd, **param_specialist_cd}) assert len(sp_field_data) == 1, '1件取得できていること' actual_data_list.append(sp_field_data[0]) diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/__init__.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/__init__.py similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/__init__.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/__init__.py diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_delete.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_delete.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_insert.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_insert.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_insert.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_update.csv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/com_specialst_license_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/com_specialist_license_update.csv diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv similarity index 82% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv index 60f3d7fb..b1732476 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_delete.csv @@ -1,4 +1,4 @@ -"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"specialist_cd","specialist_license_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0001","","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" "0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" "0003","麻酔科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:46:19","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv similarity index 84% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv index 96ec417b..bac063fe 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/db_com_specialst_license_before_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/db_com_specialist_license_before_update.csv @@ -1,4 +1,4 @@ -"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"specialist_cd","specialist_license_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" "0001","皮膚科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" "0002","整形外科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" "0003","麻酔科専門医","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv similarity index 56% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv index b4d4506a..74e4b021 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_delete.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_delete.csv @@ -1,8 +1,8 @@ -"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0005","放射線科専門医","20171024","20171024","20230515","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialst_license_mapper" -"0007","耳鼻咽喉科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:47:40","com_specialst_license_mapper","2023/05/15 12:47:40","com_specialst_license_mapper" +"specialist_cd","specialist_license_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0002","整形外科専門医","20171024","20171024","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0005","放射線科専門医","20171024","20171024","20230515","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:47:40","com_specialist_license_mapper" +"0007","耳鼻咽喉科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:47:40","com_specialist_license_mapper","2023/05/15 12:47:40","com_specialist_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv new file mode 100644 index 00000000..92acbfc8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_insert.csv @@ -0,0 +1,8 @@ +"specialist_cd","specialist_license_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","皮膚科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0002","整形外科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0003","麻酔科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0004","産婦人科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0005","眼科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"0006","放射線科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" +"9999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialist_license_mapper","2023/05/15 12:03:03","com_specialist_license_mapper" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv similarity index 65% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv index 8125f178..6a33cc35 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_update.csv +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/expect_com_specialist_license_update.csv @@ -1,8 +1,8 @@ -"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" -"0002","整形外科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" -"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" -"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" -"0005","放射線科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" -"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialst_license_mapper" +"specialist_cd","specialist_license_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" +"0001","","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0002","整形外科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0003","麻酔科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0004","産婦人科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0005","放射線科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" +"0006","眼科専門医","20171024","20230515","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2023/05/15 12:46:19","com_specialist_license_mapper" "9999","ああああ","20171024","NULL","NULL","NULL","NULL","NULL","NULL","2017/10/24 12:03:03","clsComSpLicens","2017/10/24 12:03:03","clsComSpLicens" diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py similarity index 77% rename from ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py rename to ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py index d8693046..857e1c65 100644 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/test_com_specialst_license_mapper.py +++ b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialist_license/test_com_specialist_license_mapper.py @@ -4,7 +4,7 @@ from datetime import datetime import pytest from src.batch.common.batch_context import BatchContext -from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_specialst_license_mapper +from src.batch.ultmarc.utmp_tables.table_mapper.concrete import com_specialist_license_mapper from src.db.database import Database from tests.testing_utility import (assert_table_results, create_db_data_from_csv, @@ -14,7 +14,7 @@ from tests.testing_utility import (assert_table_results, create_ultmarc_test_data_from_csv) -class TestComSpecialstLicenseMapper: +class TestComSpecialistLicenseMapper: """レイアウト区分010: COM_専門医資格""" db: Database @@ -52,24 +52,24 @@ class TestComSpecialstLicenseMapper: # 処理日設定 self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む - test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_insert.csv')) + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_insert.csv')) # 一旦全データをDBから削除 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() # Assert # 期待値ファイルを読み込む - expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_insert.csv')) - primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] - actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_insert.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date'] @@ -97,16 +97,16 @@ class TestComSpecialstLicenseMapper: # 処理日設定 self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む - test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_update.csv')) + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_update.csv')) # 一旦全データをDBから削除 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) # テストデータをDBに登録 # DBデータを読み込む - test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialst_license_before_update.csv')) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialist_license_before_update.csv')) for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( - 'src05.com_specialst_license', + 'src05.com_specialist_license', test_data.keys(), test_data.values() ) @@ -114,16 +114,16 @@ class TestComSpecialstLicenseMapper: # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() # Assert # 期待値ファイルを読み込む - expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_update.csv')) - primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] - actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_update.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date'] @@ -154,16 +154,16 @@ class TestComSpecialstLicenseMapper: # 処理日設定 self.batch_context.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d') # テスト用のCSVを読み込む - test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialst_license_delete.csv')) + test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_specialist_license_delete.csv')) # 一旦全データをDBから削除 - delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialst_license', {'1': '1'}) + delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_specialist_license', {'1': '1'}) self.db.execute(delete_sql, delete_parameter) # テストデータをDBに登録 # DBデータを読み込む - test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialst_license_before_delete.csv')) + test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_specialist_license_before_delete.csv')) for test_data in test_sql_data_list: insert_sql, insert_parameter = create_insert_sql_with_parameter( - 'src05.com_specialst_license', + 'src05.com_specialist_license', test_data.keys(), test_data.values() ) @@ -171,16 +171,16 @@ class TestComSpecialstLicenseMapper: # Act for line_number, line in enumerate(test_dat_file, start=1): - sut: com_specialst_license_mapper.ComSpecialstLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) - assert type(sut) is com_specialst_license_mapper.ComSpecialstLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' + sut: com_specialist_license_mapper.ComSpecialistLicenseMapper = create_ultmarc_table_mapper_sut(line, self.db) + assert type(sut) is com_specialist_license_mapper.ComSpecialistLicenseMapper, f'{line_number}行目:マッパークラスが期通りか' sut.make_query() sut.execute_queries() # Assert # 期待値ファイルを読み込む - expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialst_license_delete.csv')) - primary_keys = [f"'{primary_key['specialst_cd']}'" for primary_key in expect_data_list] - actual_select_sql = f"SELECT * FROM src05.com_specialst_license WHERE specialst_cd IN ({','.join(primary_keys)})" + expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_specialist_license_delete.csv')) + primary_keys = [f"'{primary_key['specialist_cd']}'" for primary_key in expect_data_list] + actual_select_sql = f"SELECT * FROM src05.com_specialist_license WHERE specialist_cd IN ({','.join(primary_keys)})" actual_data_list = self.db.execute_select(actual_select_sql) # 期待値検査 ignore_columns = ['regist_ymd', 'update_ymd', 'delete_ymd', 'sys_update_date', 'sys_regist_date'] diff --git a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv b/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv deleted file mode 100644 index ef609890..00000000 --- a/ecs/jskult-batch-daily/tests/batch/ultmarc/utmp_tables/table_mapper/com_specialst_license/expect_com_specialst_license_insert.csv +++ /dev/null @@ -1,8 +0,0 @@ -"specialst_cd","specialst_licens_name","regist_ymd","update_ymd","delete_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id" -"0001","皮膚科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"0002","整形外科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"0003","麻酔科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"0004","産婦人科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"0005","眼科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"0006","放射線科専門医","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" -"9999","あいうえおかきくけこあいうえおかきくけこあいうえお","20230515","NULL","NULL","NULL","NULL","NULL","NULL","2023/05/15 12:03:03","com_specialst_license_mapper","2023/05/15 12:03:03","com_specialst_license_mapper" From 0267d7cd792480e58b40b5596825c8c73960414e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 18 May 2023 16:01:15 +0900 Subject: [PATCH 299/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utmp_tables/table_mapper/concrete/com_inst_att_mapper.py | 4 ++-- .../table_mapper/concrete/com_prefc_med_base_mapper.py | 4 ++-- .../table_mapper/concrete/com_prefc_med_dis_treat_mapper.py | 4 ++-- .../table_mapper/concrete/com_prefc_med_equpment_mapper.py | 4 ++-- .../table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py | 4 ++-- .../table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py index f1b52afd..b6deaef0 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_inst_att_mapper.py @@ -646,7 +646,7 @@ class ComInstAttMapper(UltmarcTableMapper): dcf_dsf_inst_cd = :dcfdsf_inst_code """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_inst_att @@ -665,7 +665,7 @@ class ComInstAttMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py index 7605fc30..2c8bd8e0 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_base_mapper.py @@ -179,7 +179,7 @@ class ComPrefcMedBaseMapper(UltmarcTableMapper): dcf_dsf_inst_cd = :dcfdsf_inst_code """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_prefc_med_base @@ -198,7 +198,7 @@ class ComPrefcMedBaseMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py index 6298160b..0cc65001 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_dis_treat_mapper.py @@ -58,7 +58,7 @@ class ComPrefcMedDisTreatMapper(UltmarcTableMapper): treatment_code = :treatment_code """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_prefc_med_dis_treat @@ -79,7 +79,7 @@ class ComPrefcMedDisTreatMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py index ed9cf467..4d345900 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_equpment_mapper.py @@ -58,7 +58,7 @@ class ComPrefcMedEqupmentMapper(UltmarcTableMapper): equipment_code = :equipment_code """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_prefc_med_equpment @@ -79,7 +79,7 @@ class ComPrefcMedEqupmentMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py index f2c84587..d1883e68 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sojourn_ope_mapper.py @@ -54,7 +54,7 @@ class ComPrefcMedSojournOpeMapper(UltmarcTableMapper): cos_surgery_code = :cos_surgery_code """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_prefc_med_sojourn_ope @@ -75,7 +75,7 @@ class ComPrefcMedSojournOpeMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py index 182616d5..149b2c76 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/utmp_tables/table_mapper/concrete/com_prefc_med_sp_outpat_mapper.py @@ -59,7 +59,7 @@ class ComPrefcMedSpOutpatMapper(UltmarcTableMapper): specialclinic_name = :specialclinic_name """ - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 PHYSICAL_DELETE_QUERY = """\ DELETE FROM src05.com_prefc_med_sp_outpat @@ -80,7 +80,7 @@ class ComPrefcMedSpOutpatMapper(UltmarcTableMapper): self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()} def make_query(self): - # 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除 + # 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除 if self.record.maint_flag == 'B' and self.record.adddel_div == '1': self.queries.append(self.PHYSICAL_DELETE_QUERY) return From f7957af13bfd71de522bc69fb7bbb0d059c4cc93 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 18 May 2023 16:22:02 +0900 Subject: [PATCH 300/962] =?UTF-8?q?=E6=83=B3=E5=AE=9A=E5=A4=96=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=8F=97=E9=A0=98=E7=A2=BA?= =?UTF-8?q?=E8=AA=8D=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 想定ファイル数、卸在庫データ取込対象日の場合は15、そうでない場合は14 --- .../src/batch/vjsk/vjsk_importer.py | 5 +++++ .../tests/batch/vjsk/vjsk_load/test_vjsk_load.py | 13 ++++++++++--- .../tests/batch/vjsk/vjsk_load/testdata/dummy.gz | Bin 107 -> 0 bytes 3 files changed, 15 insertions(+), 3 deletions(-) delete mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/dummy.gz diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py index 23fc8e5d..694f93ac 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_importer.py @@ -150,6 +150,11 @@ def _check_received_files() -> list: if not _check_if_file_exists(received_s3_files, vjsk_mapper.CONDKEY_LOT_NUM_MST): raise BatchOperationException(f'製造ロット番号マスタファイルがありません ファイル一覧:{received_s3_files}') + # 想定外ファイルの受領確認 (想定ファイル数、卸在庫データ取込対象日の場合は15、そうでない場合は14) + naturally_count = 15 if batch_context.is_vjsk_stock_import_day else 14 + if len(received_s3_files) > naturally_count: + raise BatchOperationException(f'想定数を超える受領ファイルがあります ファイル一覧:{received_s3_files}') + logger.debug('_check_received_files done') return received_s3_files diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 43afd62c..8dac0688 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -2,6 +2,7 @@ from os import path import pytest +from src.aws.s3 import VjskReceiveBucket from src.batch.common.batch_context import BatchContext # from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager from src.batch.vjsk.vjsk_importer import (_check_received_files, @@ -40,9 +41,16 @@ class TestImportFileToDb: 期待値 例外が発生しない """ - # setup + # setup - 卸在庫データ取込対象日 self.batch_context.is_vjsk_stock_import_day = True + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload test_files = [ "stock_slip_data_202304270000.gz", "slip_data_202304270000.gz", @@ -58,8 +66,7 @@ class TestImportFileToDb: "whs_customer_mst_202304270000.gz", "mdb_conv_mst_202304270000.gz", "bio_slip_data_202304270000.gz", - "lot_num_mst_202304270000.gz", - "dummy.gz" + "lot_num_mst_202304270000.gz" ] for test_file in test_files: file_name = path.join(self.test_file_path, test_file) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/dummy.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/dummy.gz deleted file mode 100644 index fb34f9372aaf78634f82e936651d484182b6cc88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmV-x0F?h9iwFqlUu0wi0AzJ-ZFw$qVR8WN(LoA;Fc1U4JjEACmbUJD1h2j57WDU` zg1*2~=*}gVKn__-&c|rG;Xf2oRl&!XuLOxP2$N1KxY`mh5EYco<`t~6)u8)-IOm+} N%?T+)6;uES0074AF75yT From bb1c545a44511640a3b908b054f81859298a204c Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 18 May 2023 16:35:05 +0900 Subject: [PATCH 301/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_file_check/conftest.py | 150 ++++++++++++++++++ .../vjsk_file_check/test_vjsk_file_check.py | 32 ++++ 2 files changed, 182 insertions(+) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index 0778241d..c315147a 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -1225,3 +1225,153 @@ def init_check_received_files_ng15(s3_client, bucket_name, receive_folder): Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') # s3_client.delete_object(Bucket=bucket_name, # Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng16(s3_client, bucket_name, receive_folder): + # setup + + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz') + + +@pytest.fixture +def init_check_received_files_ng17(s3_client, bucket_name, receive_folder): + # setup + + # s3_client.put_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + s3_client.put_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz', Body=b'aaaaaaaaaaaaaaa') + + yield + + # treadown + + # s3_client.delete_object(Bucket=bucket_name, + # Key=f'{receive_folder}/stock_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/org_cnv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/vop_hco_merge_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/hld_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/fcl_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mkr_org_horizon_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/tran_kbn_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_prd_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/phm_price_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/whs_customer_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/mdb_conv_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/bio_slip_data_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/lot_num_mst_00000000000000.gz') + s3_client.delete_object(Bucket=bucket_name, + Key=f'{receive_folder}/dummy_00000000000000.gz') diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py index 43062be1..99b31d68 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -269,3 +269,35 @@ def test_check_received_files_ng15(init_check_received_files_ng15): _check_received_files() assert str(e.value).startswith("製造ロット番号マスタファイルがありません") > 0 + + +def test_check_received_files_ng16(init_check_received_files_ng16): + """ + 観点 + 異常系 : 想定外のファイルが受領されている(卸在庫データ取込対象日) + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = True + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("想定数を超える受領ファイルがあります") > 0 + + +def test_check_received_files_ng17(init_check_received_files_ng17): + """ + 観点 + 異常系 : 想定外のファイルが受領されている(卸在庫データ取込対象日) + 期待値 + 例外が発生する + """ + batch_context = BatchContext.get_instance() + batch_context.is_vjsk_stock_import_day = False + + with pytest.raises(BatchOperationException) as e: + _check_received_files() + + assert str(e.value).startswith("想定数を超える受領ファイルがあります") > 0 From 94016f513d9eb9004f9883dbf3db52fac76a8a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 18 May 2023 18:04:16 +0900 Subject: [PATCH 302/962] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E6=97=A5=E6=AC=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=83=90=E3=83=83=E3=83=81(=E9=80=94=E4=B8=AD?= =?UTF-8?q?=E3=81=BE=E3=81=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Integrate_dcf_inst_merge.py | 547 ++++++++++++++++++ 1 file changed, 547 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py 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..fa6ce77a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py @@ -0,0 +1,547 @@ +from datetime import datetime, timedelta +from sqlalchemy import CursorResult +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('DCF施設統合マスタ日次更新バッチ') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.begin() + # + enabled_dst_inst_merge_records = _laundering_enabled_dct_inst_merge(db) + # + _laundering_disabled_dct_inst_merge(db) + # + if len(enabled_dst_inst_merge_records) > 0: + logger.info('') + _add_emp_chg_inst(db, enabled_dst_inst_merge_records) + logger.info('') + _add_ult_ident_presc(db, enabled_dst_inst_merge_records) + db.commit() + # + logger.info('') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _laundering_enabled_dct_inst_merge(db: Database) -> list[dict]: + # データ取得(無効フラグが『0(有効)』) + valid_dst_inst_merge_records = _select_dct_inst_merge(db, 0, True) + # 移行先DCF施設コードの更新(無効フラグが『0(有効)』) + _update_dcf_inst_merge(db, 0) + # DCF施設統合マスタの過去分の洗い替え + if len(valid_dst_inst_merge_records) == 0: + return + for row in valid_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) + + return valid_dst_inst_merge_records + + +def _laundering_disabled_dct_inst_merge(db: Database): + # データ取得(無効フラグが『1(無効)』) + disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1, False) + # 移行先DCF施設コードの更新(無効フラグが『1(無効)』) + _update_dcf_inst_merge(db, 1) + # DCF施設統合マスタの過去分の洗い替え + if len(disabled_dst_inst_merge_records) == 0: + return + for row in disabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) + + +def _add_ult_ident_presc(db: Database, valid_dst_inst_merge_records: list[dict]): + # + for data_inst_cnt, row in enumerate(valid_dst_inst_merge_records, start=1): + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + + ult_ident_presc_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for data_cnt, ult_row in enumerate(ult_ident_presc_records, start=1): + logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') + # 処方元コード=重複時相手先コードが発生した場合 + if ult_row['opp_count'] > 0: + break + + start_date = _str_to_date_time(ult_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_delete_duplicate_key = False + if _count_duplicate_ult_ident_presc(db, set_start_date, ult_row): + _delete_ult_ident_presc(db, set_start_date, ult_row) + is_delete_duplicate_key = True + else: + logger.info('納入先処方元マスタの重複予定データなし') + _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_row) + + if _str_to_date_time(ult_row['end_date']) < start_date: + _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + continue + if not is_delete_duplicate_key: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_row) + if start_date > last_end_date: + _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + + +def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult): + # + 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 = :set_start_date + """ + params = { + 'ta_cd': ult_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_row['ratio'], + 'start_date': start_date + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + + +def _add_emp_chg_inst(db: Database, valid_dst_inst_merge_records: list[dict]): + # + for row in valid_dst_inst_merge_records: + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for emp_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_row['opp_count'] > 0: + break + + start_date = _str_to_date_time(emp_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, row['dup_opp_cd'], _date_time_to_str(set_start_date), emp_row) + + if start_date < tekiyo_month_first_day: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_row) + if start_date <= last_end_date: + continue + _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], emp_row['start_date']) + + # if start_date >= tekiyo_month_first_day: + # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) + # continue + # last_end_date = tekiyo_month_first_day - timedelta(days=1) + # _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], last_end_date, emp_row) + # if start_date > last_end_date: + # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) + + +def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): + # + 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'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, emp_row: CursorResult): + # + 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_row['ta_cd'], + 'emp_cd': emp_row['emp_cd'], + 'bu_cd': emp_row['bu_cd'], + 'start_date': emp_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_row: CursorResult): + # + 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_row['ta_cd'], + 'emp_cd': emp_row['emp_cd'], + 'bu_cd': emp_row['bu_cd'], + 'start_date': set_start_date, + 'end_date': emp_row['end_date'], + 'main_chg_flg': emp_row['main_chg_flg'] if emp_row['main_chg_flg'] is None else None + } + 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, is_null_dcf_inst_cd_new: bool): + # + 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_null_dcf_inst_cd_new + """ + params = { + 'muko_flg': muko_flg, + 'is_null_dcf_inst_cd_new': None + } + dst_inst_merge_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + + return dst_inst_merge_records + + +def _update_dcf_inst_merge(db: Database, muko_flg: int): + # + try: + elapsed_time = ElapsedTime() + 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 {$dcfInstCdNew}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 + """ + params = { + 'muko_flg': muko_flg + } + res = db.execute(sql.format( + column='base_dup_opp_cd' if muko_flg == 1 else 'NULL' + ), params) + logging_sql(logger, sql) + logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str): + # + 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施設コードの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_record: CursorResult): + # + 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_record['ta_cd'], + 'ult_ident_cd': ult_ident_presc_record['ult_ident_cd'], + 'ratio': ult_ident_presc_record['ratio'], + 'start_date': ult_ident_presc_record['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_row: CursorResult): + # + 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_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_row['ratio'], + 'start_date': set_Start_Date, + 'presc_cd': dup_opp_cd, + 'end_date': ult_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) -> list[dict]: + # + 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) AS opp_count + FROM + src05.emp_chg_inst AS eci + WHERE + eci.inst_cd = :dcf_inst_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} + 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) -> list[dict]: + # + try: + sql = """ + SELECT + uip.ta_cd, + uip.ult_ident_cd, + uip.ratio, + uip.start_date, + uip.end_date, + (SELECT COUNT(uipopp.ta_cd) FROM ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd) AS opp_count + FROM + src05.ult_ident_presc AS uip + WHERE + uip.presc_cd = '{$dcfInstCd}' + 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} + 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_row: CursorResult): + # + 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 = :set_Start_Date + """ + params = { + 'ta_cd': ult_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_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(month_day: str): + return datetime.datetime.strptime(month_day, '%Y%m01') + + +def _str_to_date_time(str_date_time: str): + return datetime.datetime.strptime(str_date_time, '%Y%m%d') + + +def _date_time_to_str(date_time: datetime): + return date_time.strptime('%Y%m%d') From d9be5544335274832f54d003c104d76b771a378e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 May 2023 12:11:30 +0900 Subject: [PATCH 303/962] =?UTF-8?q?feat:=20=E8=A8=AD=E5=AE=9A=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=8B=E3=82=89User=5FID=5F=5Fc?= =?UTF-8?q?=E3=82=92=E5=8F=96=E3=82=8A=E9=99=A4=E3=81=84=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 6 ++---- s3/data/crm/settings/CRM_Event.txt | 6 +++--- s3/data/crm/settings/CRM_Task.txt | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) 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 f6a7d9c7..6b9ad63e 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3174,8 +3174,7 @@ "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", "MSJ_Task_Source__c", - "MSJ_Visit_Type__c", - "User_ID__c" + "MSJ_Visit_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -3232,8 +3231,7 @@ "MSJ_Reason_ID__c", "MSJ_Task_External_Id__c", "MSJ_Task_Source__c", - "MSJ_Visit_Type__c", - "User_ID__c" + "MSJ_Visit_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt index dc25267f..ed6c978e 100644 --- a/s3/data/crm/settings/CRM_Event.txt +++ b/s3/data/crm/settings/CRM_Event.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -60 -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,User_ID__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,User_ID__c +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_Task.txt b/s3/data/crm/settings/CRM_Task.txt index 29aa0f0a..45e1735b 100644 --- a/s3/data/crm/settings/CRM_Task.txt +++ b/s3/data/crm/settings/CRM_Task.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -51 -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,User_ID__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,User_ID__c +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 From c46b4ad552b55d503e883ee2e659dbee9575e6b8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 May 2023 14:47:14 +0900 Subject: [PATCH 304/962] =?UTF-8?q?feat:=20=E8=87=AA=E5=8B=95=E9=96=8B?= =?UTF-8?q?=E5=A7=8B=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/start-rds/start-rds.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lambda/start-rds/start-rds.py diff --git a/lambda/start-rds/start-rds.py b/lambda/start-rds/start-rds.py new file mode 100644 index 00000000..a077cb88 --- /dev/null +++ b/lambda/start-rds/start-rds.py @@ -0,0 +1,29 @@ +import os + +import boto3 + +#環境変数 +client = boto3.client('rds') + +AUTO_START_TAG_TAGKEY = 'AUTO_START' +AUTO_START_ENABLE = 'true' + +def lambda_handler(event, context): + #クラスターを停止 + clusters = client.describe_db_clusters() + for cluster in clusters['DBClusters']: + if cluster['Status'] == "stopped": + tags = client.list_tags_for_resource(ResourceName=cluster['DBClusterArn']) + for tag in tags['TagList']: + if tag['Key'] == AUTO_START_TAG_TAGKEY and tag['Value'] == AUTO_START_ENABLE: + client.start_db_cluster(DBClusterIdentifier=cluster['DBClusterIdentifier']) + + #インスタンスを停止 + instances = client.describe_db_instances() + for instance in instances['DBInstances']: + if instance['DBInstanceStatus'] == "stopped": + tags = client.list_tags_for_resource(ResourceName=instance['DBInstanceArn']) + for tag in tags['TagList']: + if tag['Key'] == AUTO_START_TAG_TAGKEY and tag['Value'] == AUTO_START_ENABLE: + client.start_db_instance(DBInstanceIdentifier=instance['DBInstanceIdentifier']) + From 509fb61218c86ea7b507e0d8de4f779cad82c0ee Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 May 2023 14:50:30 +0900 Subject: [PATCH 305/962] =?UTF-8?q?fix:=20=E3=82=BF=E3=82=B0=E5=90=8D?= =?UTF-8?q?=E3=81=A8=E5=80=A4=E3=81=AF=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=8F=96=E3=82=8B=EF=BC=88stop=E3=82=92?= =?UTF-8?q?=E8=B8=8F=E8=A5=B2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/start-rds/start-rds.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lambda/start-rds/start-rds.py b/lambda/start-rds/start-rds.py index a077cb88..b35d7650 100644 --- a/lambda/start-rds/start-rds.py +++ b/lambda/start-rds/start-rds.py @@ -5,8 +5,8 @@ import boto3 #環境変数 client = boto3.client('rds') -AUTO_START_TAG_TAGKEY = 'AUTO_START' -AUTO_START_ENABLE = 'true' +AUTO_START_TAG_TAGKEY = os.environ['AUTO_START_TAG_TAGKEY'] +AUTO_START_ENABLE = os.environ['AUTO_START_ENABLE'] def lambda_handler(event, context): #クラスターを停止 From 0e643c21ba9e0a4199841bb0f719939267f4a01a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 May 2023 14:51:25 +0900 Subject: [PATCH 306/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=8C=E5=98=98=E4=BB=98=E3=81=84=E3=81=A6=E3=82=8B?= =?UTF-8?q?=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/start-rds/start-rds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/start-rds/start-rds.py b/lambda/start-rds/start-rds.py index b35d7650..ee4f4b9b 100644 --- a/lambda/start-rds/start-rds.py +++ b/lambda/start-rds/start-rds.py @@ -2,9 +2,9 @@ import os import boto3 -#環境変数 client = boto3.client('rds') +#環境変数 AUTO_START_TAG_TAGKEY = os.environ['AUTO_START_TAG_TAGKEY'] AUTO_START_ENABLE = os.environ['AUTO_START_ENABLE'] From 75db3d2251968850ce4d1834d83ed39bef0d4461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 19 May 2023 16:37:03 +0900 Subject: [PATCH 307/962] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E6=97=A5=E6=AC=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=83=90=E3=83=83=E3=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Integrate_dcf_inst_merge.py | 358 ++++++++++-------- 1 file changed, 193 insertions(+), 165 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py index fa6ce77a..c37a3a30 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py @@ -7,8 +7,8 @@ from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime -logger = get_logger('DCF施設統合マスタ日次更新バッチ') batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ日次更新バッチ') def exec(): @@ -16,19 +16,17 @@ def exec(): try: db.connect() db.begin() - # - enabled_dst_inst_merge_records = _laundering_enabled_dct_inst_merge(db) - # - _laundering_disabled_dct_inst_merge(db) - # + 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: - logger.info('') _add_emp_chg_inst(db, enabled_dst_inst_merge_records) - logger.info('') _add_ult_ident_presc(db, enabled_dst_inst_merge_records) db.commit() - # - logger.info('') + logger.info('DCF施設統合マスタ日次更新バッチ処理終了') except Exception as e: db.rollback() raise BatchOperationException(e) @@ -36,68 +34,101 @@ def exec(): db.disconnect() -def _laundering_enabled_dct_inst_merge(db: Database) -> list[dict]: +def _set_enabled_dct_inst_merge(db: Database) -> list[dict]: # データ取得(無効フラグが『0(有効)』) - valid_dst_inst_merge_records = _select_dct_inst_merge(db, 0, True) + enabled_dst_inst_merge_records = _select_dct_inst_merge(db, 0) # 移行先DCF施設コードの更新(無効フラグが『0(有効)』) - _update_dcf_inst_merge(db, 0) - # DCF施設統合マスタの過去分の洗い替え - if len(valid_dst_inst_merge_records) == 0: - return - for row in valid_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) + 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 valid_dst_inst_merge_records + return enabled_dst_inst_merge_records -def _laundering_disabled_dct_inst_merge(db: Database): +def _set_disabled_dct_inst_merge(db: Database): # データ取得(無効フラグが『1(無効)』) - disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1, False) + disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1) # 移行先DCF施設コードの更新(無効フラグが『1(無効)』) - _update_dcf_inst_merge(db, 1) - # DCF施設統合マスタの過去分の洗い替え - if len(disabled_dst_inst_merge_records) == 0: - return - for row in disabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) + 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 _add_ult_ident_presc(db: Database, valid_dst_inst_merge_records: list[dict]): - # - for data_inst_cnt, row in enumerate(valid_dst_inst_merge_records, start=1): +def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): + # 納入先処方元マスタの追加 + logger.info('納入先処方元マスタの登録 開始') + for data_inst_cnt, row in enumerate(enabled_dst_inst_merge_records, start=1): tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) ult_ident_presc_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) - for data_cnt, ult_row in enumerate(ult_ident_presc_records, start=1): + 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_row['opp_count'] > 0: + if ult_ident_presc_row['opp_count'] > 0: break - start_date = _str_to_date_time(ult_row['start_date']) + 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_delete_duplicate_key = False - if _count_duplicate_ult_ident_presc(db, set_start_date, ult_row): - _delete_ult_ident_presc(db, set_start_date, ult_row) - is_delete_duplicate_key = True + 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, row['dup_opp_cd'], ult_row) + _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_ident_presc_row) - if _str_to_date_time(ult_row['end_date']) < start_date: - _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '開始月>適用開始日のため物理削除') continue - if not is_delete_duplicate_key: + if not is_exists_duplicate_key: last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_row) - if start_date > last_end_date: - _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + if start_date > last_end_date: + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '適用終了日更新後 開始日>終了日のため物理削除') + + logger.info('納入先処方元マスタの登録 終了') -def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult): - # +def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): + # 従業員担当施設マスタの登録 + logger.info('従業員担当施設マスタの登録 開始') + for row in enabled_dst_inst_merge_records: + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for emp_chg_inst_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_chg_inst_row['opp_count'] > 0: + break + + 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, row['dup_opp_cd'], _date_time_to_str(set_start_date), + emp_chg_inst_row) + + if start_date < tekiyo_month_first_day: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), + emp_chg_inst_row) + if start_date <= last_end_date: + continue + _update_emp_chg_inst_enabled_flg(db, row['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: CursorResult, + log_message: str): + # ult_ident_prescのDelete try: elapsed_time = ElapsedTime() sql = """ @@ -107,56 +138,24 @@ def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd AND ratio = :ratio - AND start_date = :set_start_date + AND start_date = :start_date """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], + '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('') + logger.info(f'{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug(f'{log_message} 失敗') raise e -def _add_emp_chg_inst(db: Database, valid_dst_inst_merge_records: list[dict]): - # - for row in valid_dst_inst_merge_records: - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) - emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) - for emp_row in emp_chg_inst_records: - # 重複時相手先コードが存在したかのチェック - if emp_row['opp_count'] > 0: - break - - start_date = _str_to_date_time(emp_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, row['dup_opp_cd'], _date_time_to_str(set_start_date), emp_row) - - if start_date < tekiyo_month_first_day: - last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_row) - if start_date <= last_end_date: - continue - _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], emp_row['start_date']) - - # if start_date >= tekiyo_month_first_day: - # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) - # continue - # last_end_date = tekiyo_month_first_day - timedelta(days=1) - # _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], last_end_date, emp_row) - # if start_date > last_end_date: - # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) - - def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): - # + # emp_chg_instを更新 try: elapsed_time = ElapsedTime() sql = """ @@ -174,14 +173,15 @@ def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, 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'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'従業員担当施設マスタのYorNフラグ更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタのYorNフラグ更新に失敗') raise e -def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, emp_row: CursorResult): - # +def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, + emp_chg_inst_row: CursorResult): + # emp_chg_instを更新 try: elapsed_time = ElapsedTime() sql = """ @@ -200,21 +200,22 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: params = { 'end_date': last_end_date, 'dcf_inst_cd': dcf_inst_cd, - 'ta_cd': emp_row['ta_cd'], - 'emp_cd': emp_row['emp_cd'], - 'bu_cd': emp_row['bu_cd'], - 'start_date': emp_row['start_date'] + '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})') + logger.info(f'従業員担当施設マスタの適用終了日更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタの適用終了日更新 失敗') raise e -def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, emp_row: CursorResult): - # +def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, + emp_chg_inst_row: CursorResult): + # emp_chg_instにInsert try: elapsed_time = ElapsedTime() sql = """ @@ -250,23 +251,24 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, emp """ params = { 'dup_opp_cd': dup_opp_cd, - 'ta_cd': emp_row['ta_cd'], - 'emp_cd': emp_row['emp_cd'], - 'bu_cd': emp_row['bu_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_row['end_date'], - 'main_chg_flg': emp_row['main_chg_flg'] if emp_row['main_chg_flg'] is None else None + '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('') + logger.debug('従業員担当施設マスタの追加に失敗') raise e -def _select_dct_inst_merge(db: Database, muko_flg: int, is_null_dcf_inst_cd_new: bool): - # +def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: + # dcf_inst_mergeからSelect try: sql = """ SELECT @@ -279,25 +281,26 @@ def _select_dct_inst_merge(db: Database, muko_flg: int, is_null_dcf_inst_cd_new: src05.hdke_tbl AS ht ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE - dim.muko_flg =: muko_flg + dim.muko_flg = :muko_flg AND dim.enabled_flg = 'Y' - AND dim.dcf_inst_cd_new <= >: is_null_dcf_inst_cd_new - """ + AND dim.dcf_inst_cd_new IS {not_null}NULL + """.format( + not_null='' if muko_flg == 0 else 'NOT ' + ) params = { - 'muko_flg': muko_flg, - 'is_null_dcf_inst_cd_new': None + 'muko_flg': muko_flg } dst_inst_merge_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('DCF施設統合マスタの取得に成功') except Exception as e: - logger.debug('') + logger.debug('DCF施設統合マスタの取得に失敗') raise e return dst_inst_merge_records -def _update_dcf_inst_merge(db: Database, muko_flg: int): +def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # try: elapsed_time = ElapsedTime() @@ -319,7 +322,7 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int): WHERE dim.muko_flg= :muko_flg AND dim.enabled_flg='Y' - AND dim.dcf_inst_cd_new IS {$dcfInstCdNew}NULL + AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim SET updim.dcf_inst_cd_new = {column}, @@ -329,24 +332,27 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int): 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 - """ + 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.format( - column='base_dup_opp_cd' if muko_flg == 1 else 'NULL' - ), params) + res = db.execute(sql, params) logging_sql(logger, sql) logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('DCF施設統合マスタの更新に失敗') 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): - # + # dcf_inst_mergeをUpdate try: elapsed_time = ElapsedTime() sql = """ @@ -361,17 +367,20 @@ def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_c 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} + 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施設コードの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('移行先DCF施設コードの更新に失敗') raise e -def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_record: CursorResult): - # +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: CursorResult): + # ult_ident_presc_endをUpdate try: elapsed_time = ElapsedTime() sql = """ @@ -388,21 +397,22 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident """ params = { 'end_date': last_end_date, - 'ta_cd': ult_ident_presc_record['ta_cd'], - 'ult_ident_cd': ult_ident_presc_record['ult_ident_cd'], - 'ratio': ult_ident_presc_record['ratio'], - 'start_date': ult_ident_presc_record['start_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})') + logger.info(f'終了日 > 開始月のため適用終了日を更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('終了日 > 開始月のため適用終了日を更新 失敗') raise e -def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, ult_row: CursorResult): - # +def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, + ult_ident_presc_row: CursorResult): + # ult_ident_prescにInsert try: elapsed_time = ElapsedTime() sql = """ @@ -419,7 +429,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, update_date, updater ) - VALUES( + VALUES( :ta_cd, :ult_ident_cd, :ratio, @@ -433,23 +443,23 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, ) """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], + '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_row['end_date'] + '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})') + logger.info(f'納入先処方元マスタに追加 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('納入先処方元マスタに追加に失敗') + logger.debug('納入先処方元マスタに追加 失敗') raise e def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # + # emp_chg_instから取得 try: sql = """ SELECT @@ -461,7 +471,14 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis 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) AS opp_count + ( + SELECT + COUNT(eciopp.inst_cd) + FROM + src05.emp_chg_inst AS eciopp + WHERE + eciopp.inst_cd = :dup_opp_cd + ) AS opp_count FROM src05.emp_chg_inst AS eci WHERE @@ -472,15 +489,15 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} emp_chg_inst_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('従業員担当施設マスタの取得 成功') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタの取得 失敗') raise e return emp_chg_inst_records def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # + # ult_ident_prescから取得 try: sql = """ SELECT @@ -489,25 +506,33 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> uip.ratio, uip.start_date, uip.end_date, - (SELECT COUNT(uipopp.ta_cd) FROM ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd) AS opp_count + ( + SELECT + COUNT(uipopp.ta_cd) + FROM + ult_ident_presc AS uipopp + WHERE + uipopp.presc_cd = :dup_opp_cd + ) AS opp_count FROM src05.ult_ident_presc AS uip WHERE - uip.presc_cd = '{$dcfInstCd}' + uip.presc_cd = :dcf_inst_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} ult_ident_presc_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('納入先処方元マスタの取得 成功') except Exception as e: - logger.debug('') + logger.debug('納入先処方元マスタの取得 失敗') raise e return ult_ident_presc_records -def _count_duplicate_ult_ident_presc(db: Database, set_Start_Date: str, ult_row: CursorResult): - # +def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str, + ult_ident_presc_row: CursorResult) -> int: + # ult_ident_prescの重複時相手先コードの件数取得 try: sql = """ SELECT @@ -518,30 +543,33 @@ def _count_duplicate_ult_ident_presc(db: Database, set_Start_Date: str, ult_row: ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd AND ratio = :ratio - AND start_date = :set_Start_Date + AND start_date = :start_date """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], - 'start_date': set_Start_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': set_start_date } result = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('納入先処方元マスタの重複予定データの存在チェック 成功') except Exception as e: - logger.debug('') + logger.debug('納入先処方元マスタの重複予定データの存在チェック 失敗') raise e return result[0]['cnt'] -def _get_first_day_of_month(month_day: str): - return datetime.datetime.strptime(month_day, '%Y%m01') +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): - return datetime.datetime.strptime(str_date_time, '%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): - return date_time.strptime('%Y%m%d') +def _date_time_to_str(date_time: datetime) -> str: + # date_timeをYmd型に変換して返却する + return date_time.strftime('%Y%m%d') From 3b369b8fc40b258792455aa647e4007f99708398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 19 May 2023 16:48:11 +0900 Subject: [PATCH 308/962] =?UTF-8?q?feat:=20=E8=B5=B7=E5=8B=95=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 1a82f226..71fbea90 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,6 +7,7 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile +from src.batch.dcf_inst_merge import Integrate_dcf_inst_merge from src.batch.laundering import create_dcf_inst_merge, mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException @@ -114,6 +115,14 @@ def exec(): logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + try: + logger.info('DCF施設統合マスタ日次更新バッチ:起動') + Integrate_dcf_inst_merge.exec() + logger.info('DCF施設統合マスタ日次更新バッチ:終了') + except BatchOperationException as e: + logger.exception(f'DCF施設統合マスタ日次更新バッチエラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 logger.info('業務日付更新・バッチステータスリフレッシュ:起動') try: From 71fcc76ade81e04f6a378ea1baca51b275462107 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 24 May 2023 10:34:58 +0900 Subject: [PATCH 309/962] =?UTF-8?q?feat:=20Survey=5FTarget=5Fvod=5F=5Fc?= =?UTF-8?q?=E3=81=AB=E9=A0=85=E7=9B=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 1 + s3/data/crm/settings/CRM_Survey_Target_vod__c.txt | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) 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 6b9ad63e..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", 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 From 7da4be471c97a1eba6b3fe86e6342c8272ff9021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 15:30:51 +0900 Subject: [PATCH 310/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...t_merge.py => integrate_dcf_inst_merge.py} | 87 ++++++++++--------- .../src/batch/laundering/sales_laundering.py | 3 + ecs/jskult-batch-daily/src/jobctrl_daily.py | 9 -- 3 files changed, 51 insertions(+), 48 deletions(-) rename ecs/jskult-batch-daily/src/batch/dcf_inst_merge/{Integrate_dcf_inst_merge.py => integrate_dcf_inst_merge.py} (83%) 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 similarity index 83% rename from ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py rename to ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index c37a3a30..ffb2ba06 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -1,5 +1,4 @@ from datetime import datetime, timedelta -from sqlalchemy import CursorResult from src.batch.batch_functions import logging_sql from src.batch.common.batch_context import BatchContext from src.db.database import Database @@ -8,7 +7,7 @@ from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime batch_context = BatchContext.get_instance() -logger = get_logger('DCF施設統合マスタ日次更新バッチ') +logger = get_logger('DCF施設統合マスタ日次更新') def exec(): @@ -16,7 +15,7 @@ def exec(): try: db.connect() db.begin() - logger.debug('DCF施設統合マスタ日次更新バッチ処理開始') + logger.debug('DCF施設統合マスタ日次更新処理開始') # DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』) enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db) # DCF施設統合マスタ移行先コードのセット(無効フラグが『1(無効)』) @@ -26,7 +25,7 @@ def exec(): _add_emp_chg_inst(db, enabled_dst_inst_merge_records) _add_ult_ident_presc(db, enabled_dst_inst_merge_records) db.commit() - logger.info('DCF施設統合マスタ日次更新バッチ処理終了') + logger.debug('DCF施設統合マスタ日次更新処理終了') except Exception as e: db.rollback() raise BatchOperationException(e) @@ -59,10 +58,11 @@ def _set_disabled_dct_inst_merge(db: Database): def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): # 納入先処方元マスタの追加 logger.info('納入先処方元マスタの登録 開始') - for data_inst_cnt, row in enumerate(enabled_dst_inst_merge_records, start=1): - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + 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_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) + ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], + enabled_merge_record['dup_opp_cd']) for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') # 処方元コード=重複時相手先コードが発生した場合 @@ -80,13 +80,17 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict is_exists_duplicate_key = True else: logger.info('納入先処方元マスタの重複予定データなし') - _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_ident_presc_row) + _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) + # 適用終了日 < 適用開始日の場合 if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + # 対象レコードを物理削除する _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, '開始月>適用開始日のため物理削除') continue + # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 if not is_exists_duplicate_key: + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 last_end_date = tekiyo_month_first_day - timedelta(days=1) _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) if start_date > last_end_date: @@ -99,9 +103,9 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): # 従業員担当施設マスタの登録 logger.info('従業員担当施設マスタの登録 開始') - for row in enabled_dst_inst_merge_records: - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) - emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + 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_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd']) for emp_chg_inst_row in emp_chg_inst_records: # 重複時相手先コードが存在したかのチェック if emp_chg_inst_row['opp_count'] > 0: @@ -111,22 +115,24 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): set_start_date = start_date \ if start_date > tekiyo_month_first_day else tekiyo_month_first_day - _insert_emp_chg_inst(db, row['dup_opp_cd'], _date_time_to_str(set_start_date), + _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, row['dcf_inst_cd'], _date_time_to_str(last_end_date), + _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_chg_inst_row) - if start_date <= last_end_date: - continue - _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], - emp_chg_inst_row['start_date']) + 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: CursorResult, +def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: dict, log_message: str): # ult_ident_prescのDelete try: @@ -154,8 +160,8 @@ def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: raise e -def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): - # emp_chg_instを更新 +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 = """ @@ -180,8 +186,8 @@ def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, - emp_chg_inst_row: CursorResult): - # emp_chg_instを更新 + emp_chg_inst_row: dict): + # emp_chg_instをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -214,8 +220,8 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, - emp_chg_inst_row: CursorResult): - # emp_chg_instにInsert + emp_chg_inst_row: dict): + # emp_chg_instにINSERT try: elapsed_time = ElapsedTime() sql = """ @@ -268,7 +274,8 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: - # dcf_inst_mergeからSelect + # dcf_inst_mergeからSELECT + # muko_flgの値によって、SQLのWHERE条件を変更 try: sql = """ SELECT @@ -301,9 +308,11 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: - # - try: + # dcf_inst_mergeをUPDATE + # muko_flgの値によって、SQLのWHERE条件とSET句を変更 + try: elapsed_time = ElapsedTime() + log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' sql = """ UPDATE src05.dcf_inst_merge AS updim @@ -318,9 +327,9 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: src05.dcf_inst_merge AS dim INNER JOIN src05.hdke_tbl AS ht - ON dim.tekiyo_month=DATE_FORMAT(ht.syor_date, '%Y%m') + ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE - dim.muko_flg= :muko_flg + dim.muko_flg = :muko_flg AND dim.enabled_flg='Y' AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim @@ -343,16 +352,16 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'DCF施設統合マスタの有効データを{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('DCF施設統合マスタの更新に失敗') + 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): - # dcf_inst_mergeをUpdate + # dcf_inst_mergeをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -379,8 +388,8 @@ def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_c raise e -def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: CursorResult): - # ult_ident_presc_endをUpdate +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 = """ @@ -411,8 +420,8 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, - ult_ident_presc_row: CursorResult): - # ult_ident_prescにInsert + ult_ident_presc_row: dict): + # ult_ident_prescにINSERT try: elapsed_time = ElapsedTime() sql = """ @@ -459,7 +468,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # emp_chg_instから取得 + # emp_chg_instからSELECT try: sql = """ SELECT @@ -497,7 +506,7 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # ult_ident_prescから取得 + # ult_ident_prescからSELECT try: sql = """ SELECT @@ -531,7 +540,7 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str, - ult_ident_presc_row: CursorResult) -> int: + ult_ident_presc_row: dict) -> int: # ult_ident_prescの重複時相手先コードの件数取得 try: sql = """ 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..019f8c29 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,6 @@ 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.dcf_inst_merge import integrate_dcf_inst_merge from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() @@ -16,6 +17,8 @@ def exec(): return # 洗替用マスタ作成 create_inst_merge_for_laundering.exec() + # DCF施設統合マスタ日次更新 + integrate_dcf_inst_merge.exec() # 施設担当者洗替 emp_chg_inst_laundering.exec() # 納入先処方元マスタ洗替 diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 71fbea90..1a82f226 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,6 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.dcf_inst_merge import Integrate_dcf_inst_merge from src.batch.laundering import create_dcf_inst_merge, mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException @@ -115,14 +114,6 @@ def exec(): logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - try: - logger.info('DCF施設統合マスタ日次更新バッチ:起動') - Integrate_dcf_inst_merge.exec() - logger.info('DCF施設統合マスタ日次更新バッチ:終了') - except BatchOperationException as e: - logger.exception(f'DCF施設統合マスタ日次更新バッチエラー(異常終了){e}') - return constants.BATCH_EXIT_CODE_SUCCESS - # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 logger.info('業務日付更新・バッチステータスリフレッシュ:起動') try: From 5d16bceec95f4bd064d18246f55fc32dd5736e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 16:22:05 +0900 Subject: [PATCH 311/962] =?UTF-8?q?feat:=20SQL=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?=E5=8D=98=E4=BD=93=E8=A9=A6=E9=A8=93=E6=9B=B8=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E6=99=82=E3=81=AE=E6=8C=87=E6=91=98=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index ffb2ba06..6e9bf5e4 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -90,12 +90,15 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict continue # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 if not is_exists_duplicate_key: - # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + # 適用開始日 > DCF施設統合マスタの適用月度の前月末日の場合 if start_date > last_end_date: + # 対象レコードを物理削除する _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, '適用終了日更新後 開始日>終了日のため物理削除') + continue + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) logger.info('納入先処方元マスタの登録 終了') @@ -195,7 +198,7 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: src05.emp_chg_inst SET end_date = :end_date, updater = CURRENT_USER(), - update_date= SYSDATE() + update_date = SYSDATE() WHERE inst_cd = :dcf_inst_cd AND ta_cd = :ta_cd @@ -310,9 +313,9 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # dcf_inst_mergeをUPDATE # muko_flgの値によって、SQLのWHERE条件とSET句を変更 - try: + try: elapsed_time = ElapsedTime() - log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' + log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' sql = """ UPDATE src05.dcf_inst_merge AS updim @@ -330,7 +333,7 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE dim.muko_flg = :muko_flg - AND dim.enabled_flg='Y' + AND dim.enabled_flg ='Y' AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim SET @@ -397,7 +400,7 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident src05.ult_ident_presc SET end_date = :end_date, updater = CURRENT_USER(), - update_date= SYSDATE() + update_date = SYSDATE() WHERE ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd @@ -519,7 +522,7 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> SELECT COUNT(uipopp.ta_cd) FROM - ult_ident_presc AS uipopp + src05.ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd ) AS opp_count From 0f8fb0026f88accd75207484ad115213360a99c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 18:16:09 +0900 Subject: [PATCH 312/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 6e9bf5e4..182b7232 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -278,7 +278,8 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: # dcf_inst_mergeからSELECT - # muko_flgの値によって、SQLのWHERE条件を変更 + # 無効フラグがOFFのときは、移行先DCF施設コードが設定されてないデータを抽出する。 + # ONのときは、移行先DCF施設コードが設定されているデータを抽出する。 try: sql = """ SELECT @@ -312,7 +313,10 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # dcf_inst_mergeをUPDATE - # muko_flgの値によって、SQLのWHERE条件とSET句を変更 + # 無効フラグがOFFのときは、 + # 移行先DCF施設コードが設定されていないデータを抽出し、移行先DCF施設コードに重複時相手先コードを上書きする + # 無効フラグがONのときは、 + # 移行先DCF施設コードが設定されているデータを抽出し、移行先DCF施設コードにNULLを上書きする。 try: elapsed_time = ElapsedTime() log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' From 87364d7e83248c2ebae1b7b93b7210492b821499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 30 May 2023 14:34:50 +0900 Subject: [PATCH 313/962] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E5=81=B4=E3=81=A0=E3=81=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 90 +++ ecs/jskult-webapp/src/main.py | 4 +- ecs/jskult-webapp/src/static/css/ultStyle.css | 671 ++++++++++++++++ .../static/function/businessLogicScript.js | 60 ++ .../src/templates/docSearch.html | 744 ++++++++++++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 6 files changed, 1569 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-webapp/src/controller/ultmarc.py create mode 100644 ecs/jskult-webapp/src/static/css/ultStyle.css create mode 100644 ecs/jskult-webapp/src/templates/docSearch.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py new file mode 100644 index 00000000..2f1bd5eb --- /dev/null +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -0,0 +1,90 @@ +from typing import Optional + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.exceptions import HTTPException +from starlette import status + +from src.depends.services import get_service +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_view_model import BioViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.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('/docSearch') +def ultmarc_view( + request: Request, + # batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), + # bio_service: BioViewService=Depends(get_service(BioViewService)) +): + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + # # 検索項目の取得 + # bio = bio_service.prepare_bio_view(session) + # セッション書き換え + 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, + # 'bio': bio, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/BioSearchList') +def search_bio( + request: Request, + bio_form: Optional[BioModel] = Depends(BioModel.as_form), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 生物由来データを検索 + bio_sales_view_data = bio_service.search_bio_data(bio_form) + # 検索項目などのデータを取得 + bio: BioViewModel = bio_service.prepare_bio_view(session) + bio.bio_data = bio_sales_view_data + bio.form_data = bio_form + # セッション書き換え + 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( + 'bioSearchList.html', { + 'request': request, + 'bio': bio + }, + 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 f00f5ac3..a15344dc 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -5,7 +5,7 @@ from fastapi.staticfiles import StaticFiles from starlette import status import src.static as static -from src.controller import bio, bio_download, healthcheck, login, logout, menu +from src.controller import bio, bio_download, healthcheck, ultmarc, login, logout, menu from src.core import tasks from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException @@ -22,6 +22,8 @@ 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') 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..936cef77 --- /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%;s +} + +/* アルトマーク課題管理表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 90ecc18b..f55e7858 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -211,3 +211,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/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html new file mode 100644 index 00000000..214ea399 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -0,0 +1,744 @@ + + + + + + {% with subtitle = '医師検索一覧' %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

医師検索一覧

+ +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード: + + + 氏名(漢字): + + + 氏名(かな・カナ): + + +
勤務先コード: + + + 勤務先名(漢字): + + + 勤務先名(かな・カナ): + + +
勤務先都道府県: + + + 所属部科(漢字): + + + 診療科目(漢字): + + +
出身大学(漢字): + + + 卒年: + + +
+
+ + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード氏名勤務先名所属部科診療科目役職名出身大学卒年
+ + +
+ + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index beda056b..58f05375 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -11,7 +11,7 @@

MeDaCA
機能メニュー



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

+ Ultmarc照会(医師)

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

From 04396eb1d53b8f571bd92b6c429784595d27e0f1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 30 May 2023 15:20:40 +0900 Subject: [PATCH 314/962] =?UTF-8?q?feat:=20=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=AB=E5=AF=BE=E5=BF=9C=EF=BC=88=E7=94=BB?= =?UTF-8?q?=E9=9D=A2=E3=81=8C=E3=81=BE=E3=81=A0=E8=A1=A8=E7=A4=BA=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 2 + ecs/jskult-webapp/README.md | 2 +- ecs/jskult-webapp/src/controller/bio.py | 5 +- .../src/controller/bio_download.py | 8 +-- .../src/model/db/bio_sales_view.py | 24 +++---- .../src/model/db/pharmacy_product_master.py | 2 +- .../src/model/db/wholesaler_master.py | 4 +- .../src/model/view/bio_disp_model.py | 2 +- .../src/model/view/bio_view_model.py | 2 +- .../repositories/bio_sales_view_repository.py | 34 +++++----- .../pharmacy_product_master_repository.py | 8 +-- .../wholesaler_master_repository.py | 12 ++-- .../src/services/logout_service.py | 65 +++++++++++++++++++ ecs/jskult-webapp/src/system_var/constants.py | 18 ++--- .../src/system_var/environment.py | 3 + .../src/templates/bioSearchList.html | 50 +++++++------- 16 files changed, 158 insertions(+), 83 deletions(-) create mode 100644 ecs/jskult-webapp/src/services/logout_service.py diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index f330f3d5..dddde44d 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -21,5 +21,7 @@ DB_SCHEMA=src05 AWS_REGION=ap-northeast-1 AUTHORIZE_ENDPOINT=oauth2/authorize TOKEN_ENDPOINT=oauth2/token +LOGOUT_ENDPOINT=logout BIO_SEARCH_RESULT_MAX_COUNT=35000 SESSION_EXPIRE_MINUTE=20 +LOG_LEVEL=DEBUG \ No newline at end of file diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index 783f82a2..97632b8f 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -23,7 +23,7 @@ - Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 - 「Pipenvの導入」までを行っておくこと - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する - - `pipenv install --python ` + - `pipenv install --python --dev` - この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく - MySQLの環境構築 diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index 188560fb..108fc747 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -4,6 +4,7 @@ from fastapi import APIRouter, Depends, HTTPException, Request from starlette import status from src.depends.services import get_service +from src.logging.get_logger import get_logger from src.model.internal.session import UserSession from src.model.request.bio import BioModel from src.model.view.bio_view_model import BioViewModel @@ -16,6 +17,7 @@ from src.templates import templates router = APIRouter() router.route_class = AuthenticatedRoute +logger = get_logger('生物由来参照') ######################### # Views # @@ -32,6 +34,8 @@ def bio_view( # バッチ処理中の場合、機能を利用させない if batch_status_service.is_batch_processing(): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + logger.debug(f'UserId: {session.user_id}') # 検索項目の取得 bio = bio_service.prepare_bio_view(session) # セッション書き換え @@ -59,7 +63,6 @@ def search_bio( bio_service: BioViewService = Depends(get_service(BioViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): - # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); session: UserSession = request.session # バッチ処理中の場合、機能を利用させない if batch_status_service.is_batch_processing(): diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 0d172e8a..863c41e4 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -77,10 +77,10 @@ async def download_bio_data( extract_df.loc[:, 'lot_no_err_flg'] = extract_df['lot_no_err_flg'].apply( lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_no'].apply( - lambda bef_slip_mgt_no: extract_df['ins_dt'] if bef_slip_mgt_no is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_no'].apply( - lambda bef_slip_mgt_no: extract_df['ins_usr'] if bef_slip_mgt_no is not None else '') + extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') + extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') # 種別によって出力を変える local_file_path = '' diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 92288443..9fd90ed7 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -15,28 +15,28 @@ class BioSalesViewModel(BaseDBModel): rec_tran_kbn: Optional[str] rev_hsdnymd_wrk: Optional[str] rev_hsdnymd_srk: Optional[str] - rec_urag_no: Optional[str] - rec_comm_nm: Optional[str] - rec_nnskfcl_nm: Optional[str] - rec_nnsk_fcl_addr: Optional[str] + rec_urag_num: Optional[str] + rec_comm_name: Optional[str] + rec_nonyu_fcl_name: Optional[str] + rec_nonyu_fcl_addr: Optional[str] rec_lot_num: Optional[str] - rec_amt: Optional[str] + rec_qty: Optional[str] rec_ymd: Optional[str] sale_data_cat: Optional[str] - slip_file_nm: Optional[str] - slip_mgt_no: Optional[str] + slip_file_name: Optional[str] + slip_mgt_num: Optional[str] row_num: Optional[int] hsdn_ymd: Optional[str] exec_dt: Optional[str] v_tran_cd: Optional[int] - tran_kbn_nm: Optional[str] + tran_kbn_name: Optional[str] whs_org_cd: Optional[str] v_whsorg_cd: Optional[str] - whs_org_nm: Optional[str] + whs_org_name: Optional[str] whs_org_kn: Optional[str] v_whs_cd: Optional[int] - whs_nm: Optional[str] - nnsk_cd: Optional[str] + whs_name: Optional[str] + nonyu_fcl_cd: Optional[str] v_inst_cd: Optional[str] v_inst_kn: Optional[str] v_inst_nm: Optional[str] @@ -53,7 +53,7 @@ class BioSalesViewModel(BaseDBModel): fcl_exis_kbn: Optional[str] amt: Optional[int] slip_org_kbn: Optional[str] - bef_slip_mgt_no: Optional[str] + bef_slip_mgt_num: Optional[str] lot_no_err_flg: Optional[str] iko_flg: Optional[str] kjyo_ym: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py index 863fd87d..2f498246 100644 --- a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -4,4 +4,4 @@ from src.model.db.base_db_model import BaseDBModel class PharmacyProductMasterModel(BaseDBModel): - mkr_cd_nm: Optional[str] + mkr_cd_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/wholesaler_master.py b/ecs/jskult-webapp/src/model/db/wholesaler_master.py index 762711a5..b24f58b7 100644 --- a/ecs/jskult-webapp/src/model/db/wholesaler_master.py +++ b/ecs/jskult-webapp/src/model/db/wholesaler_master.py @@ -6,5 +6,5 @@ from src.model.db.base_db_model import BaseDBModel class WholesalerMasterModel(BaseDBModel): rec_whs_cd: Optional[str] rec_whs_sub_cd: Optional[str] - nm: Optional[str] - whs_nm: Optional[str] + name: Optional[str] + whs_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index 42bd0f42..e78d4f29 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -14,6 +14,6 @@ class BisDisplayModel(BioSalesViewModel): self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - if (self.bef_slip_mgt_no is None): + if (self.bef_slip_mgt_num is None): self.ins_dt = "" self.ins_usr = "" 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 1c6c98e3..933f76a4 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -23,7 +23,7 @@ class BioViewModel(BaseModel): def display_wholesaler_names(self): display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name}' for whs_model in self.whs_models ] return display_names diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index c9a60c30..5e590314 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -1,10 +1,13 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition +from src.logging.get_logger import get_logger from src.model.db.bio_sales_view import BioSalesViewModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty +logger = get_logger('生物由来参照') + class BioSalesViewRepository(BaseRepository): FETCH_SQL = """\ @@ -12,19 +15,19 @@ class BioSalesViewRepository(BaseRepository): ( CASE WHEN LEFT(bs.v_tran_cd, 1) = 2 - AND bs.amt >= 1 THEN CONCAT('-', bs.amt) - ELSE bs.amt + AND bs.qty >= 1 THEN CONCAT('-', bs.qty) + ELSE bs.qty END ) AS amt_fugo, bs.*, - ln.ser_no, + ln.ser_num, ln.lot_num, ln.expr_dt FROM src05.bio_sales_view bs LEFT OUTER JOIN src05.lot_num_mst ln - ON bs.mkr_cd = ln.ser_no + ON bs.mkr_cd = ln.ser_num AND bs.rec_lot_num = ln.lot_num WHERE {where_clause} @@ -32,25 +35,23 @@ class BioSalesViewRepository(BaseRepository): bs.rec_whs_cd, bs.rec_whs_sub_cd, bs.rev_hsdnymd_srk, - bs.slip_mgt_no + bs.slip_mgt_num ASC\ """ def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: try: self._database.connect() + logger.debug('DB参照実行') where_clause = self.__build_condition(parameter) - # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); - # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); query = self.FETCH_SQL.format(where_clause=where_clause) - # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); + logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.dict()) + logger.debug(f'count= {len(result)}') models = [BioSalesViewModel(**r) for r in result] - # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() @@ -58,18 +59,15 @@ class BioSalesViewRepository(BaseRepository): def fetch_as_data_frame(self, parameter: BioModel): try: self._database.connect() + logger.debug('DB参照実行') where_clause = self.__build_condition(parameter) - # error_log(date("Y/m/d H:i:s") . " [INFO] DB Return=" . $result . "\r\n", 3, "$execLog"); - # error_log(date("Y/m/d H:i:s") . " [INFO] DB参照実行" . "\r\n", 3, "$execLog"); query = self.FETCH_SQL.format(where_clause=where_clause) - # error_log(date("Y/m/d H:i:s") . " [INFO] SQL: " . $query . "\r\n", 3, "$execLog"); - # models = [BioSalesViewModel(**r) for r in result] - # error_log(date("Y/m/d H:i:s") . " [INFO] count=" . $count . "\r\n", 3, "$execLog"); + logger.debug(f'SQL: {query}') df = self._to_data_frame(query, parameter) + logger.debug(f'count= {len(df.index)}') return df except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index 2720955f..4f10e090 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -6,21 +6,21 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT - CONCAT(IFNULL(mkr_cd, ''), ' ', IFNULL(mkr_inf_1, '')) AS mkr_cd_nm + CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 INNER JOIN ( SELECT - prd_cd,MAX(sub_no) AS sno + prd_cd, MAX(sub_num) AS sno FROM src05.phm_prd_mst_v WHERE rec_sts_kbn <> '9' GROUP BY prd_cd ) fmv2 - ON t1.prd_cd = fmv2.prd_cd AND t1.sub_no = fmv2.sno + ON t1.prd_cd = fmv2.prd_cd AND t1.sub_num = fmv2.sno WHERE - mkr_cd IS NOT NULL + t1.mkr_cd IS NOT NULL ORDER BY mkr_cd """ diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py index 246eea5e..5e58e1b5 100644 --- a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -8,18 +8,22 @@ class WholesalerMasterRepository(BaseRepository): SELECT DISTINCT b.rec_whs_cd, b.rec_whs_sub_cd, - v2.nm, - b.whs_nm + v2.name, + b.whs_name FROM src05.bio_sales b LEFT OUTER JOIN ( - SELECT sub_no, nm, v_whs_cd, rec_sts_kbn + SELECT + sub_num, + name, + v_whs_cd, + rec_sts_kbn FROM src05.whs_mst_v WHERE (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM src05.hdke_tbl) BETWEEN start_date AND end_date ) v2 ON b.v_whs_cd = v2.v_whs_cd AND v2.rec_sts_kbn <> '9' - ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_nm DESC + ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_name DESC """ def fetch_all(self) -> list[WholesalerMasterModel]: diff --git a/ecs/jskult-webapp/src/services/logout_service.py b/ecs/jskult-webapp/src/services/logout_service.py new file mode 100644 index 00000000..8944ccde --- /dev/null +++ b/ecs/jskult-webapp/src/services/logout_service.py @@ -0,0 +1,65 @@ +# import base64 +# import hashlib +# import hmac + +# import requests + +# from src.aws.aws_api_client import AWSAPIClient +# from src.aws.cognito import CognitoClient +# from src.error.exceptions import NotAuthorizeException +# from src.model.db.user_master import UserMasterModel +# from src.model.internal.jwt_token import JWTToken +# from src.repositories.base_repository import BaseRepository +# from src.repositories.user_master_repository import UserMasterRepository +# from src.services.base_service import BaseService +# from src.system_var import environment + + +# class LogoutService(BaseService): +# REPOSITORIES = { +# 'user_repository': UserMasterRepository +# } + +# CLIENTS = { +# 'cognito_client': CognitoClient +# } + +# def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: +# super().__init__(repositories, clients) +# self.user_repository = repositories['user_repository'] +# self.cognito_client = clients['cognito_client'] + +# def logout(self) -> None: +# logout_endpoint = f'{environment.COGNITO_AUTH_DOMAIN}/{environment.LOGOUT_ENDPOINT}' +# request_params = { +# 'client_id': environment.COGNITO_CLIENT_ID, +# 'code': code, +# 'redirect_uri': environment.COGNITO_REDIRECT_URI +# } +# try: +# id_token, refresh_token = self.cognito_client.login_by_user_password_flow( +# username, +# password, +# self.__secret_hash(username) +# ) +# except Exception as e: +# if e.response['Error']['Code'] == 'NotAuthorizedException': +# raise NotAuthorizeException(e) +# else: +# raise e + +# return JWTToken(id_token, refresh_token) + +# def login_with_security_code(self, code: str) -> JWTToken: +# return JWTToken.request(code) + +# def logged_in_user(self, user_id): +# user_record: UserMasterModel = self.user_repository.fetch_one({'user_id': user_id}) +# return user_record + +# def __secret_hash(self, username: str): +# # see - https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/ # noqa +# message = bytes(username + environment.COGNITO_CLIENT_ID, 'utf-8') +# key = bytes(environment.COGNITO_CLIENT_SECRET, 'utf-8') +# digest = hmac.new(key, message, digestmod=hashlib.sha256).digest() +# return base64.b64encode(digest).decode() diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 1ebf4eac..9b022b3d 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -5,31 +5,31 @@ BIO_EXCEL_TEMPLATE_FILE_PATH = path.join(BIO_TEMPORARY_FILE_DIR_PATH, 'BioData_t BIO_EXTRACT_COLUMNS = [ 'slip_org_kbn', - 'slip_mgt_no', + 'slip_mgt_num', 'rec_ymd', 'rec_whs_cd', 'rec_whs_sub_cd', - 'whs_nm', + 'whs_name', 'rec_whs_org_cd', - 'rec_urag_no', + 'rec_urag_num', 'rev_hsdnymd_srk', 'rec_tran_kbn', - 'tran_kbn_nm', + 'tran_kbn_name', 'mkr_cd', 'rec_comm_cd', 'comm_nm', 'whs_rep_comm_nm', - 'nnsk_cd', - 'rec_nnskfcl_nm', + 'nonyu_fcl_cd', + 'rec_nonyu_fcl_name', 'whs_rep_nnskfcl_nm', - 'rec_nnsk_fcl_addr', + 'rec_nonyu_fcl_addr', 'whs_rep_nnsk_fcl_addr', 'rec_lot_num', 'amt_fugo', 'expr_dt', 'data_kbn', 'lot_no_err_flg', - 'bef_slip_mgt_no', + 'bef_slip_mgt_num', 'ins_usr', 'ins_dt', 'inst_cd', @@ -38,7 +38,7 @@ BIO_EXTRACT_COLUMNS = [ 'tel_no', 'v_whs_cd', 'v_whsorg_cd', - 'whs_org_nm', + 'whs_org_name', 'v_tran_cd', 'iko_flg' ] diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index 7d82d560..dea354bf 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -3,6 +3,7 @@ import os COGNITO_AUTH_DOMAIN = os.environ['COGNITO_AUTH_DOMAIN'] AUTHORIZE_ENDPOINT = os.environ['AUTHORIZE_ENDPOINT'] TOKEN_ENDPOINT = os.environ['TOKEN_ENDPOINT'] +LOGOUT_ENDPOINT = os.environ['LOGOUT_ENDPOINT'] COGNITO_IDENTITY_PROVIDER = os.environ['COGNITO_IDENTITY_PROVIDER'] COGNITO_REDIRECT_URI = os.environ['COGNITO_REDIRECT_URI'] COGNITO_USER_POOL_ID = os.environ['COGNITO_USER_POOL_ID'] @@ -20,3 +21,5 @@ DB_SCHEMA = os.environ['DB_SCHEMA'] BIO_SEARCH_RESULT_MAX_COUNT = int(os.environ['BIO_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/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index cc208efd..2c813f12 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -37,7 +37,7 @@ ロット番号: - データ区分: @@ -88,9 +88,9 @@ @@ -99,13 +99,13 @@ 発伝年月日: - ~ - - {% with + {% with modal_id='modal_xlsx', modal_title='確認', message='生物由来卸販売データ一覧をExcel出力しますか?', @@ -373,7 +373,7 @@ {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='modal_csv', modal_title='確認', message='生物由来卸販売データ一覧をCSV出力しますか?', @@ -397,7 +397,7 @@ {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='ErrorModal_AWS', modal_title='エラー', message='AWS環境に異常が発生しました。管理者にお問い合わせください。', @@ -415,7 +415,7 @@ {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='ErrorModal_DB', modal_title='エラー', message='DB接続に失敗しました。管理者にお問い合わせください。', @@ -434,7 +434,7 @@ {% endwith %} - {% with + {% with modal_id='ErrorModal_Unexpected', modal_title='エラー', message='サーバーエラーが発生しました。管理者にお問い合わせください。', From f6050ee47170ef7a1eeba919165bfbbfff0d464d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 30 May 2023 16:19:32 +0900 Subject: [PATCH 315/962] =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=AF=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 7 +- .../src/model/db/prefc_master.py | 8 ++ .../model/view/ultmarc_doctor_view_model.py | 113 ++++++++++++++++++ .../repositories/prefc_master_repository.py | 31 +++++ .../src/services/ultmarc_view_service.py | 111 +++++++++++++++++ .../src/templates/docSearch.html | 8 +- 6 files changed, 274 insertions(+), 4 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/prefc_master.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/prefc_master_repository.py create mode 100644 ecs/jskult-webapp/src/services/ultmarc_view_service.py diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 2f1bd5eb..ed966685 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -11,6 +11,7 @@ from src.model.view.bio_view_model import BioViewModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.bio_view_service import BioViewService +from src.services.ultmarc_view_service import UltmarcViewService from src.services.session_service import set_session from src.system_var import constants from src.templates import templates @@ -27,14 +28,14 @@ router.route_class = AuthenticatedRoute def ultmarc_view( request: Request, # batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), - # bio_service: BioViewService=Depends(get_service(BioViewService)) + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) ): session: UserSession = request.session # バッチ処理中の場合、機能を利用させない # if batch_status_service.is_batch_processing(): # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) # # 検索項目の取得 - # bio = bio_service.prepare_bio_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) # セッション書き換え session.update( actions=[ @@ -46,7 +47,7 @@ def ultmarc_view( templates_response = templates.TemplateResponse( 'docSearch.html', { 'request': request, - # 'bio': bio, + 'ultmarc': ultmarc, }, headers={'session_key': session_key} ) 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/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py new file mode 100644 index 00000000..1e3cf236 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -0,0 +1,113 @@ +import json +from collections import OrderedDict +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.prefc_master import PrefcMasterModel +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.system_var import environment + + +class UltmarcDoctorViewModel(BaseModel): + subtitle: str = '医師検索一覧' + batch_status: Optional[str] + prefc_models: list[PrefcMasterModel] + doctor_data: Optional[list[BisDisplayModel]] = [] + form_data: Optional[BioModel] + + def display_wholesaler_names(self): + display_names = [ + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' + for whs_model in self.whs_models + ] + return display_names + + 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 is_selected_whs_name(self, selected_wholesaler): + # if not self.is_form_submitted(): + # return '' + + # form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' + # return self._selected_value(form_wholesaler_full_name, selected_wholesaler) + + # def is_selected_org_kbn(self, selected_org_kbn): + # if not self.is_form_submitted(): + # return '' + # return self._selected_value(self.form_data.org_kbn, selected_org_kbn) + + # def is_input_rec_ymd_from(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rec_ymd_from) + + # def is_input_rec_ymd_to(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rec_ymd_to) + + # def is_input_lot_num(self): + # if not self.is_form_submitted(): + # return '' + + # return self.form_data.rec_lot_num or '' + + # def is_selected_data_kbn(self, selected_data_kbn): + # if not self.is_form_submitted(): + # return '' + + # return self._selected_value(self.form_data.data_kbn, selected_data_kbn) + + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return '' + # return self._selected_value(self.form_data.maker_cd, selected_prefc_cd) + + # def is_input_rev_hsdnymd_srk_from(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rev_hsdnymd_srk_from) + + # def is_input_rev_hsdnymd_srk_to(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) + + # def is_checked_iko_flg(self): + # if not self.is_form_submitted(): + # return '' + + # return 'checked' if self.form_data.ikoFlg else '' + + 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.BIO_SEARCH_RESULT_MAX_COUNT + + def _format_date_string(self, date_string): + if date_string is None: + return '' + date = datetime.strptime(date_string, '%Y%m%d') + return date.strftime('%Y/%m/%d') + + 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/repositories/prefc_master_repository.py b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py new file mode 100644 index 00000000..a8cf288f --- /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/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py new file mode 100644 index 00000000..6d296f74 --- /dev/null +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -0,0 +1,111 @@ +import os.path as path +import shutil +from datetime import datetime + +import pandas as pd + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel +from src.repositories.base_repository import BaseRepository +from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.prefc_master_repository import PrefcMasterRepository +from src.repositories.pharmacy_product_master_repository import \ + PharmacyProductMasterRepository +from src.repositories.wholesaler_master_repository import \ + WholesalerMasterRepository +from src.services.base_service import BaseService +from src.system_var import constants, environment + + +class UltmarcViewService(BaseService): + REPOSITORIES = { + 'ultmarc_doctor_repository': WholesalerMasterRepository, + 'prefc_repository': PrefcMasterRepository + } + + ultmarc_doctor_repository: WholesalerMasterRepository + prefc_repository: PrefcMasterRepository + + 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'] + + def prepare_ultmarc_doctor_view( + self, + session: UserSession + ) -> UltmarcDoctorViewModel: + # # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + + ultmarc = UltmarcDoctorViewModel( + prefc_models=prefcs + ) + return ultmarc + + def search_bio_data(self, search_params: BioModel): + # 生物由来データを検索 + bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params) + # 画面表示用に加工 + display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data] + + return display_bio_data + + def search_download_bio_data(self, search_params: BioModel): + # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 + bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) + return bio_sales_data_frame + + def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): + # Excelに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + + # テンプレートファイルをコピーして出力ファイルの枠だけを作る + shutil.copyfile( + src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, + dst=output_file_path + ) + # ExcelWriterの追記モード(`mode`='a')でファイルを開く + # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) + # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する + with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: + # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 + # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 + # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 + data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) + + return output_file_path + + def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): + # csvに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + output_df.to_csv(output_file_path, index=False, header=False) + + return output_file_path + + def upload_bio_data_file(self, local_file_path: str) -> None: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key = f'bio/{path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key = f'bio/{path.basename(local_file_path)}' + download_filename = f'{user_id}_生物由来卸販売データ.{kind}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 214ea399..45189de3 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -11,7 +11,7 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php'); - {% with subtitle = '医師検索一覧' %} + {% with subtitle = ultmarc.subtitle %} {% include '_header.html' %} {% endwith %} @@ -231,6 +231,12 @@ if (!isset($isDBSuccess)) { + 氏名(漢字): - + @@ -196,7 +195,7 @@ if (!isset($isDBSuccess)) { 氏名(かな・カナ): - + @@ -205,14 +204,14 @@ if (!isset($isDBSuccess)) { 勤務先コード: - + 勤務先名(漢字): - + @@ -220,7 +219,7 @@ if (!isset($isDBSuccess)) { 勤務先名(かな・カナ): - + @@ -231,7 +230,7 @@ if (!isset($isDBSuccess)) { 勤務先都道府県: - {% for prefc in ultmarc.prefc_models %} @@ -253,14 +252,14 @@ if (!isset($isDBSuccess)) { 所属部科(漢字): - + 診療科目(漢字): - + @@ -269,18 +268,18 @@ if (!isset($isDBSuccess)) { 出身大学(漢字): - + 卒年: - + - + From 79f561eb15d181c4923b05e679c13ad6ae805f38 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 31 May 2023 18:34:18 +0900 Subject: [PATCH 319/962] =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=83=89=E5=90=8D=E5=A4=89=E6=9B=B4=E3=81=A8download=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8=E6=94=B9?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 123 +++++++++++------- .../src/model/db/bio_sales_view.py | 2 +- .../src/model/request/bio_download.py | 6 +- .../src/router/session_router.py | 7 +- ecs/jskult-webapp/src/system_var/constants.py | 12 +- .../src/templates/bioSearchList.html | 17 ++- 6 files changed, 95 insertions(+), 72 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 863c41e4..620ca20c 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -2,6 +2,7 @@ from datetime import datetime from typing import Union +import pandas as pd from fastapi import APIRouter, Depends, HTTPException from fastapi.responses import JSONResponse from starlette import status @@ -9,13 +10,16 @@ from starlette import status from src.depends.auth import verify_session from src.depends.services import get_service from src.error.exceptions import DBException +from src.logging.get_logger import get_logger from src.model.internal.session import UserSession from src.model.request.bio import BioModel from src.model.request.bio_download import BioDownloadModel from src.services.batch_status_service import BatchStatusService from src.services.bio_view_service import BioViewService from src.services.session_service import set_session -from src.system_var import constants +from src.system_var import constants, environment + +logger = get_logger('生物由来参照') router = APIRouter() @@ -33,70 +37,35 @@ async def download_bio_data( session: Union[UserSession, None] = Depends(verify_session) ): # 通常のビューとはルーティングの扱いを変えるために、個別のルーターで登録する - # error_log(date("Y/m/d H:i:s") . " [INFO] getBioData start" . "\r\n", 3, "$execLog"); - # 改修後のパラメータを打ち出すようにする - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] param:szConditions=" . htmlspecialchars($_POST["szConditions"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] param:pageNum=" . htmlspecialchars($_POST["pageNum"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] szUser=" . htmlspecialchars($_POST["szUser"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] szfilename=" . htmlspecialchars($_POST["szfilename"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] extension=" . htmlspecialchars($_POST["extension"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] sql=" . htmlspecialchars($_POST["sql"], ENT_QUOTES) . "\r\n", 3, "$execLog"); - # いらない error_log(date("Y/m/d H:i:s") . " [INFO] arrayPrepare=" . $_POST["arrayPrepare"] . "\r\n", 3, "$execLog"); + logger.info('生物由来データダウンロード開始') + logger.info(f'ユーザーID: {download_param.user_id}') + logger.info(f'拡張子: {download_param.ext}') # ファイル名に使用するタイムスタンプを初期化しておく - now = datetime.now() + current_timestamp = datetime.now() if session is None: return {'status': 'session_expired'} # バッチ処理中の場合、機能を利用させない if batch_status_service.is_batch_processing(): return {'status': 'batch_processing'} - try: - # 生物由来データを検索 - search_result_df = bio_service.search_download_bio_data(search_param) - except DBException as e: - # error_log(date("Y/m/d H:i:s") . " [ERROR] " . "\r\n", 3, "$execLog"); - print('DB Error', e.args) - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail={'error': 'db_error', 'message': e.args} - ) + # 生物由来データを検索 + search_result_df = _search_bio_data(bio_service, search_param, download_param.user_id) if search_result_df.size < 1: # 検索結果が0件の場合、download_urlを返さない print('Bio data not found') return {'status': 'ok', 'download_url': None} # ファイルに打ち出すカラムを抽出 - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] + # TODO: SQLクエリを修正するため、この処理は不要になる + extract_df = _extract_output_df(search_result_df) - # 値を変換 - # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( - lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) - # データ区分の区分の日本語名を設定 - extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) - # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_no_err_flg'] = extract_df['lot_no_err_flg'].apply( - lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') - - # 種別によって出力を変える - local_file_path = '' - if download_param.kind == 'xlsx': - # error_log(date("Y/m/d H:i:s") . " [INFO] 今回はExcelファイルに出力する" . "\r\n", 3, "$execLog"); - local_file_path = bio_service.write_excel_file(extract_df, download_param.user_id, timestamp=now) - elif download_param.kind == 'csv': - # error_log(date("Y/m/d H:i:s") . " [INFO] 今回はCSVファイルに出力する" . "\r\n", 3, "$execLog"); - local_file_path = bio_service.write_csv_file( - extract_df, download_param.user_id, header=constants.BIO_CSV_HEADER, timestamp=now) + # ファイルを書き出し(Excel or CSV) + local_file_path = __write_bio_data_to_file(bio_service, download_param, extract_df, current_timestamp) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: bio_service.upload_bio_data_file(local_file_path) download_file_url = bio_service.generate_download_file_url( - local_file_path, download_param.user_id, download_param.kind) + local_file_path, download_param.user_id, download_param.ext) except Exception as e: print('S3 access error', e.args) raise HTTPException( @@ -121,8 +90,66 @@ async def download_bio_data( json_response.set_cookie( key='session', value=session.session_key, - max_age=20*60, + max_age=environment.SESSION_EXPIRE_MINUTE * 60, # cookieの有効期限は秒数指定なので、60秒をかける secure=True, httponly=True ) return json_response + + +def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_id: str) -> pd.DataFrame: + try: + # 生物由来データを検索 + search_result_df = bio_service.search_download_bio_data(search_param) + logger.info(f'ユーザーID: {user_id} Value: {search_param}') + # TODO: ファイルにも出力する + except DBException as e: + logger.exception(f'DB Error: {e}') + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + + return search_result_df + + +def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: + extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] + + # 値を変換 + # データ種別の正式名を設定 + extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( + lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) + # データ区分の区分の日本語名を設定 + extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) + # ロット番号エラーフラグの日本語名を設定 + extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( + lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') + extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') + + return extract_df + + +def __write_bio_data_to_file( + bio_service: BioViewService, + download_param: BioDownloadModel, + df: pd.DataFrame, + current_timestamp: datetime +) -> str: + # 種別によって出力を変える + local_file_path = '' + if download_param.ext == 'xlsx': + # TODO: ファイルにも出力する + logger.info('今回はExcelファイルに出力する') + local_file_path = bio_service.write_excel_file(df, download_param.user_id, timestamp=current_timestamp) + elif download_param.ext == 'csv': + # TODO: ファイルにも出力する + logger.info('今回はCSVファイルに出力する') + local_file_path = bio_service.write_csv_file( + df, download_param.user_id, header=constants.BIO_CSV_HEADER, timestamp=current_timestamp) + + return local_file_path diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 9fd90ed7..325ccbbc 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -42,7 +42,7 @@ class BioSalesViewModel(BaseDBModel): v_inst_nm: Optional[str] v_inst_addr: Optional[str] comm_cd: Optional[str] - comm_nm: Optional[str] + product_name: Optional[str] whs_rep_comm_nm: Optional[str] whs_rep_nnskfcl_nm: Optional[str] whs_rep_nnsk_fcl_addr: Optional[str] diff --git a/ecs/jskult-webapp/src/model/request/bio_download.py b/ecs/jskult-webapp/src/model/request/bio_download.py index 51bea2e3..5f9e049b 100644 --- a/ecs/jskult-webapp/src/model/request/bio_download.py +++ b/ecs/jskult-webapp/src/model/request/bio_download.py @@ -4,15 +4,15 @@ from pydantic import BaseModel class BioDownloadModel(BaseModel): user_id: str - kind: str + ext: str @classmethod def as_body( cls, user_id: str = Body(), - kind: str = Body() + ext: str = Body() ): return cls( user_id=user_id, - kind=kind + ext=ext ) diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index e2699784..8188c10f 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -1,4 +1,3 @@ -import logging from typing import Callable from fastapi import Request, Response @@ -9,9 +8,10 @@ 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.logging.get_logger import get_logger from src.system_var import constants, environment -logger = logging.getLogger('uvicorn') +logger = get_logger('medaca_router') class MeDaCaRoute(APIRoute): @@ -36,14 +36,11 @@ class MeDaCaRoute(APIRoute): # 返却するルートハンドラーを定義。必ず非同期関数にする必要がある。 async def custom_route_handler(request: Request) -> Response: try: - logger.info('pre routing process') # 事前処理 request = await self.pre_process_route(request) # 本来のルーティング処理 - logger.info('routing process') response = await original_route_handler(request) # 事後処理 - logger.info('post routing process') return await self.post_process_route(request, response) except HTTPException as e: raise e diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 9b022b3d..99bdd872 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -17,25 +17,25 @@ BIO_EXTRACT_COLUMNS = [ 'tran_kbn_name', 'mkr_cd', 'rec_comm_cd', - 'comm_nm', - 'whs_rep_comm_nm', + 'product_name', + 'whs_rep_comm_name', 'nonyu_fcl_cd', 'rec_nonyu_fcl_name', - 'whs_rep_nnskfcl_nm', + 'whs_rep_nonyu_fcl_name', 'rec_nonyu_fcl_addr', - 'whs_rep_nnsk_fcl_addr', + 'whs_rep_nonyu_fcl_addr', 'rec_lot_num', 'amt_fugo', 'expr_dt', 'data_kbn', - 'lot_no_err_flg', + 'lot_num_err_flg', 'bef_slip_mgt_num', 'ins_usr', 'ins_dt', 'inst_cd', 'inst_name_form', 'address', - 'tel_no', + 'tel_num', 'v_whs_cd', 'v_whsorg_cd', 'whs_org_name', diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 2c813f12..8dae43e4 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -192,7 +192,7 @@ + diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index cc208efd..d44247c1 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 %} - - - - + @@ -180,14 +177,16 @@ if (!isset($isDBSuccess)) { 医師コード: - + 氏名(漢字): - + @@ -195,7 +194,8 @@ if (!isset($isDBSuccess)) { 氏名(かな・カナ): - + @@ -204,14 +204,16 @@ if (!isset($isDBSuccess)) { 勤務先コード: - + 勤務先名(漢字): - + @@ -219,7 +221,8 @@ if (!isset($isDBSuccess)) { 勤務先名(かな・カナ): - + @@ -252,14 +255,16 @@ if (!isset($isDBSuccess)) { 所属部科(漢字): - + 診療科目(漢字): - + @@ -268,13 +273,15 @@ if (!isset($isDBSuccess)) { 出身大学(漢字): - + 卒年: - + @@ -672,7 +679,7 @@ if (!isset($isDBSuccess)) { $(function() { // スピナー出さない場合は以下、エスケープせず埋め込む // {% autoescape False%} - let searchResultString = '{}' + let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}' // {% endautoescape%} const searchResultData = JSON.parse(searchResultString) if (searchResultData.length == 0) { @@ -699,43 +706,17 @@ if (!isset($isDBSuccess)) { function pagination_content(datas) { const display_keys = [ - 'slip_org_kbn', - 'slip_mgt_no', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_nm', - 'rec_whs_org_cd', - 'rec_urag_no', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_nm', - 'mkr_cd', - 'rec_comm_cd', - 'comm_nm', - 'whs_rep_comm_nm', - 'nnsk_cd', - 'rec_nnskfcl_nm', - 'whs_rep_nnskfcl_nm', - 'rec_nnsk_fcl_addr', - 'whs_rep_nnsk_fcl_addr', - 'rec_lot_num', - 'amt_fugo', - 'expr_dt', - 'data_kbn', - 'lot_no_err_flg', - 'bef_slip_mgt_no', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_no', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_nm', - 'v_tran_cd', - 'iko_flg', + 'dcf_pcf_dr_cd', + 'dr_name', + 'form_inst_name_kanji', + 'dcf_dsf_inst_cd', + 'blng_sec_name', + 'trt_course_name', + 'form_post_name', + 'alma', + 'grad_y', + 'prefc_name', + 'blng_sec_cd' ]; const tableRow = document.createElement('tr') return datas.map(function (data) { From 30ba388cfd707094751a687019405ec1ab35e15e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 10:35:06 +0900 Subject: [PATCH 333/962] =?UTF-8?q?fix:=20Warning=E3=81=8C=E5=87=BA?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=81=A7=E3=80=81uvicorn[s?= =?UTF-8?q?tandard]=E3=82=92=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=97=E3=81=A6=E3=81=BF=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/Pipfile | 1 + ecs/jskult-webapp/Pipfile.lock | 299 +++++++++++++++++++++++++++++---- 2 files changed, 267 insertions(+), 33 deletions(-) diff --git a/ecs/jskult-webapp/Pipfile b/ecs/jskult-webapp/Pipfile index 7512a1dc..a8087bce 100644 --- a/ecs/jskult-webapp/Pipfile +++ b/ecs/jskult-webapp/Pipfile @@ -9,6 +9,7 @@ app = "uvicorn src.main:app --reload --no-server-header" [packages] fastapi = "*" uvicorn = "*" +"uvicorn[standard]" = "*" gunicorn = "*" boto3 = "*" jinja2 = "*" diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock index 4953141f..546ea4bd 100644 --- a/ecs/jskult-webapp/Pipfile.lock +++ b/ecs/jskult-webapp/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d78a6bf1a96aa14c45431185961cae6d54ca1da8ea0319e1976bad4c2bebd673" + "sha256": "3fc09dcad05f44b119f92f9955a7731128d9f9b1829240b7689102fb14f82edc" }, "pipfile-spec": 6, "requires": { @@ -26,19 +26,19 @@ }, "boto3": { "hashes": [ - "sha256:2eb9e688aa86bf1fadcec0b6995b42ec9788e7cd5f1a9c8ac1b66a2506aa209f", - "sha256:5b7e9f2674fe8aa99e2d168744023a3f66da12d9c51e0624489dd0db7aafe30d" + "sha256:30f8ab1cf89d5864a80ba2d5eb5316dbd2a63c9469877e0cffb522630438aa85", + "sha256:77e8fa7c257f9ed8bfe0c3ffc2ccc47b1cfa27058f99415b6003699d1202e0c0" ], "index": "pypi", - "version": "==1.26.144" + "version": "==1.26.145" }, "botocore": { "hashes": [ - "sha256:c60b9158cbc7447411abdec77b87a71d86d9404064702e92d317dca6a1ec9a5b", - "sha256:e2b970e68643cf4752cad4e45ba3319fc35707f1bff7f150f7ffcac1b1427b47" + "sha256:264a3f19ed280d80711b7e278be09acff7ed379a96432fdf179b4e6e3a687e6a", + "sha256:65e2a2b1cc70583225f87d6d63736215f93c6234721967bdab872270ba7a1f45" ], "markers": "python_version >= '3.7'", - "version": "==1.29.144" + "version": "==1.29.145" }, "certifi": { "hashes": [ @@ -208,27 +208,27 @@ }, "cryptography": { "hashes": [ - "sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55", - "sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895", - "sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be", - "sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928", - "sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d", - "sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8", - "sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237", - "sha256:5c1f7293c31ebc72163a9a0df246f890d65f66b4a40d9ec80081969ba8c78cc9", - "sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78", - "sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d", - "sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0", - "sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46", - "sha256:88ff107f211ea696455ea8d911389f6d2b276aabf3231bf72c8853d22db755c5", - "sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4", - "sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d", - "sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75", - "sha256:b846d59a8d5a9ba87e2c3d757ca019fa576793e8758174d3868aecb88d6fc8eb", - "sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2", - "sha256:f5d0bf9b252f30a31664b6f64432b4730bb7038339bd18b1fafe129cfc2be9be" + "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" ], - "version": "==41.0.0" + "version": "==41.0.1" }, "et-xmlfile": { "hashes": [ @@ -336,6 +336,52 @@ "markers": "python_version >= '3.7'", "version": "==0.14.0" }, + "httptools": { + "hashes": [ + "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9", + "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b", + "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2", + "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d", + "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09", + "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60", + "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a", + "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b", + "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42", + "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f", + "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142", + "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde", + "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0", + "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b", + "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986", + "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5", + "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6", + "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca", + "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b", + "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49", + "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324", + "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c", + "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63", + "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51", + "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372", + "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887", + "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d", + "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281", + "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901", + "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd", + "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449", + "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25", + "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2", + "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e", + "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1", + "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421", + "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7", + "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86", + "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc", + "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f", + "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6" + ], + "version": "==0.5.0" + }, "idna": { "hashes": [ "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", @@ -536,9 +582,7 @@ "version": "==1.10.8" }, "pyjwt": { - "extras": [ - "crypto" - ], + "extras": [], "hashes": [ "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074" @@ -570,6 +614,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, + "python-dotenv": { + "hashes": [ + "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", + "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" + ], + "version": "==1.0.0" + }, "python-multipart": { "hashes": [ "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132", @@ -585,6 +636,51 @@ ], "version": "==2023.3" }, + "pyyaml": { + "hashes": [ + "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + ], + "version": "==6.0" + }, "requests": { "hashes": [ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", @@ -682,11 +778,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c", - "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98" + "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", + "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" ], "markers": "python_version >= '3.7'", - "version": "==4.6.2" + "version": "==4.6.3" }, "tzdata": { "hashes": [ @@ -712,6 +808,143 @@ "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", + "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda", + "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154", + "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af", + "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d", + "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c", + "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48", + "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c", + "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545", + "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e", + "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120", + "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7", + "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8", + "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc", + "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056", + "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193", + "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3", + "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf", + "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79", + "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1", + "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b", + "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0" + ], + "version": "==0.19.0" + }, + "websockets": { + "hashes": [ + "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd", + "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f", + "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998", + "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82", + "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788", + "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa", + "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f", + "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4", + "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7", + "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f", + "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd", + "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69", + "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb", + "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b", + "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016", + "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac", + "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4", + "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb", + "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99", + "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e", + "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54", + "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf", + "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007", + "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3", + "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", + "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86", + "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1", + "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61", + "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11", + "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8", + "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f", + "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931", + "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526", + "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", + "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae", + "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd", + "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b", + "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311", + "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af", + "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152", + "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288", + "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de", + "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97", + "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d", + "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d", + "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca", + "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0", + "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9", + "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b", + "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", + "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128", + "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d", + "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c", + "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5", + "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6", + "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b", + "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b", + "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280", + "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c", + "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c", + "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f", + "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20", + "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8", + "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb", + "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602", + "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf", + "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0", + "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74", + "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0", + "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564" + ], + "version": "==11.0.3" + }, "xlrd": { "hashes": [ "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd", From 79d241aa18cf304c135a56042ebf8f862b3378fb Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 11:45:50 +0900 Subject: [PATCH 334/962] =?UTF-8?q?feat:=20=E5=8C=BB=E5=B8=AB=E3=81=AE?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=B8=80=E8=87=B4=E6=A4=9C=E7=B4=A2=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/sql_condition.py | 6 +-- .../repositories/ultmarc_doctor_repository.py | 44 ++++++++++++------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py index f0f929a3..d0d645c7 100644 --- a/ecs/jskult-webapp/src/db/sql_condition.py +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -4,7 +4,7 @@ class SQLCondition: param: str literal: bool - def __init__(self, column: str, operator: str, param: str, literal=False, like_wildcard=False) -> None: + def __init__(self, column: str, operator: str, param: str, literal=False) -> None: """ Args: column (str): カラム名 @@ -12,19 +12,15 @@ class SQLCondition: param (str): パラメータ(プレースホルダーかリテラル値か) literal (bool, optional): リテラル値を埋め込むかどうか。 画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。 - like_wildcard (bool, optional): like検索で部分一致検索にするかどうか。 """ self.column = column self.operator = operator self.param = param self.literal = literal - self.like_wildcard = like_wildcard def apply(self): # literalがFalseならプレースホルダー。Trueだったならは固定値。 param = f':{self.param}' if self.literal is False else self.param - # like_wildcardがTrueならLike検索にする - param = f'%{param}%' if self.like_wildcard is False else param return f' {self.column} {self.operator} {param}' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 5321ba46..f9651d98 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -1,7 +1,6 @@ -from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel -from src.repositories.base_repository import BaseRepository 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.request.ultmarc_doctor import UltmarcDoctorModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -35,8 +34,8 @@ class UltmarcDoctorRepository(BaseRepository): WHERE {where_clause} ORDER BY - com_dr.dcf_pcf_dr_cd, - com_dr_wrkplace.dcf_dsf_inst_cd, + 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 \ @@ -45,9 +44,11 @@ class UltmarcDoctorRepository(BaseRepository): def fetch_many(self, parameter: UltmarcDoctorModel) -> list[UltmarcDoctorDBModel]: try: self._database.connect() - where_clause = self.__build_condition(parameter) + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcDoctorModel(**parameter.dict()) + where_clause = self.__build_condition(clone_parameter) query = self.FETCH_SQL.format(where_clause=where_clause) - result = self._database.execute_select(query, parameter.dict()) + result = self._database.execute_select(query, clone_parameter.dict()) models = [UltmarcDoctorDBModel(**r) for r in result] return models @@ -64,31 +65,36 @@ class UltmarcDoctorRepository(BaseRepository): # 医師コード if is_not_empty(parameter.dcf_pcf_dr_cd): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE, - 'dcf_pcf_dr_cd', like_wildcard=True)) + 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): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name', like_wildcard=True)) + 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): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana', like_wildcard=True)) + parameter.dr_name_kana = f'%{parameter.dr_name_kana}%' + 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', like_wildcard=True)) + 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', like_wildcard=True)) + 'form_inst_name_kanji')) # 勤務先名(かな・カナ) if is_not_empty(parameter.form_inst_name_kana): # 必ず部分一致で検索 + parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, - 'form_inst_name_kana', like_wildcard=True)) + 'form_inst_name_kana')) # 勤務先都道府県 if is_not_empty(parameter.prefc_cd): @@ -97,23 +103,27 @@ class UltmarcDoctorRepository(BaseRepository): # 所属部科(漢字) 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', like_wildcard=True)) + condition.LIKE, 'blng_sec_name')) # 診療科目(漢字) if is_not_empty(parameter.trt_course_name): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name', like_wildcard=True)) + 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): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma', like_wildcard=True)) + parameter.alma = f'%{parameter.alma}%' + where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma')) # 卒年 if is_not_empty(parameter.grad_y): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y', like_wildcard=True)) + parameter.grad_y = f'%{parameter.grad_y}%' + where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y')) where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) From cf040e6bca99cd39d79f06ac5151ff0b2afa44fa Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 11:52:21 +0900 Subject: [PATCH 335/962] =?UTF-8?q?fix:=20trailing=20slash=E3=81=AE?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=80=81logout=E3=81=AB=E3=82=82=E3=81=82?= =?UTF-8?q?=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/error/exception_handler.py | 2 +- .../src/templates/bioSearchList.html | 44 +++++++++---------- ecs/jskult-webapp/src/templates/menu.html | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-webapp/src/error/exception_handler.py b/ecs/jskult-webapp/src/error/exception_handler.py index 679f7ebd..1b8cb59c 100644 --- a/ecs/jskult-webapp/src/error/exception_handler.py +++ b/ecs/jskult-webapp/src/error/exception_handler.py @@ -12,4 +12,4 @@ def http_exception_handler(request: Request, exc: HTTPException): raise exc error_detail = exc.detail if hasattr(exc, 'detail') else '' reason = parse.quote(error_detail) - return RedirectResponse(f'/logout?reason={reason}', status_code=status.HTTP_303_SEE_OTHER) + return RedirectResponse(f'/logout/?reason={reason}', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index cc208efd..232a51ef 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -37,7 +37,7 @@ ロット番号: - データ区分: @@ -88,7 +88,7 @@ ~ - - {% with + {% with modal_id='modal_xlsx', modal_title='確認', message='生物由来卸販売データ一覧をExcel出力しますか?', @@ -373,7 +373,7 @@ {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='modal_csv', modal_title='確認', message='生物由来卸販売データ一覧をCSV出力しますか?', @@ -397,36 +397,36 @@ {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='ErrorModal_AWS', modal_title='エラー', message='AWS環境に異常が発生しました。管理者にお問い合わせください。', icon_key='warning', - modal_close_event='location.href="/logout?reason="', + modal_close_event='location.href="/logout/?reason="', buttons = [ { 'id': 'error_modal_aws', 'class': 'btn btn-primary', 'text': 'OK', - 'onclick_event': 'location.href="/logout?reason=''"' + 'onclick_event': 'location.href="/logout/?reason=''"' } ] %} {% include '_modal.html' %} {% endwith %} - {% with + {% with modal_id='ErrorModal_DB', modal_title='エラー', message='DB接続に失敗しました。管理者にお問い合わせください。', icon_key='warning', - modal_close_event='location.href="/logout?reason="', + modal_close_event='location.href="/logout/?reason="', buttons = [ { 'id': 'error_modal_db', 'class': 'btn btn-primary', 'text': 'OK', - 'onclick_event': 'location.href="/logout?reason=''"' + 'onclick_event': 'location.href="/logout/?reason=''"' } ] %} @@ -434,18 +434,18 @@ {% endwith %} - {% with + {% with modal_id='ErrorModal_Unexpected', modal_title='エラー', message='サーバーエラーが発生しました。管理者にお問い合わせください。', icon_key='warning', - modal_close_event='location.href="/logout?reason="', + modal_close_event='location.href="/logout/?reason="', buttons = [ { 'id': 'error_modal_unexpected', 'class': 'btn btn-primary', 'text': 'OK', - 'onclick_event': 'location.href="/logout?reason=''"' + 'onclick_event': 'location.href="/logout/?reason=''"' } ] %} diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index beda056b..276eb643 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -22,7 +22,7 @@ {% else %}
生物由来データ参照は
日次バッチ処理中のため利用出来ません
{% endif %} - {% endif %} + {% endif %} {% if menu.is_available_master_maintenance_menu() %} {% if not menu.is_batch_processing() %} マスターメンテメニュー

From 5ab495de81866e2c3d44190ca5b6a1f58f2f1b18 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 15:52:20 +0900 Subject: [PATCH 336/962] =?UTF-8?q?fix:=20path=20trailing=E3=81=AE?= =?UTF-8?q?=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/function/businessLogicScript.js | 14 +++++++------- ecs/jskult-webapp/src/templates/bioSearchList.html | 4 ++-- ecs/jskult-webapp/src/templates/menu.html | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 90ecc18b..f3b8d077 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -3,7 +3,7 @@ // 戻るボタンの関数 // 機能概要:メニュー画面に遷移する function backToMenu(){ - location.href = "/menu"; + location.href = "/menu/"; } // クリアボタンの関数 @@ -17,7 +17,7 @@ function clr() { formInput.value = ""; } } - + // 検索ボタンを再度非活性にする formBtDisabled(); } @@ -35,7 +35,7 @@ function formBtDisabled(buttonId='search_bt', formId='search', all=false) { const checkTargetValueLength = formInputElements .filter((elem) => elem.name.startsWith('ctrl_')) .map((elem) => elem.value.length) - + // 活性、非活性の判断 let validFlg = false; if (all) { @@ -75,7 +75,7 @@ function selectDropDowList(id, selectedName){ options[i].selected = true; } }; - } + } } /** @@ -98,9 +98,9 @@ function enableDatePicker() { function autoModifyDate($this){ // 日付フォーマットチェック - if($this.value === "" || - (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) - { + if($this.value === "" || + (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) + { $this.value = ""; return; } diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 3e18e42b..5ede3802 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -28,7 +28,7 @@ - + @@ -335,7 +335,7 @@ 'v_tran_cd', 'iko_flg', ]; - const tableRow = document.createElement('tr') + const tableRow = documen.sendt.createElement('tr') return datas.map(function (data) { return ` diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index 276eb643..6da67294 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -30,7 +30,7 @@
マスターメンテメニューは
日次バッチ処理中のため利用出来ません
{% endif %} {% endif %} -

Logout +

Logout From 90944307ae85e361e85888bcab245c39fb16bea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 2 Jun 2023 16:27:12 +0900 Subject: [PATCH 337/962] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=EF=BC=BF=E6=A4=9C=E7=B4=A2=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=AF=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 5 - .../model/view/ultmarc_doctor_view_model.py | 80 +-- .../repositories/ultmarc_doctor_repository.py | 16 +- .../src/services/ultmarc_view_service.py | 61 -- ecs/jskult-webapp/src/static/css/ultStyle.css | 38 +- .../src/templates/docSearch.html | 574 +----------------- 6 files changed, 65 insertions(+), 709 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index a42d1ccc..133f6c64 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -66,7 +66,6 @@ def search_doc( ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): - # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); session: UserSession = request.session # バッチ処理中の場合、機能を利用させない # is_batch_processing = batch_status_service.is_batch_processing() @@ -82,10 +81,6 @@ def search_doc( ultmarc.doctor_data = ultmarc_doctor_data ultmarc.form_data = ultmarc_doctor_form - # bio: BioViewModel = bio_service.prepare_bio_view(session) - # bio.bio_data = ultmarc_doctor_data - # bio.form_data = bio_form - # セッション書き換え session.update( actions=[ 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 index 02ac88a0..ea2afe48 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -6,7 +6,6 @@ from typing import Optional from pydantic import BaseModel from src.model.db.prefc_master import PrefcMasterModel -# from src.model.db.doctor_view import DoctorViewModel from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.bio_disp_model import BisDisplayModel from src.system_var import environment @@ -16,58 +15,49 @@ class UltmarcDoctorViewModel(BaseModel): subtitle: str = '医師検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] - # doctor_models: list[DoctorViewModel] doctor_data: Optional[list[BisDisplayModel]] = [] form_data: Optional[UltmarcDoctorModel] - def display_wholesaler_names(self): - display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' - for whs_model in self.doctor_models - ] - return display_names - 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 is_input_dcf_pcf_dr_cd(self): if not self.is_form_submitted(): return '' - return self.form_data.dcf_pcf_dr_cd + 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 + 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 + 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 + 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 + 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 + return self.form_data.form_inst_name_kana or '' # 勤務先都道府県 def is_selected_prefc_cd(self, selected_prefc_cd): @@ -79,73 +69,25 @@ class UltmarcDoctorViewModel(BaseModel): def is_input_blng_sec_name(self): if not self.is_form_submitted(): return '' - return self.form_data.blng_sec_name + 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 + 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 + return self.form_data.alma or '' # 卒年 - def is_grad_y(self): + def is_input_grad_y(self): if not self.is_form_submitted(): return '' - return self.form_data.grad_y -# ************************** のま作 ************************** - - # def is_selected_org_kbn(self, selected_org_kbn): - # if not self.is_form_submitted(): - # return '' - # return self._selected_value(self.form_data.org_kbn, selected_org_kbn) - - # def is_input_rec_ymd_from(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rec_ymd_from) - - # def is_input_rec_ymd_to(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rec_ymd_to) - - # def is_input_lot_num(self): - # if not self.is_form_submitted(): - # return '' - - # return self.form_data.rec_lot_num or '' - - # def is_selected_data_kbn(self, selected_data_kbn): - # if not self.is_form_submitted(): - # return '' - - # return self._selected_value(self.form_data.data_kbn, selected_data_kbn) - - # def is_input_rev_hsdnymd_srk_from(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rev_hsdnymd_srk_from) - - # def is_input_rev_hsdnymd_srk_to(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) - - # def is_checked_iko_flg(self): - # if not self.is_form_submitted(): - # return '' - - # return 'checked' if self.form_data.ikoFlg else '' + 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 '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index f9651d98..f9293893 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -81,20 +81,20 @@ class UltmarcDoctorRepository(BaseRepository): 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')) + 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')) + where_clauses.append(SQLCondition( + 'form_inst_name_kanji', condition.LIKE, 'form_inst_name_kanji')) # 勤務先名(かな・カナ) if is_not_empty(parameter.form_inst_name_kana): # 必ず部分一致で検索 parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' - where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, - 'form_inst_name_kana')) + where_clauses.append(SQLCondition( + 'form_inst_name_kana', condition.LIKE, 'form_inst_name_kana')) # 勤務先都道府県 if is_not_empty(parameter.prefc_cd): @@ -104,8 +104,8 @@ class UltmarcDoctorRepository(BaseRepository): 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')) + where_clauses.append(SQLCondition( + 'com_blng_sec.blng_sec_name', condition.LIKE, 'blng_sec_name')) # 診療科目(漢字) if is_not_empty(parameter.trt_course_name): diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 0fd38f18..140863e7 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -8,16 +8,10 @@ from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel -from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesViewRepository from src.repositories.prefc_master_repository import PrefcMasterRepository from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository -from src.repositories.pharmacy_product_master_repository import \ - PharmacyProductMasterRepository -from src.repositories.wholesaler_master_repository import \ - WholesalerMasterRepository from src.services.base_service import BaseService from src.system_var import constants, environment @@ -52,58 +46,3 @@ class UltmarcViewService(BaseService): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) return ultmarc_doctor_data - - # def search_download_bio_data(self, search_params: BioModel): - # # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 - # bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) - # return bio_sales_data_frame - - # def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): - # # Excelに書き込み - # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') - - # # テンプレートファイルをコピーして出力ファイルの枠だけを作る - # shutil.copyfile( - # src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, - # dst=output_file_path - # ) - # # ExcelWriterの追記モード(`mode`='a')でファイルを開く - # # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) - # # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する - # with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: - # # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 - # # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 - # # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 - # data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) - - # return output_file_path - - # def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): - # # csvに書き込み - # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') - # # 横長のDataFrameとするため、ヘッダーの加工処理 - # header_data = {} - # for df_column, header_column in zip(data_frame.columns, header): - # header_data[df_column] = header_column - - # header_df = pd.DataFrame([header_data], index=None) - # output_df = pd.concat([header_df, data_frame]) - # # ヘッダー行としてではなく、1レコードとして出力する - # output_df.to_csv(output_file_path, index=False, header=False) - - # return output_file_path - - # def upload_bio_data_file(self, local_file_path: str) -> None: - # bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # # TODO: フォルダを変える - # file_key = f'bio/{path.basename(local_file_path)}' - # self.s3_client.upload_file(local_file_path, bucket_name, file_key) - - # def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: - # bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # # TODO: フォルダを変える - # file_key = f'bio/{path.basename(local_file_path)}' - # download_filename = f'{user_id}_生物由来卸販売データ.{kind}' - # return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 936cef77..3f1850d0 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -46,18 +46,18 @@ table{ } .scroll_table::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll_table::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll_table::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .ult_bt { @@ -361,7 +361,7 @@ table{ } .docHeader_bt{ - width: 40%;s + width: 40%; } /* アルトマーク課題管理表No.2の修正 8% → 10% */ @@ -405,18 +405,18 @@ table{ } .docSearchScroll::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .docSearchScroll::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .docSearchScroll::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .allOnOffButton{ @@ -471,18 +471,18 @@ table{ } .scroll::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .rightBoderLine{ diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index dc187eb4..475578fa 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -1,13 +1,3 @@ - - @@ -16,137 +6,17 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php'); {% endwith %} - - - - - - - - - - - - - - @@ -155,17 +25,9 @@ if (!isset($isDBSuccess)) {

医師検索一覧

- {% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
{% endif %} - - - @@ -179,26 +41,16 @@ if (!isset($isDBSuccess)) { - 氏名(漢字): - - 氏名(かな・カナ): - @@ -206,35 +58,24 @@ if (!isset($isDBSuccess)) { - 勤務先名(漢字): - - 勤務先名(かな・カナ): - - 勤務先都道府県: - 所属部科(漢字): - 診療科目(漢字): - @@ -275,16 +101,10 @@ if (!isset($isDBSuccess)) { - 卒年: - + value="{{ultmarc.is_input_grad_y()}}" maxlength='4' oninput="formBtDisabled()"> @@ -293,223 +113,13 @@ if (!isset($isDBSuccess)) { - +
- - + - @@ -528,152 +138,15 @@ if (!isset($isDBSuccess)) { 卒年 - - - - - - - - - - - - -
- - - - - - - \ No newline at end of file From 9c8e3d1bac519a1c82ebbe9170ad20ff8e96dc72 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 18:15:11 +0900 Subject: [PATCH 338/962] =?UTF-8?q?=E5=8F=97=E9=A0=98=E6=99=82=E3=81=AE?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E3=81=8B=E3=82=89S3download=E3=83=BB?= =?UTF-8?q?=E8=A7=A3=E5=87=8D=E3=83=BB=E7=99=BB=E9=8C=B2=E3=83=BB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97=E3=81=AE=E4=B8=80?= =?UTF-8?q?=E9=80=A3=E5=87=A6=E7=90=86=E3=82=92=E7=A2=BA=E8=AA=8D=E3=81=99?= =?UTF-8?q?=E3=82=8B=E7=94=A8=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=92=E3=82=B5=E3=83=96=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bio_slip_data_202304270000.gz | Bin .../fcl_mst_202304270000.gz | Bin .../hld_mst_202304270000.gz | Bin .../lot_num_mst_202304270000.gz | Bin .../mdb_conv_mst_202304270000.gz | Bin .../mkr_org_horizon_202304270000.gz | Bin .../org_cnv_mst_202304270000.gz | Bin .../phm_prd_mst_202304270000.gz | Bin .../phm_price_mst_202304270000.gz | Bin .../slip_data_202304270000.gz | Bin .../stock_slip_data_202304270000.gz | Bin .../tran_kbn_mst_202304270000.gz | Bin .../vop_hco_merge_202304270000.gz | Bin .../whs_customer_mst_202304270000.gz | Bin .../whs_mst_202304270000.gz | Bin 15 files changed, 0 insertions(+), 0 deletions(-) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/bio_slip_data_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/fcl_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/hld_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/lot_num_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/mdb_conv_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/mkr_org_horizon_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/org_cnv_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/phm_prd_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/phm_price_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/slip_data_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/stock_slip_data_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/tran_kbn_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/vop_hco_merge_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/whs_customer_mst_202304270000.gz (100%) rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestImportFileToDb}/whs_mst_202304270000.gz (100%) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/bio_slip_data_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/bio_slip_data_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/fcl_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/fcl_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/hld_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/hld_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/lot_num_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/lot_num_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mdb_conv_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mdb_conv_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mkr_org_horizon_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/mkr_org_horizon_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/org_cnv_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/org_cnv_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_prd_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_prd_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_price_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/phm_price_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/slip_data_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/slip_data_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/stock_slip_data_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/stock_slip_data_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/tran_kbn_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/tran_kbn_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/vop_hco_merge_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/vop_hco_merge_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_customer_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_customer_mst_202304270000.gz diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_mst_202304270000.gz similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304270000.gz rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestImportFileToDb/whs_mst_202304270000.gz From 368fef1f5bc68de02f0042aa48112160e1073290 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 18:16:19 +0900 Subject: [PATCH 339/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E5=8D=B8=E5=9C=A8=E5=BA=AB?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 97 +++++++++++++------ .../testdata/stock_slip_data_202304280000.tsv | 5 + .../testdata/stock_slip_data_202304290000.tsv | 5 + .../tests/testing_vjsk_utility.py | 91 +++++++++++++++++ 4 files changed, 166 insertions(+), 32 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv create mode 100644 ecs/jskult-batch-daily/tests/testing_vjsk_utility.py diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 8dac0688..e1d3571d 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -4,22 +4,28 @@ import pytest from src.aws.s3 import VjskReceiveBucket from src.batch.common.batch_context import BatchContext +from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager # from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager from src.batch.vjsk.vjsk_importer import (_check_received_files, _import_file_to_db) from src.db.database import Database +# from tests.testing_vjsk_utility import create_vjsk_assertion_dictionary +from tests.testing_vjsk_utility import (assert_table_results, + create_vjsk_assertion_list) class TestImportFileToDb: db: Database batch_context: BatchContext - test_file_path: str + test_file_path_import_all: str + test_file_path_load_individual: str @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): """テスト実行前後処理""" # setup - self.test_file_path = path.join(path.dirname(__file__), "testdata") + self.test_file_path_import_all = path.join(path.dirname(__file__), "testdata", "TestImportFileToDb") + self.test_file_path_load_individual = path.join(path.dirname(__file__), "testdata") self.batch_context = BatchContext.get_instance() @@ -69,7 +75,7 @@ class TestImportFileToDb: "lot_num_mst_202304270000.gz" ] for test_file in test_files: - file_name = path.join(self.test_file_path, test_file) + file_name = path.join(self.test_file_path_import_all, test_file) key = f"{receive_folder}/{test_file}" s3_client.upload_file(file_name, bucket_name, key) @@ -93,8 +99,6 @@ class TestImportFileToDb: received_s3_files = _check_received_files() _import_file_to_db(received_s3_files) - # self.db.connect() - # # 検証 (卸在庫データファイル) # table_name_org = mapper.get_org_table(mapper.CONDKEY_STOCK_SLIP_DATA) # table_name_src = mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA) @@ -116,36 +120,65 @@ class TestImportFileToDb: key = f"{receive_folder}/{test_file}" s3_client.delete_object(Bucket=bucket_name, Key=key) - # def test_load_stock_slip_data_ok(self, mapper): - # table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) - # table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) + def test_load_01_stock_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_STOCK_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA) - # # setup - # self.batch_context.is_vjsk_stock_import_day = True - # self.db.execute(f"truncate table {table_name_src}") + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") - # # assertion (insert) - # target_dict = { - # "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, - # "src_file_path": path.join(self.test_file_path, "stock_slip_data_202304280000.tsv") - # } - # VjskDataLoadManager.load(target_dict) + # assertion1 (insert 4row) - # result = self.db.execute(f"select * from {table_name_org}") - # assert result.rowcount == 4 - # result = self.db.execute(f"select * from {table_name_src}") - # assert result.rowcount == 4 + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "stock_slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) - # # assertion (update) - # target_dict = { - # "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, - # "src_file_path": path.join(self.test_file_path, "stock_slip_data_202304290000.tsv") - # } - # VjskDataLoadManager.load(target_dict) + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) - # result_org = self.db.execute(f"select * from {table_name_org}") - # assert result_org.rowcount == 4 - # result_src1 = self.db.execute(f"select * from {table_name_src}") - # assert result_src1.rowcount == 6 + # assertion2 (update 2row +insert 2row) - # # teardown + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "stock_slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv new file mode 100644 index 00000000..cc6c3902 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304280000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"D463630101 23022849630021900003500000 セトロタイドチユウシヤヨウ0.25MG 1V" "363" "01" "01 " "230228" "496300219" "000035" "0" "0000" " セトロタイドチユウシヤヨウ0.25MG 1V" "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000059" "59" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001270000040000001ゴナールエフヒカチユウペン450 1トウ40 " "253" "01" "026 " "230228" "496300127" "000004" "0" "0000" "01ゴナールエフヒカチユウペン450 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000060" "60" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000061" "61" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "253" "01" "026 " "230228" "496300417" "000050" "0" "0000" "01オビドレルヒカチユウシリンジ250MCG 140 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000062" "62" "202303142041" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "23-03-14 20:41:57" "SYSTEM" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv new file mode 100644 index 00000000..0b180c24 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/stock_slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"DAY2-301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000061" "61" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"DAY2-301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "253" "01" "026 " "230228" "496300417" "000050" "0" "0000" "01オビドレルヒカチユウシリンジ250MCG 140 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000062" "62" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"DAY2-301027 2302284963001100000020000001ゴナールエフヒカチユウペン300 1トウ40 " "253" "01" "027 " "230228" "496300110" "000002" "0" "0000" "01ゴナールエフヒカチユウペン300 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000063" "63" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"DAY2-301027 2302284963001270000110000001ゴナールエフヒカチユウペン450 1トウ40 " "253" "01" "027 " "230228" "496300127" "000011" "0" "0000" "01ゴナールエフヒカチユウペン450 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000064" "64" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py new file mode 100644 index 00000000..1849e325 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -0,0 +1,91 @@ + + +import csv +from datetime import datetime + + +def create_vjsk_assertion_list(file_path: str) -> list: + """DB登録期待値リストを作成する + + Args: + file_path (str): DB登録期待値ファイル(tsvファイル)のパス + ※DB登録期待値ファイルの前提 + 受領データファイルと同じ + BOM付きtsv形式 + 一行目はカラム名になっているヘッダ行 + + Returns: + List(dict) DB登録期待値辞書リスト + """ + with open(file_path, encoding='utf_8_sig', newline='') as tsv_file: + header = tsv_file.readline().strip('\n').replace('"', '').split('\t') + reader = csv.DictReader(tsv_file, fieldnames=header, delimiter='\t') + rows = [r for r in reader] + + # DB抽出値と比較できるように、リテラル値をDB抽出値と同じデータフォーマットに変換 + for row in rows: + for k, v in row.items(): + converted_value = v + if v == 'NULL': + converted_value = None + if is_valid_date_format(v, '%Y/%m/%d') is True: # YYYY/MM/DD + converted_value = datetime.strptime(v, '%Y/%m/%d').date() + if is_valid_date_format(v, '%Y-%m-%d') is True: # YYYY-MM-DD + converted_value = datetime.strptime(v, '%Y-%m-%d').date() + if is_valid_date_format(v, '%Y/%m/%d %H:%M:%S') is True: # YYYY/MM/DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y/%m/%d %H:%M:%S') + if is_valid_date_format(v, '%Y-%m-%d %H:%M:%S') is True: # YYYY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%Y-%m-%d %H:%M:%S') + if is_valid_date_format(v, '%y-%m-%d %H:%M:%S') is True: # YY-MM-DD HH:MM:SS + converted_value = datetime.strptime(v, '%y-%m-%d %H:%M:%S') + + row[k] = converted_value + + return rows + + +def is_valid_date_format(date_str: str, date_format): + """日付文字列が、与えられたフォーマットにマッチするかを検査する + + Args: + date_str (str): 日付文字列 + date_format (str, optional): 日付のフォーマット + + Returns: + _type_: 正しい日付文字列の場合、True、それ以外はFalse + """ + try: + datetime.strptime(date_str, date_format) + return True + except ValueError: + return False + + +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_name: list = None) -> None: + """テーブル同士の取得結果突き合わせ + + Args: + actual_rows (list[dict]): テスト結果の辞書リスト + expect_rows (list[dict]): 期待値の辞書リスト + ignore_col_name (list): 比較を無視するDBのカラム名. Default None. + """ + # 取得件数が一致すること + assert len(actual_rows) == len(expect_rows) + + line_number = 0 + # 1行ずつ調査 + for actual_row, expect_row in zip(actual_rows, expect_rows): + line_number += 1 + # 1カラムずつ調査 + for actual_col_name, expect_col_name in zip(actual_row, expect_row): + # テストメソッド側で個別に確認するものはスキップさせる + if ignore_col_name is not None and actual_col_name in ignore_col_name: + continue + else: + actual_value = actual_row[actual_col_name] + expect_value = expect_row[expect_col_name] + if isinstance(actual_value, (int)): + expect_value = int(expect_value) + if isinstance(actual_value, (float)): + expect_value = float(expect_value) + assert actual_value == expect_value, f'{line_number}行目:{actual_col_name}が、期待値と一致しませんでした' From 36c18835f1641ab9da05d15c198b626791558921 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 20:43:51 +0900 Subject: [PATCH 340/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E5=8D=B8=E8=B2=A9=E5=A3=B2?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=80=81=EF=BC=B6=E5=8D=B8=E7=B5=84=E7=B9=94=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=80=81=EF=BC=B6=E6=96=BD=E8=A8=AD?= =?UTF-8?q?=E7=B5=B1=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_recv_file_mapper.py | 56 +++--- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 189 ++++++++++++++++++ .../testdata/org_cnv_mst_202304280000.tsv | 5 + .../testdata/org_cnv_mst_202304290000.tsv | 5 + .../testdata/slip_data_202304280000.tsv | 5 + .../testdata/slip_data_202304290000.tsv | 5 + .../testdata/vop_hco_merge_202304280000.tsv | 5 + .../testdata/vop_hco_merge_202304290000.tsv | 5 + .../tests/testing_vjsk_utility.py | 13 +- 9 files changed, 259 insertions(+), 29 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 8b372dc2..352e2f91 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -201,7 +201,7 @@ class VjskReceiveFileMapper: ,t.tksnbk_kbn ,t.fcl_exec_kbn ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.ins_usr ,SYSDATE() FROM org05.sales AS t @@ -287,7 +287,7 @@ class VjskReceiveFileMapper: ,tksnbk_kbn=t.tksnbk_kbn ,fcl_exec_kbn=t.fcl_exec_kbn ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,ins_usr=t.ins_usr ,dwh_upd_dT=SYSDATE() ; @@ -326,7 +326,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.hld_mst_v AS t @@ -340,7 +340,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -389,7 +389,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.whs_mst_v AS t @@ -408,7 +408,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -517,7 +517,7 @@ class VjskReceiveFileMapper: ,t.start_date ,t.end_date ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.mkr_org_horizon_v AS t @@ -566,7 +566,7 @@ class VjskReceiveFileMapper: ,start_date=t.start_date ,end_date=t.end_date ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -605,7 +605,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.org_cnv_mst_v AS t @@ -619,7 +619,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -654,7 +654,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.tran_kbn_mst_v AS t @@ -666,7 +666,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -731,7 +731,7 @@ class VjskReceiveFileMapper: ,t.admin_kbn ,t.fcl_type ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.fcl_mst_v AS t @@ -758,7 +758,7 @@ class VjskReceiveFileMapper: ,admin_kbn=t.admin_kbn ,fcl_type=t.fcl_type ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -831,7 +831,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.phm_prd_mst_v AS t @@ -862,7 +862,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -899,7 +899,7 @@ class VjskReceiveFileMapper: ,t.end_date ,t.dsp_odr ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.phm_price_mst_v AS t @@ -912,7 +912,7 @@ class VjskReceiveFileMapper: ,end_date=t.end_date ,dsp_odr=t.dsp_odr ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -995,7 +995,7 @@ class VjskReceiveFileMapper: ,t.postal_cd ,t.tel_num ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.whs_customer_mst_v AS t @@ -1015,7 +1015,7 @@ class VjskReceiveFileMapper: ,postal_cd=t.postal_cd ,tel_num=t.tel_num ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -1048,7 +1048,7 @@ class VjskReceiveFileMapper: ,t.reliability ,t.start_date ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.upd_dt ,SYSDATE() FROM org05.mdb_cnv_mst_v AS t @@ -1059,7 +1059,7 @@ class VjskReceiveFileMapper: ,reliability=t.reliability ,start_date=t.start_date ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,upd_dt=t.upd_dt ,dwh_upd_dt=SYSDATE() ; @@ -1134,7 +1134,7 @@ class VjskReceiveFileMapper: ,t.err_flg9 ,t.err_flg10 ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.ins_usr ,SYSDATE() FROM org05.whole_stock AS t @@ -1166,7 +1166,7 @@ class VjskReceiveFileMapper: ,err_flg9=t.err_flg9 ,err_flg10=t.err_flg10 ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,ins_usr=t.ins_usr ,dwh_upd_dt=SYSDATE() ; @@ -1339,7 +1339,7 @@ class VjskReceiveFileMapper: ,t.tksnbk_kbn ,t.fcl_exec_kbn ,t.rec_sts_kbn - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.ins_usr ,SYSDATE() FROM org05.bio_sales AS t @@ -1420,7 +1420,7 @@ class VjskReceiveFileMapper: ,tksnbk_kbn=t.tksnbk_kbn ,fcl_exec_kbn=t.fcl_exec_kbn ,rec_sts_kbn=t.rec_sts_kbn - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,ins_usr=t.ins_usr ,dwh_upd_dt=SYSDATE() ; @@ -1449,7 +1449,7 @@ class VjskReceiveFileMapper: ,t.lot_num ,t.expr_dt ,t.frst_mov_dt - ,t.ins_dt + ,nullif(t.ins_dt, 0) -- 受領データがブランクだった場合にゼロ日付で取得されるので明示的にNULL値に変換する ,t.ins_usr ,SYSDATE() FROM org05.lot_num_mst AS t @@ -1458,7 +1458,7 @@ class VjskReceiveFileMapper: ,lot_num=t.lot_num ,expr_dt=t.expr_dt ,frst_mov_dt=t.frst_mov_dt - ,ins_dt=t.ins_dt + ,ins_dt=nullif(t.ins_dt, 0) ,ins_usr=t.ins_usr ,dwh_upd_dt=SYSDATE() ; diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index e1d3571d..fc3cee21 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -182,3 +182,192 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_02_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_03_org_cnv_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_ORG_CNV_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "org_cnv_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "org_cnv_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.whs_cd = o.whs_cd and s.whs_sub_cd = o.whs_sub_cd and s.org_cd = o.org_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_04_vop_hco_merge_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_VOP_HCO_MERGE) + table_name_src = mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, "vop_hco_merge_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, "vop_hco_merge_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_inst_cd = o.v_inst_cd and s.apply_dt = o.apply_dt)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv new file mode 100644 index 00000000..208d1a20 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"042" "01" "361007" "0" "300006657" "20230401" "99991231" "0" "0" "23-04-12 11:24:06" "23-04-12 11:24:06" +"042" "01" "381207" "0" "300006658" "20230401" "99991231" "0" "0" "23-04-12 11:24:27" "23-04-12 11:24:27" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" "20230331" "0" "0" "23-04-12 10:46:48" "23-04-12 10:46:48" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv new file mode 100644 index 00000000..c91eafee --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/org_cnv_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" "20230331" "0" "0" "23-04-12 10:46:48" "23-04-12 10:46:48" +"080" "00" "21807" "2" "300006649" "20230401" "99991231" "0" "0" "23-04-12 10:49:23" "23-04-12 10:49:23" +"080" "00" "25110" "0" "300005251" "20000101" "99991231" "0" "9" "21-03-11 14:59:47" "23-04-12 10:47:42" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv new file mode 100644 index 00000000..d9b11f17 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304280000.tsv @@ -0,0 +1,5 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D4420202011611A4 0183733 23030133625911102303 4963500230000020003110000000622000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362591" "000002" "00031100" "0000062200" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000022" "29" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "2" "31100" "62200" "31438" "62876" "35309" "70618" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4420202011611A4 0183733 23030133625921102303 4963500230000080003110000002488000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362592" "000008" "00031100" "0000248800" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000023" "30" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "31100" "248800" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000011" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173720211122303 4963500230000080002738100002190480000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7372021" "000008" "00027381" "0000219048" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000012" "17" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv new file mode 100644 index 00000000..5299839a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"DAY2-101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000011" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"DAY2-101311101A8 5140013 23030173720211122303 4963500230000080002738100002190480000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7372021" "000008" "00027381" "0000219048" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000012" "17" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "27381" "219048" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"DAY2-202041131A1 1409581 23030106357711102303 4963500230000070002966000002076200000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトウホクロウサイビヨウイン 00009818563センダイシアオバクダイノハラ " "202" "02" "041131A1 " "1409581 " "496350023" "110" "230301" "20230301" "0635771" "000007" "00029660" "0000207620" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トウホクロウサイビヨウイン " "9818563センダイシアオバクダイノハラ " "センダイシアオバクダイノハラ " "9818563" "" "000000" " " "20230227" "J" "VJSK_J_MERCK_2023022" "J2023022700000128" "135" "20230301" "202303142041" "110" "売上" "04113" "300000354" "北仙台支店" "" "200000016" "株式会社スズケン" "1409581 " "670232828063007745" "ドクリツギョウセイホウジンロウドウシャケンコウアンゼンキコウ トウホクロウサイビョウイン" "独立行政法人労働者健康安全機構 東北労災病院" "981-0911 宮城県仙台市青葉区台原4−3−21" "496350023" "アービタックス 注射剤 100mg 1VIAL" "7" "29660" "207620" "31438" "220066" "35309" "247163" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"DAY2-202141234B1 2607506 23030109289511102303 4963500230000100003036600003036600000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vヨコスカキヨウサイビヨウイン 00002380011カナガワケンヨコスカシヨネガハマドオリ1-16 " "202" "02" "141234B1 " "2607506 " "496350023" "110" "230301" "20230301" "0928951" "000010" "00030366" "0000303660" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ヨコスカキヨウサイビヨウイン " "2380011カナガワケンヨコスカシヨネガハマドオリ1-16 " "カナガワケンヨコスカシヨネガハマドオリ1-16 " "2380011" "" "000000" " " "20230228" "J" "VJSK_J_MERCK_2023022" "J2023022800000094" "101" "20230301" "202303142041" "110" "売上" "14123" "300000274" "磯子支店" "" "200000016" "株式会社スズケン" "2607506 " "670236609488110605" "コッカコウムインキョウサイクミアイレンゴウカイ ヨコスカキョウサイビョウイン" "国家公務員共済組合連合会 横須賀共済病院" "238-0011 神奈川県横須賀市米が浜通1−16" "496350023" "アービタックス 注射剤 100mg 1VIAL" "10" "30366" "303660" "31438" "314380" "35309" "353090" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv new file mode 100644 index 00000000..dca02347 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304280000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000001" "900000001" "20230509" "事由01" +"100000002" "900000002" "20230509" "事由02" +"100000003" "900000003" "20230509" "事由03" +"100000004" "900000004" "20230509" "事由04" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv new file mode 100644 index 00000000..c99d9f76 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/vop_hco_merge_202304290000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000003" "900000003" "20230509" "DAY-2事由03" +"100000004" "900000004" "20230509" "DAY-2事由04" +"100000005" "900000005" "20230509" "DAY-2事由05" +"100000006" "900000006" "20230509" "DAY-2事由06" diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py index 1849e325..4aec424d 100644 --- a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -1,6 +1,7 @@ import csv +import decimal from datetime import datetime @@ -84,8 +85,18 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor else: actual_value = actual_row[actual_col_name] expect_value = expect_row[expect_col_name] + + # 期待値を、DBのデータ型(リフレクションされたpythonのデータ型)にキャストする if isinstance(actual_value, (int)): expect_value = int(expect_value) if isinstance(actual_value, (float)): expect_value = float(expect_value) - assert actual_value == expect_value, f'{line_number}行目:{actual_col_name}が、期待値と一致しませんでした' + if isinstance(actual_value, (decimal.Decimal)): + expect_value = decimal.Decimal(expect_value) + # if type(actual_value) == datetime.date: + if type(actual_value).__name__ == "date": + if is_valid_date_format(expect_value, '%Y%m%d') is True: # YYYYMMDD + expect_value = datetime.strptime(expect_value, '%Y%m%d').date() + + # 検証 + assert actual_value == expect_value, f'{line_number}行目:"{actual_col_name}" : "{actual_value}" ({type(actual_value)})が、期待値 "{expect_value}" ({type(expect_value)}) と一致しませんでした' From 4b21279d5f8b5f53cf2061f0bce125d07d794d74 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 23:48:52 +0900 Subject: [PATCH 341/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E5=8D=B8=E3=83=9E=E3=82=B9?= =?UTF-8?q?=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/whs_mst_202304280000.tsv | 5 ++ .../testdata/whs_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index fc3cee21..62d6245c 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -371,3 +371,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_05_whs_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_WHS_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_WHS_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_whs_cd = o.v_whs_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv new file mode 100644 index 00000000..e9280e36 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000002" "0" "株式会社モロオ" "カナ01" "モロオ" "1110001" "住所01" "ジュウショ01" "00-0000-0001" "0" "20000101" "99991231" "20" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000005" "0" "岩渕薬品株式会社" "カナ02" "岩渕薬品" "1110002" "住所02" "ジュウショ02" "00-0000-0002" "0" "20000101" "99991231" "50" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000009" "0" "株式会社マルタケ" "カナ03" "マルタケ" "1110003" "住所03" "ジュウショ03" "00-0000-0003" "0" "20000101" "99991231" "90" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000010" "0" "株式会社ファイネス" "カナ04" "ファイネス" "1110004" "住所04" "ジュウショ04" "00-0000-0004" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv new file mode 100644 index 00000000..c16f188e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000009" "0" "株式会社マルタケ" "" "マルタケ" "" "" "" "" "0" "20000101" "99991231" "90" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000010" "0" "株式会社ファイネス" "" "ファイネス" "" "" "" "" "0" "20000101" "99991231" "100" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000011" "0" "鍋林株式会社" "" "鍋林" "" "" "" "" "0" "20000101" "99991231" "110" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000012" "0" "岡野薬品株式会社" "" "岡野薬品" "" "" "" "" "0" "20000101" "99991231" "120" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" From fa0ff77851cba603fa753cde9754d6eeffaa566a Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 23:57:08 +0900 Subject: [PATCH 342/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E5=8D=B8=E3=83=9B=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=87=E3=82=A3=E3=83=B3=E3=82=B0=E3=82=B9=E3=83=9E?= =?UTF-8?q?=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/hld_mst_202304280000.tsv | 5 ++ .../testdata/hld_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 62d6245c..1c200856 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -434,3 +434,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_06_hld_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_HLD_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_HLD_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "hld_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "hld_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_hld_cd = o.v_hld_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv new file mode 100644 index 00000000..2c4a8c1f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "卸ホールディングス名01-1" "オロシホールディングスメイ01-1" "卸名01-1" "20230101" "99991231" "1" "0" "23-05-09 12:00:01" "23-05-09 13:00:01" +"10001" "2" "卸ホールディングス名01-2" "オロシホールディングスメイ01-2" "卸名01-2" "20230102" "99991231" "1" "0" "23-05-09 12:00:02" "23-05-09 13:00:02" +"10001" "3" "卸ホールディングス名01-3" "オロシホールディングスメイ01-3" "卸名01-3" "20230103" "99991231" "1" "0" "23-05-09 12:00:03" "23-05-09 13:00:03" +"10001" "4" "卸ホールディングス名01-4" "オロシホールディングスメイ01-4" "卸名01-4" "20230104" "99991231" "1" "0" "23-05-09 12:00:04" "23-05-09 13:00:04" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv new file mode 100644 index 00000000..9728bb5f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/hld_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "3" "卸ホールディングス名01-3" "オロシホールディングスメイ01-3" "卸名01-3" "20230101" "99991231" "1" "0" "23-05-09 12:00:03" "23-05-09 13:00:03" +"10001" "4" "卸ホールディングス名01-4" "オロシホールディングスメイ01-4" "卸名01-4" "20230102" "99991231" "1" "0" "23-05-09 12:00:04" "23-05-09 13:00:04" +"10001" "5" "卸ホールディングス名01-5" "オロシホールディングスメイ01-5" "卸名01-5" "20230103" "99991231" "1" "0" "23-05-09 12:00:05" "23-05-09 13:00:05" +"10002" "1" "卸ホールディングス名02-1" "オロシホールディングスメイ02-1" "卸名01-1" "20230104" "99991231" "1" "0" "23-05-09 12:00:06" "23-05-09 13:00:06" From bf7f76e3478446de552f98d244f5b8bee4cebf9c Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Sat, 3 Jun 2023 01:00:47 +0900 Subject: [PATCH 343/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E6=96=BD=E8=A8=AD?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 67 +++++++++++++++++++ .../testdata/fcl_mst_202304280000.tsv | 5 ++ .../testdata/fcl_mst_202304290000.tsv | 5 ++ .../tests/testing_vjsk_utility.py | 17 +++-- 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 1c200856..73ad96de 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -497,3 +497,70 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_07_fcl_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_FCL_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_FCL_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "fcl_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + force_cast_to_str_columns = ['closed_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, force_cast_to_str_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + force_cast_to_str_columns = ['closed_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns, force_cast_to_str_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "fcl_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + force_cast_to_str_columns = ['closed_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns, force_cast_to_str_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_inst_cd = o.v_inst_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + force_cast_to_str_columns = ['closed_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns, force_cast_to_str_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv new file mode 100644 index 00000000..9615f392 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229430760653825" "0" "20000101" "99991231" "" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "" "0" "700-0023 岡山県岡山市北区駅前町1−6−20" "オカヤマケン オカヤマシキタク エキマエチョウ1-6-20" "700-0023" "33" "岡山県" "岡山市北区" "駅前町1−6−20" "0862236468" "33101" "30" "1" "" "" +"670229435466662922" "0" "20000101" "99991231" "" "医療法人社団仁卓会 ほりかわ歯科クリニック" "イリョウホウジンシャダンジンタクカイ ホリカワシカクリニック" "ほりかわ歯科クリニック (医社)" "ホリカワシカクリニック (イシャ)" "" "0" "675-0101 兵庫県加古川市平岡町新在家1573−1−4F" "ヒョウゴケン カコガワシ ヒラオカチョウシンザイケ1573-1-4F" "675-0101" "28" "兵庫県" "加古川市" "平岡町新在家1573−1−4F" "0794244617" "28210" "30" "1" "" "" +"670229435785430019" "0" "20000101" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206529" "0" "20000101" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県姫路市安田4−47−8−1F" "ヒョウゴケン ヒメジシ ヤスダ4-47-8-1F" "670-0955" "28" "兵庫県" "姫路市" "安田4−47−8−1F" "0792846396" "28201" "20" "1" "" "" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv new file mode 100644 index 00000000..b4c05930 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/fcl_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229435785430019" "0" "20000202" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206529" "0" "20000202" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県姫路市安田4−47−8−1F" "ヒョウゴケン ヒメジシ ヤスダ4-47-8-1F" "670-0955" "28" "兵庫県" "姫路市" "安田4−47−8−1F" "0792846396" "28201" "20" "1" "" "" +"670229463350395910" "0" "20000101" "99991231" "" "こうだ歯科" "コウダシカ" "こうだ歯科" "コウダシカ" "" "0" "770-0831 徳島県徳島市寺島本町西1−10" "トクシマケン トクシマシ テラシマホンチョウニシ1-10" "770-0831" "36" "徳島県" "徳島市" "寺島本町西1−10" "0886552625" "36201" "30" "1" "" "" +"670229489380246545" "0" "20020521" "99991231" "" "社会医療法人社団埼玉巨樹の会 狭山中央病院" "シャカイイリョウホウジンシャダンサイタマキョジュノカイ サヤマチュウオウビョウイン" "狭山中央病院 (社社)" "サヤマチュウオウビョウイン (シャシャ)" "" "0" "350-1306 埼玉県狭山市富士見2−19−35" "サイタマケン サヤマシ フジミ2-19-35" "350-1306" "11" "埼玉県" "狭山市" "富士見2−19−35" "0429597111" "11215" "10" "1" "" "" diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py index 4aec424d..a7982a05 100644 --- a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -62,7 +62,7 @@ def is_valid_date_format(date_str: str, date_format): return False -def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_name: list = None) -> None: +def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignore_col_names: list = None, force_cast_to_str_columns: list = []) -> None: """テーブル同士の取得結果突き合わせ Args: @@ -80,23 +80,28 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor # 1カラムずつ調査 for actual_col_name, expect_col_name in zip(actual_row, expect_row): # テストメソッド側で個別に確認するものはスキップさせる - if ignore_col_name is not None and actual_col_name in ignore_col_name: + if ignore_col_names is not None and actual_col_name in ignore_col_names: continue else: actual_value = actual_row[actual_col_name] expect_value = expect_row[expect_col_name] # 期待値を、DBのデータ型(リフレクションされたpythonのデータ型)にキャストする - if isinstance(actual_value, (int)): + if actual_col_name in force_cast_to_str_columns: + if type(expect_value).__name__ == 'date': + expect_value = expect_value.strftime('%Y-%m-%d') + elif isinstance(actual_value, (int)): expect_value = int(expect_value) - if isinstance(actual_value, (float)): + elif isinstance(actual_value, (float)): expect_value = float(expect_value) - if isinstance(actual_value, (decimal.Decimal)): + elif isinstance(actual_value, (decimal.Decimal)): expect_value = decimal.Decimal(expect_value) # if type(actual_value) == datetime.date: - if type(actual_value).__name__ == "date": + elif type(actual_value).__name__ == "date": if is_valid_date_format(expect_value, '%Y%m%d') is True: # YYYYMMDD expect_value = datetime.strptime(expect_value, '%Y%m%d').date() + elif actual_value is None and expect_value == "": + expect_value = None # 検証 assert actual_value == expect_value, f'{line_number}行目:"{actual_col_name}" : "{actual_value}" ({type(actual_value)})が、期待値 "{expect_value}" ({type(expect_value)}) と一致しませんでした' From 0b2c6fe1512cc451a1fb68012e19e17163ab8a48 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Sat, 3 Jun 2023 01:51:55 +0900 Subject: [PATCH 344/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E5=8D=B8=E7=B5=84=E7=B9=94=E5=B1=95=E9=96=8B?= =?UTF-8?q?=E8=A1=A8=E3=80=80=E2=80=BB=E6=A4=9C=E8=A8=BC=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/mkr_org_horizon_202304280000.tsv | 5 ++ .../testdata/mkr_org_horizon_202304290000.tsv | 5 ++ .../tests/testing_vjsk_utility.py | 2 +- 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 73ad96de..fcdd5682 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -564,3 +564,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_08_mkr_org_horizon_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_MKR_ORG_HORIZON) + table_name_src = mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, "mkr_org_horizon_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, "mkr_org_horizon_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_cd_1 = o.v_cd_1 and s.v_cd_2 = o.v_cd_2)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv new file mode 100644 index 00000000..3755e224 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304280000.tsv @@ -0,0 +1,5 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"3" "300003202" "その他営業本部卸" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003138" "北関東甲信越営業本部" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"a" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタッフ医療3" "3" "d" "300003204" "東海スタッフ医療4" "4" "e" "300003205" "東海スタッフ医療5" "5" "f" "300003206" "東海スタッフ医療6" "6" "g" "300003207" "東海スタッフ医療7" "7" "h" "300003208" "東海スタッフ医療8" "8" "i" "300003209" "東海スタッフ医療9" "9" "j" "300003210" "東海スタッフ医療10" "10" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv new file mode 100644 index 00000000..71f9d85b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mkr_org_horizon_202304290000.tsv @@ -0,0 +1,5 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003144" "メディカル営業本部" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "3" "300003201" "東海スタッフ医療" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "3" "300003224" "岐阜第二(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003143" "医薬営業統括本部" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "3" "300003196" "医薬その他" "0" "200000007" "20190401" "20190930" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py index a7982a05..15813e5a 100644 --- a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -71,7 +71,7 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor ignore_col_name (list): 比較を無視するDBのカラム名. Default None. """ # 取得件数が一致すること - assert len(actual_rows) == len(expect_rows) + assert len(actual_rows) == len(expect_rows), f'レコード件数が一致しません。DBレコード数 : {len(actual_rows)} 期待値 : {len(expect_rows)}' line_number = 0 # 1行ずつ調査 From 993c0497e5f786605404e818da0bf6ef1b2faecb Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 15:28:25 +0900 Subject: [PATCH 345/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E5=8D=B8=E7=B5=84=E7=B9=94=E5=B1=95=E9=96=8B?= =?UTF-8?q?=E8=A1=A8=E3=80=80=E2=80=BBPK=E9=A0=85=E7=9B=AE=E3=81=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB=E3=81=AF?= =?UTF-8?q?INSERT=E3=82=92=E6=9C=9F=E5=BE=85=E5=80=A4=E3=81=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/batch/vjsk/vjsk_load/test_vjsk_load.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index fcdd5682..ef3c973a 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -1,3 +1,4 @@ +import time from os import path import pytest @@ -597,7 +598,12 @@ class TestImportFileToDb: # srcテーブル結果が期待値通りかを突合 assert_table_results(result_src, assert_list, ignore_columns) - # assertion2 (update 2row +insert 2row) + # assertion2 (update 0row +insert 4row) ※PK項目がないテーブルなのですべてinsertになる + + assetion1_done_dt = self.db.execute_select("select SYSDATE()")[0]["SYSDATE()"] + + # assertion2でinsertされたレコードをdwh_upd_dtで判断するため、assertion1からの実行間隔を明確に空けるためにスリープを挟む + time.sleep(3) # 処理実行 target_dict = { @@ -616,14 +622,14 @@ class TestImportFileToDb: assert_table_results(result_org, assert_list, ignore_columns) # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 result_src = self.db.execute_select( - f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_cd_1 = o.v_cd_1 and s.v_cd_2 = o.v_cd_2)") + f"select * from {table_name_src} where dwh_upd_dt > :dt_value", {"dt_value": assetion1_done_dt}) # 突合から除外する項目 ignore_columns = ['dwh_upd_dt'] # srcテーブル結果が期待値通りかを突合 assert_table_results(result_src, assert_list, ignore_columns) - # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + # srcテーブル結果のレコード件数 (insert 4row + update 0row + insert 4row = 8row) ※PK項目がないテーブルなのですべてinsertになる result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") - assert result_src_count[0]['count(*)'] == 6 + assert result_src_count[0]['count(*)'] == 8 # teardown From 8e186cc3f310035630e99f597df719d643258446 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 16:04:59 +0900 Subject: [PATCH 346/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E5=8F=96=E5=BC=95?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/tran_kbn_mst_202304280000.tsv | 5 ++ .../testdata/tran_kbn_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index ef3c973a..d530f3ce 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -633,3 +633,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 8 # teardown + + def test_load_08_tran_kbn_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_TRAN_KBN_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "tran_kbn_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "tran_kbn_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.v_tran_cd = o.v_tran_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv new file mode 100644 index 00000000..cb5d5ff8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "Veeva取引区分名01-1" "20230101" "99991231" "1" "0" "2023-05-09 12:00:01" "2023-05-09 13:00:01" +"10001" "2" "Veeva取引区分名01-2" "20230102" "99991231" "1" "0" "2023-05-09 12:00:02" "2023-05-09 13:00:02" +"10001" "3" "Veeva取引区分名01-3" "20230103" "99991231" "1" "0" "2023-05-09 12:00:03" "2023-05-09 13:00:03" +"10001" "4" "Veeva取引区分名01-4" "20230104" "99991231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv new file mode 100644 index 00000000..0813b3df --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/tran_kbn_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "3" "Veeva取引区分名01-3" "20230201" "20301231" "1" "0" "2023-05-09 12:00:03" "2023-05-09 13:00:03" +"10001" "4" "Veeva取引区分名01-4" "20230202" "20301231" "1" "0" "2023-05-09 12:00:04" "2023-05-09 13:00:04" +"10001" "5" "Veeva取引区分名01-5" "20230203" "20301231" "1" "0" "2023-05-09 12:00:05" "2023-05-09 13:00:05" +"10002" "1" "Veeva取引区分名02-1" "20230204" "20301231" "1" "0" "2023-05-09 12:00:06" "2023-05-09 13:00:06" From fdf90338af2f7da8d7867ddfc2c03e1b39b409ac Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 16:29:56 +0900 Subject: [PATCH 347/962] =?UTF-8?q?feat:=20=E8=A8=AD=E8=A8=88=E3=81=AB?= =?UTF-8?q?=E5=90=88=E3=82=8F=E3=81=9B=E3=81=A6=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/bio_sales/create_bio_sales_lot.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) 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 5e7d0233..55c5311b 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 @@ -25,10 +25,12 @@ def exec(): _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) - # Veeva取引区分が返品(2)の場合、数量をマイナスに反転する - _reverse_qty_if_returns(db) db.commit() logger.debug('生物由来卸販売ロット分解処理終了') return @@ -54,11 +56,16 @@ def _delete_empty_lot_record(db: Database): pass +def _set_inst_info_from_mdb_or_mst_inst(db: Database): + # MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット + pass + + +def _set_prd_info_from_v_prd_mst(db: Database): + # V製品マスタから製品情報を生物由来ロット分解データにセットする + pass + + def _set_expr_dt_from_lot_num_mst(db: Database): # 製造ロット管理番号マスタから有効期限をセット pass - - -def _reverse_qty_if_returns(db: Database): - # Veeva取引区分が返品(2)の場合、数量をマイナスに反転する - pass From 800f3eba45a1c6d531e8c63e1db3aad2e7f51a9a Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 16:50:32 +0900 Subject: [PATCH 348/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E8=A3=BD=E5=93=81?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 65 ++++++++++++++++++- .../testdata/phm_prd_mst_202304280000.tsv | 5 ++ .../testdata/phm_prd_mst_202304290000.tsv | 5 ++ .../tests/testing_vjsk_utility.py | 13 +++- 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index d530f3ce..47601d58 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -634,7 +634,7 @@ class TestImportFileToDb: # teardown - def test_load_08_tran_kbn_mst_ok(self, mapper): + def test_load_09_tran_kbn_mst_ok(self, mapper): table_name_org = mapper.get_org_table(mapper.CONDKEY_TRAN_KBN_MST) table_name_src = mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST) @@ -696,3 +696,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_10_phm_prd_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_PHM_PRD_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_prd_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_prd_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.prd_cd = o.prd_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv new file mode 100644 index 00000000..9c4d4d86 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496201110" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20080101" "20190930" "140" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496201127" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20070401" "20190930" "150" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496300110" "2" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "F1990608" "ゴナールエフ皮下注ペン 300" "GONAL-F PEN 300IU (1) - JPN" "005" "セロスティム" "ST" "F005" "皮下注ペン" "0000" "" "V017" "300IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "100" "9" "19-04-23 16:35:36" "19-04-23 16:40:38" +"496300127" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv new file mode 100644 index 00000000..29824385 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_prd_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496300110" "2" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "F1990608" "ゴナールエフ皮下注ペン 300" "GONAL-F PEN 300IU (1) - JPN" "005" "セロスティム" "ST" "F005" "皮下注ペン" "0000" "" "V017" "300IU" "P011" "1PEN" "1" "20230601" "0" "0" "20190501" "20190930" "100" "9" "19-04-23 16:35:36" "19-04-23 16:40:38" +"496300127" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "20230602" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 16:37:10" "19-04-23 16:40:54" +"496300134" "2" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "F19B0608" "ゴナールエフ皮下注ペン900" "Gonalef Pen 900 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V019" "900IU" "P011" "1PEN" "1" "20230603" "0" "0" "20190501" "20190930" "110" "9" "19-04-23 16:38:36" "19-04-23 16:41:05" +"496301315" "0" "プロファシー 注射剤 5000IU 10VIAL" "" "F47706A0" "プロファシー 注 5000IU" "PROFASI M AMP. 5000 IU (10)" "002" "プロファシー" "PF" "F002" "注射剤" "0000" "" "V020" "5000IU" "P005" "10VIAL" "10" "20230604" "0" "0" "20070401" "20190930" "160" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" diff --git a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py index 15813e5a..441c5c9e 100644 --- a/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py +++ b/ecs/jskult-batch-daily/tests/testing_vjsk_utility.py @@ -88,20 +88,31 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor # 期待値を、DBのデータ型(リフレクションされたpythonのデータ型)にキャストする if actual_col_name in force_cast_to_str_columns: + # DB項目(varchar)に日付型としてキャスト可能な値が期待値である場合、force_cast_to_str_columnsに基づいて強制的に文字列キャストする if type(expect_value).__name__ == 'date': expect_value = expect_value.strftime('%Y-%m-%d') elif isinstance(actual_value, (int)): + # DB項目(int)の場合、期待値もintにキャストする expect_value = int(expect_value) elif isinstance(actual_value, (float)): + # DB項目(float)の場合、期待値もfloatにキャストする expect_value = float(expect_value) elif isinstance(actual_value, (decimal.Decimal)): + # DB項目(decimal)の場合、期待値もdecimalにキャストする expect_value = decimal.Decimal(expect_value) - # if type(actual_value) == datetime.date: elif type(actual_value).__name__ == "date": + # DB項目(date)の場合、期待値("YYYYMMDD")もdateにキャストする if is_valid_date_format(expect_value, '%Y%m%d') is True: # YYYYMMDD expect_value = datetime.strptime(expect_value, '%Y%m%d').date() elif actual_value is None and expect_value == "": + # DB項目値がNULLの場合、期待値が""であればNoneに置換する expect_value = None + elif actual_value == "0000-00-00" and expect_value == "": + # DB項目(date)がゼロ日付(NULL代替値)の場合、期待値が""であれば"0000-00-00"に置換する + expect_value = "0000-00-00" + elif actual_value == "0000-00-00 00:00:00" and expect_value == "": + # DB項目(datetime)がゼロ日付(NULL代替値)の場合、期待値が""であれば"0000-00-00 00:00:00"に置換する + expect_value = "0000-00-00 00:00:00" # 検証 assert actual_value == expect_value, f'{line_number}行目:"{actual_col_name}" : "{actual_value}" ({type(actual_value)})が、期待値 "{expect_value}" ({type(expect_value)}) と一致しませんでした' From 5ac63d6f4f34e30d5af701a79e9e039ff47c5c15 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 17:01:17 +0900 Subject: [PATCH 349/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E8=A3=BD=E5=93=81?= =?UTF-8?q?=E4=BE=A1=E6=A0=BC=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/phm_price_mst_202304280000.tsv | 5 ++ .../testdata/phm_price_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 47601d58..2fb187ae 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -759,3 +759,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_11_phm_price_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_PHM_PRICE_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.phm_prd_cd = o.phm_prd_cd and s.phm_price_kind = o.phm_price_kind and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv new file mode 100644 index 00000000..b47ae0e6 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"114430502" "01" "2" "10060.2" "20180401" "20190930" "10" "0" "18-03-07 09:33:37" "19-09-19 11:23:47" +"114430502" "01" "3" "10237.2" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" +"114430502" "03" "2" "100602" "20180401" "20190930" "30" "0" "18-03-07 09:39:48" "19-09-19 11:23:47" +"114430502" "03" "3" "102372" "20191001" "99991231" "30" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv new file mode 100644 index 00000000..c5331854 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"114430502" "03" "2" "100602" "20180401" "20190930" "30" "0" "18-03-07 09:39:48" "19-09-19 11:23:47" +"114430502" "03" "3" "102372" "20191001" "99991231" "30" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" +"114430601" "01" "2" "12362.4" "20180401" "20190930" "10" "0" "18-03-07 09:48:00" "19-09-19 11:23:47" +"114430601" "01" "3" "12587.8" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" From c33940eee1e4658af2283ebe9685a62c07a24814 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 19:48:07 +0900 Subject: [PATCH 350/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=EF=BC=B6=E5=8D=B8=E5=BE=97?= =?UTF-8?q?=E6=84=8F=E5=85=88=E6=83=85=E5=A0=B1=E3=83=9E=E3=82=B9=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../whs_customer_mst_202304280000.tsv | 5 ++ .../whs_customer_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 2fb187ae..ca63e86d 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -822,3 +822,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_12_whs_customer_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_WHS_CUSTOMER_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_customer_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "whs_customer_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.whs_cd = o.whs_cd and s.whs_sub_cd = o.whs_sub_cd and s.customer_cd = o.customer_cd and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv new file mode 100644 index 00000000..0c23e674 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1002900000" "0" "20000101" "99991231" "11" "1131A2283316" "辻内科小児科医院               " "ツジナイカシヨウニカ イイン" "長崎県 佐世保市皆瀬町29                   " "ナガサキケン サセボシカイゼチヨウ 29" "8570144" "0956492319" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1005400000" "0" "20000101" "99991231" "12" "1211C3415515" "医療法人 愛恵会 佐世保愛恵病院       " "イリヨウホウジンアイケイカイサセボアイケイビ" "長崎県 佐世保市瀬戸越4丁目 2−15             " "ナガサキケン サセボシセトゴシ 4チヨウメ 2-15" "8570134" "0956493335" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007200000" "0" "20000101" "99991231" "11" "1131A2407312" "医療法人 山祇診療所             " "イリヨウホウジンヤマズミシンリヨウジヨ" "長崎県 佐世保市山祇町 19−36               " "ナガサキケン サセボシヤマズミチョウ" "8570822" "0956313633" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007800000" "0" "20000101" "99991231" "11" "1121A2402213" "医療法人道仁会 品川医院           " "イリヨウホウジンドウジンカイ シナガワイイン" "長崎県 佐世保市柚木町2188                 " "ナガサキケン サセボシユノキチヨウ 2188" "8570112" "0956460005" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv new file mode 100644 index 00000000..e5c22a27 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/whs_customer_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1007200000" "0" "20000101" "99991231" "11" "1131A2407312" "医療法人 山祇診療所2            " "イリヨウホウジンヤマズミシンリヨウジヨ" "長崎県 佐世保市山祇町 19−36               " "ナガサキケン サセボシヤマズミチョウ" "8570822" "0956313633" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007800000" "0" "20000101" "99991231" "11" "1121A2402213" "医療法人道仁会 品川医院2          " "イリヨウホウジンドウジンカイ シナガワイイン" "長崎県 佐世保市柚木町2188                 " "ナガサキケン サセボシユノキチヨウ 2188" "8570112" "0956460005" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1008000000" "0" "20000101" "99991231" "11" "1131A2283316" "北原整形外科医院2              " "キタハラセイケイゲカ イイン" "長崎県 佐世保市瀬戸越町4丁目1298−1           " "ナガサキケン サセボシセトゴシチヨウ 1298-1" "8570135" "0956497773" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1009100000" "0" "20000101" "99991231" "11" "1121A2224212" "山口医院2                  " "ヤマグチイイン" "長崎県 佐世保市春日町29−14                " "ナガサキケン サセボシカスガチヨウ29-14" "8570011" "0956228610" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" From 1cbe72fbb03aac0d99004dfcc9eedabfe0de7ee3 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Mon, 5 Jun 2023 22:50:20 +0900 Subject: [PATCH 351/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80MDB=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E5=A4=89=E6=8F=9B=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/mdb_conv_mst_202304280000.tsv | 5 ++ .../testdata/mdb_conv_mst_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index ca63e86d..7d06b39c 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -885,3 +885,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_13_mdb_conv_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_MDB_CONV_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "mdb_conv_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "mdb_conv_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.hco_vid_v = o.hco_vid_v and s.sub_num = o.sub_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv new file mode 100644 index 00000000..f27cf3ce --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229780011959315" "1" "003410424" "0" "20020601" "0" "22-03-09 13:56:19" "22-03-09 13:56:19" +"670230081112654862" "0" "004101420" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:17:34" +"670230081112654862" "1" "004104997" "2" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "3" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:13:49" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv new file mode 100644 index 00000000..fe0ab79c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/mdb_conv_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670230081112654862" "1" "004104997" "0" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:13:49" +"670230100414841865" "1" "003636480" "0" "20000101" "0" "22-03-09 14:13:49" "22-03-09 14:13:49" +"670230330673742853" "0" "004804003" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 15:20:35" From 6c51f8d0a61a8698054fb9e6616f70c13be69929 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 09:39:53 +0900 Subject: [PATCH 352/962] =?UTF-8?q?feat:=20=E7=94=9F=E7=89=A9=E7=94=B1?= =?UTF-8?q?=E6=9D=A5=E3=83=AD=E3=83=83=E3=83=88=E5=88=86=E8=A7=A3=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AESQL=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/bio_sales/create_bio_sales_lot.py | 355 +++++++++++++++++- 1 file changed, 344 insertions(+), 11 deletions(-) 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 55c5311b..298c77c9 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,7 +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('生物由来卸販売ロット分解') @@ -42,30 +44,361 @@ def exec(): def _delete_not_confirm_data_in_bio_sales_lot(db: Database): - # 生物由来ロット分解データの未確定データ削除 - pass + logger.debug('生物由来ロット分解データの未確定データ削除開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + DELETE FROM src05.bio_sales_lot AS lot + INNER JOIN src05.bio_sales AS bio + ON bio.slip_mgt_num = lot.slip_mgt_num + AND bio.dwh_upd_dt = src05.get_syor_date() + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの未確定データ削除に失敗') + raise e + logger.debug('生物由来ロット分解データの未確定データ削除に成功') def _insert_bio_sales_lot(db: Database): - # 生物由来ロット分解データを作成 - pass + 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 '99' 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 bio.bef_slip_mgt_num + WHEN NULL THEN bio.ins_dt + ELSE NULL + END AS ins_dt, + CASE bio.bef_slip_mgt_num + WHEN 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 '8' THEN '除外' + WHEN '9' 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 '8' THEN '除外' + WHEN '9' 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 '8' THEN '除外' + WHEN '9' 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 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): - # 生物由来ロット分解データの製造番号が空のレコードを削除 - pass + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + DELETE FROM src05.bio_sales_lot lot + WHERE + 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): - # MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット - pass + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + internal05.view_mdb_cnv_mst mdb, + src05.mst_inst inst + SET + -- 施設コード + bio.inst_cd = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.mdb_cd + ELSE bio.v_inst_cd + END + ), + -- 正式施設名(漢字) + bio.inst_name_form = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.inst_name_form + ELSE inst.inst_name_form + END + ) + -- 施設住所 + bio.address = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.address + ELSE inst.address + END + ), + -- 施設電話番号 + bio.tel_num = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.tel_num + ELSE inst.tel_num + END + ) + WHERE + bio.v_inst_cd = mdb.hco_vid_v + AND bio.v_inst_cd = inst.inst_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('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに失敗') + raise e + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに成功') def _set_prd_info_from_v_prd_mst(db: Database): - # V製品マスタから製品情報を生物由来ロット分解データにセットする - pass + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + src05.phm_prd_mst_v prd + SET + bio.mkr_inf_1 = prd.mkr_inf_1, + bio.mkr_cd = prd.mkr_cd + WHERE + 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' + + """ + 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_expr_dt_from_lot_num_mst(db: Database): # 製造ロット管理番号マスタから有効期限をセット - pass + logger.debug('製造ロット管理番号マスタから有効期限をセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + src05.lot_num_mst lot + SET + bio.expr_dt = lot.expr_dt + WHERE + bio.mkr_cd = lot.ser_num + AND bio.rec_lot_num = lot.lot_num + """ + 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('製造ロット管理番号マスタから有効期限をセットに成功') From c9babbee11b73be5ff038bc13c2eb727575175b9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 09:41:27 +0900 Subject: [PATCH 353/962] =?UTF-8?q?feat:=20rec=5Fsts=5Fkbn=E3=81=AECASE?= =?UTF-8?q?=E6=96=87=E3=81=8B=E3=82=89=E3=80=8199=E3=81=AE=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82=E6=8A=BD?= =?UTF-8?q?=E5=87=BA=E6=9D=A1=E4=BB=B6=E3=81=A7=E5=BC=BE=E3=81=8B=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/create_bio_sales_lot.py | 3 --- 1 file changed, 3 deletions(-) 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 298c77c9..4e23cc44 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 @@ -142,9 +142,6 @@ def _insert_bio_sales_lot(db: Database): END AS iko_flg, CASE bio.rec_sts_kbn WHEN '0' THEN bio.rec_sts_kbn - /* 以下、抽出条件で弾かれているので取れない - WHEN '99' THEN bio.rec_sts_kbn - */ WHEN '1' THEN CASE conv.conv_cd WHEN 1 THEN bio.err_flg11 From 0849ae8365be9de8706bd91774fe45778d61e5ac Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 09:52:54 +0900 Subject: [PATCH 354/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E7=94=9F=E7=89=A9=E7=94=B1?= =?UTF-8?q?=E6=9D=A5=E3=83=87=E3=83=BC=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 63 +++++++++++++++++++ .../testdata/bio_slip_data_202304280000.tsv | 5 ++ .../testdata/bio_slip_data_202304290000.tsv | 5 ++ 3 files changed, 73 insertions(+) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 7d06b39c..31717661 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -948,3 +948,66 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_load_14_bio_slip_data_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_BIO_SLIP_DATA) + table_name_src = mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "bio_slip_data_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, "bio_slip_data_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_org_kbn = o.slip_org_kbn)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv new file mode 100644 index 00000000..0c345954 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304280000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D452960211JD1111311102503851400002304016427519111 496350122バベンチオテンテキ200MG 1V ソウゴウメデイカルニホンコウカンビツクバシ タカサキ 753 BAVB007 000003 000000 000000 " "296" "02" "11JD11113111025" "0385140000" "496350122" "111" "230401" "20230401" "6427519" "バベンチオテンテキ200MG 1V " "ソウゴウメデイカルニホンコウカンビ" "ツクバシ タカサキ 753 " "BAVB007 " "000003" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000126" "129" "20230401" "202305082041" "110" "売上" "11JD" "300001370" "川崎南支店" "" "200000007" "アルフレッサ株式会社" "0385140000" "670235967013012526" "医療法人社団こうかん会 日本鋼管病院" "イリョウホウジンシャダンコウカンカイ ニホンコウカンビョウイン" "210-0852 神奈川県川崎市川崎区鋼管通1−2−1" "496350122" "バベンチオ 注射剤 200mg 1VIAL" "" "1" "" "3" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211G11111377452402930640002304016433215111 496300127ゴナ-ルエフヒカチユウペン450 1トウ セコム)オギクボビヨウイン トウキヨウト シブヤク ジングウマエ 1-5-1 GF4C001 000002 000000 000000 " "296" "02" "11G111113774524" "0293064000" "496300127" "111" "230401" "20230401" "6433215" "ゴナ-ルエフヒカチユウペン450 1トウ " "セコム)オギクボビヨウイン " "トウキヨウト シブヤク ジングウマエ 1-5-1 " "GF4C001 " "000002" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000127" "130" "20230401" "202305082041" "110" "売上" "11G1" "300001351" "杉並・中野支店" "" "200000007" "アルフレッサ株式会社" "0293064000" "670234652241314835" "医療法人財団荻窪病院 荻窪病院" "イリョウホウジンザイダンオギクボビョウイン オギクボビョウイン" "167-0035 東京都杉並区今川3−1−24" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "2" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211V11121120604204799500002304016461276111 496300134ゴナ-ルエフヒカチユウペン900 1トウ ニチイサ-ビスキユウシユウフクオカサンフクオカシ サワラク モモチハマ 1-7-5 7F GF9C002 000010 000000 000000 " "296" "02" "11V111211206042" "0479950000" "496300134" "111" "230401" "20230401" "6461276" "ゴナ-ルエフヒカチユウペン900 1トウ " "ニチイサ-ビスキユウシユウフクオカサン" "フクオカシ サワラク モモチハマ 1-7-5 7F " "GF9C002 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000128" "131" "20230401" "202305082041" "110" "売上" "11V1" "300001491" "福岡第一支店" "" "200000007" "アルフレッサ株式会社" "0479950000" "670235883412145206" "医療法人社団高邦会 福岡山王病院" "イリョウホウジンシャダンコウホウカイ フクオカサンノウビョウイン" "814-0001 福岡県福岡市早良区百道浜3−6−45" "496300134" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "0287503000" "496300127" "111" "230401" "20230401" "6523689" "ゴナ-ルエフヒカチユウペン450 1トウ " "イツカンドウヤツキヨク0561 " "カワサキシ アサオク フルサワ 172-1 " "GF4C001 " "000001" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000129" "132" "20230401" "202305082041" "110" "売上" "11JB" "300001369" "川崎北支店" "" "200000007" "アルフレッサ株式会社" "0287503000" "670237078008644636" "株式会社キリン堂 一貫堂薬局" "カブシキガイシャキリンドウ イッカンドウヤッキョク" "215-0026 神奈川県川崎市麻生区古沢172−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "1" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv new file mode 100644 index 00000000..e7f85ba8 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/bio_slip_data_202304290000.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D452960211V11121120604204799500002304016461276111 496300134ゴナ-ルエフヒカチユウペン900 1トウ ニチイサ-ビスキユウシユウフクオカサンフクオカシ サワラク モモチハマ 1-7-5 7F GF9C002 000010 000000 000000 " "296" "02" "11V111211206042" "0479950000" "496300134" "111" "230401" "20230401" "6461276" "ゴナ-ルエフヒカチユウペン900 1トウ " "ニチイサ-ビスキユウシユウフクオカサン" "フクオカシ サワラク モモチハマ 1-7-5 7F " "GF9C002 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000128" "131" "20230401" "202305082041" "110" "売上" "11V1" "300001491" "福岡第一支店" "" "200000007" "アルフレッサ株式会社" "0479950000" "670235883412145206" "医療法人社団高邦会 福岡山王病院" "イリョウホウジンシャダンコウホウカイ フクオカサンノウビョウイン" "814-0001 福岡県福岡市早良区百道浜3−6−45" "496300134" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "0287503000" "496300127" "111" "230401" "20230401" "6523689" "ゴナ-ルエフヒカチユウペン450 1トウ " "イツカンドウヤツキヨク0561 " "カワサキシ アサオク フルサワ 172-1 " "GF4C001 " "000001" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000129" "132" "20230401" "202305082041" "110" "売上" "11JB" "300001369" "川崎北支店" "" "200000007" "アルフレッサ株式会社" "0287503000" "670237078008644636" "株式会社キリン堂 一貫堂薬局" "カブシキガイシャキリンドウ イッカンドウヤッキョク" "215-0026 神奈川県川崎市麻生区古沢172−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "1" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D4529602K1201130032696508657140002304016527757111 496300110ゴナ-ルエフヒカチユウペン300 1トウ モリノクスリヤヤツキヨク オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 GF3B013 000005 000000 000000 " "296" "02" "K12011300326965" "0865714000" "496300110" "111" "230401" "20230401" "6527757" "ゴナ-ルエフヒカチユウペン300 1トウ " "モリノクスリヤヤツキヨク " "オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 " "GF3B013 " "000005" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000130" "133" "20230401" "202305082041" "110" "売上" "K120" "300006583" "沖縄第二営業部" "" "200000007" "アルフレッサ株式会社" "0865714000" "670232348519842842" "有限会社吾妻サンライズ 森の薬屋薬局" "ユウゲンガイシャアガツマサンライズ モリノクスリヤヤッキョク" "901-0406 沖縄県島尻郡八重瀬町屋宜原238−1" "496300110" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "1" "" "5" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D4529602K1201130032696508657140002304016527757111 496300127ゴナ-ルエフヒカチユウペン450 1トウ モリノクスリヤヤツキヨク オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 GF4B011 000010 000000 000000 " "296" "02" "K12011300326965" "0865714000" "496300127" "111" "230401" "20230401" "6527757" "ゴナ-ルエフヒカチユウペン450 1トウ " "モリノクスリヤヤツキヨク " "オキナワケン シマジリグン ヤエセチヨウ ヤギバル 238-1 " "GF4B011 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000131" "134" "20230401" "202305082041" "110" "売上" "K120" "300006583" "沖縄第二営業部" "" "200000007" "アルフレッサ株式会社" "0865714000" "670232348519842842" "有限会社吾妻サンライズ 森の薬屋薬局" "ユウゲンガイシャアガツマサンライズ モリノクスリヤヤッキョク" "901-0406 沖縄県島尻郡八重瀬町屋宜原238−1" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" From 35b56d0de331af4d3eab3f26c1b9472d07776df9 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 10:08:55 +0900 Subject: [PATCH 355/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E3=83=AD=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=87=E3=83=BC=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 65 ++++++++++++++++++- .../testdata/lot_num_mst_202304280000.tsv | 5 ++ .../testdata/lot_num_mst_202304290000.tsv | 5 ++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 31717661..5f373fe0 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -1000,7 +1000,70 @@ class TestImportFileToDb: assert_table_results(result_org, assert_list, ignore_columns) # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 result_src = self.db.execute_select( - f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_org_kbn = o.slip_org_kbn)") + f"select * from {table_name_src} s inner join {table_name_org} o on (s.slip_mgt_num = o.slip_mgt_num)") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # srcテーブル結果のレコード件数 (insert 4row + update 2row + insert 2row = 6row) + result_src_count = self.db.execute_select(f"select count(*) from {table_name_src} ") + assert result_src_count[0]['count(*)'] == 6 + + # teardown + + def test_load_15_lot_num_mst_ok(self, mapper): + table_name_org = mapper.get_org_table(mapper.CONDKEY_LOT_NUM_MST) + table_name_src = mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST) + + # setup + self.batch_context.is_vjsk_stock_import_day = True + self.db.execute(f"truncate table {table_name_src}") + + # assertion1 (insert 4row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "lot_num_mst_202304280000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果を取得 + result_src = self.db.execute_select(f"select * from {table_name_src}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # srcテーブル結果が期待値通りかを突合 + assert_table_results(result_src, assert_list, ignore_columns) + + # assertion2 (update 2row +insert 2row) + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "lot_num_mst_202304290000.tsv") + } + VjskDataLoadManager.load(target_dict) + + # 期待値データファイル読み込み + assert_list = create_vjsk_assertion_list(target_dict["src_file_path"]) + # orgテーブル結果を取得 + result_org = self.db.execute_select(f"select * from {table_name_org}") + # 突合から除外する項目 + ignore_columns = ['dwh_upd_dt'] + # orgテーブル結果が期待値通りかを突合 + assert_table_results(result_org, assert_list, ignore_columns) + # srcテーブル結果(orgテーブル結果のPK値で一致するもの)を取得 + result_src = self.db.execute_select( + f"select * from {table_name_src} s inner join {table_name_org} o on (s.ser_num = o.ser_num and s.lot_num = o.lot_num)") # 突合から除外する項目 ignore_columns = ['dwh_upd_dt'] # srcテーブル結果が期待値通りかを突合 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv new file mode 100644 index 00000000..3acfb7cc --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304280000.tsv @@ -0,0 +1,5 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA001" "20230331" "20210510" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA002" "20230331" "20210615" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA003" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA004" "20231031" "20210823" "23-05-08 20:40:41" "batch" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv new file mode 100644 index 00000000..c7e86b9a --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/lot_num_mst_202304290000.tsv @@ -0,0 +1,5 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA003" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA004" "20231031" "20210823" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA005" "20231031" "20210927" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA006" "20240131" "20211025" "23-05-08 20:40:41" "batch" From 9f7caa14dc95bc704dd022e5cb419e7725ab3584 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 10:16:39 +0900 Subject: [PATCH 356/962] =?UTF-8?q?feat:=20=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E4=BB=95=E6=A7=98=E6=9B=B8=E4=BD=9C=E6=88=90=E4=B8=AD=E3=81=AE?= =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=BC=E3=83=89=E3=83=90=E3=83=83=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/bio_sales/create_bio_sales_lot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 4e23cc44..bbfedb64 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 @@ -51,7 +51,7 @@ def _delete_not_confirm_data_in_bio_sales_lot(db: Database): DELETE FROM src05.bio_sales_lot AS lot INNER JOIN src05.bio_sales AS bio ON bio.slip_mgt_num = lot.slip_mgt_num - AND bio.dwh_upd_dt = src05.get_syor_date() + AND DATE(bio.dwh_upd_dt) = src05.get_syor_date() """ res = db.execute(sql) logging_sql(logger, sql) @@ -271,7 +271,7 @@ def _insert_bio_sales_lot(db: Database): AND bio.err_flg9 = '0' AND bio.err_flg10 = '0' AND bio.rec_sts_kbn <> '99' - AND bio.dwh_upd_dt = src05.get_syor_date() + AND DATE(bio.dwh_upd_dt) = src05.get_syor_date() """ res = db.execute(sql) logging_sql(logger, sql) @@ -289,6 +289,7 @@ def _delete_empty_lot_record(db: Database): 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) From 16a62a9cfc431c6c309580ed56d0d47e1b948e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 6 Jun 2023 11:43:18 +0900 Subject: [PATCH 357/962] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E7=B5=90=E6=9E=9C=EF=BC=91=E4=BB=B6=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 39 +- .../src/model/db/ultmarc_doctor_info.py | 18 + .../src/model/db/ultmarc_doctor_wrkplace.py | 15 + .../model/db/ultmarc_doctor_wrkplace_his.py | 16 + .../src/model/db/ultmarc_sosiety.py | 10 + .../model/db/ultmarc_specialist_license.py | 10 + .../src/model/db/ultmarc_trt_course.py | 9 + .../view/ultmarc_doctor_info_view_model.py | 97 ++++ .../repositories/ultmarc_doctor_repository.py | 39 +- .../ultmarc_dr_wrkplace_his_repository.py | 39 ++ .../ultmarc_dr_wrkplace_repository.py | 39 ++ .../ultmarc_sosiety_repository.py | 30 ++ .../ultmarc_specialist_license_repository.py | 31 ++ .../ultmarc_trt_course_repository.py | 31 ++ .../src/services/ultmarc_view_service.py | 53 +- ecs/jskult-webapp/src/templates/docInfo.html | 486 ++++++++++++++++++ .../src/templates/docSearch.html | 24 +- 17 files changed, 969 insertions(+), 17 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py create mode 100644 ecs/jskult-webapp/src/templates/docInfo.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 133f6c64..399ca6e4 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -7,10 +7,8 @@ from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel -from src.model.view.bio_view_model import BioViewModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService -from src.services.bio_view_service import BioViewService from src.services.ultmarc_view_service import UltmarcViewService from src.services.session_service import set_session from src.system_var import constants @@ -97,3 +95,40 @@ def search_doc( 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() + + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 医師情報の取得 + ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) + # バッチ起動判定の取得 + 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( + 'docInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response 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..c8f555cc --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py @@ -0,0 +1,15 @@ +from typing import Optional +from datetime import date + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +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_his.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py new file mode 100644 index 00000000..3fe3de38 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py @@ -0,0 +1,16 @@ +from typing import Optional +from datetime import date + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +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_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..23908fce --- /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/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..1cfbcf5f --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -0,0 +1,97 @@ +import json +from collections import OrderedDict +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_trt_course import UltmarcTrtCoursedbmodel +from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel +from src.model.db.ultmarc_specialist_license import UltmarcSpecialistLicenseDBModel +from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel +from src.model.db.ultmarc_doctor_wrkplace_his import UltmarcDoctorWrkplaceHisDBModel + +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]] + + 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 is_input_dcf_pcf_dr_cd(self): + return self.doctor_info_data.dcf_pcf_dr_cd or '' + + # 氏名(漢字) + def is_input_dr_name(self): + return self.doctor_info_data.dr_name or '' + + # 氏名(かな・カナ) + def is_input_dr_name_kana(self): + return self.doctor_info_data.dr_name_kana or '' + + # 性別 + def is_input_sex(self): + return self.doctor_info_data.sex or '' + + # 出身大学 + def is_input_alma(self): + return self.doctor_info_data.alma or '' + + # 出身県 + def is_input_hometown(self): + return self.doctor_info_data.hometown or '' + + # 卒年 + def is_input_grad_y(self): + return self.doctor_info_data.grad_y or '' + + # 登録年 + def is_input_drday_y(self): + return self.doctor_info_data.drday_y or '' + + # 開業年 + def is_input_estab_y(self): + return self.doctor_info_data.estab_y or '' + + def is_input_birthday_fromat(self): + return self._format_date_string(self.doctor_info_data.birthday) + + def is_input_trt_course_data_size(self): + return len(self.trt_coursed_data) + + def is_data_string_empty_fromat(self, data_string): + return data_string 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.BIO_SEARCH_RESULT_MAX_COUNT + + def _format_date_string(self, date_string): + if date_string is None: + return '' + date = datetime.strptime(date_string, '%Y%m%d') + return date.strftime('%Y/%m/%d') + + 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/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index f9293893..60f1543d 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -2,6 +2,7 @@ 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.request.ultmarc_doctor import UltmarcDoctorModel +from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -15,7 +16,7 @@ class UltmarcDoctorRepository(BaseRepository): com_inst.form_inst_name_kanji, com_inst.dcf_dsf_inst_cd, com_blng_sec.blng_sec_name, - com_trt_course.trt_course_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, @@ -33,6 +34,7 @@ class UltmarcDoctorRepository(BaseRepository): 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 ORDER BY com_dr.dcf_pcf_dr_cd, com_dr_wrkplace.dcf_dsf_inst_cd, @@ -128,3 +130,38 @@ class UltmarcDoctorRepository(BaseRepository): 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..14f0de45 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -0,0 +1,39 @@ +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.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[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..fd1295d7 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -0,0 +1,39 @@ +from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel +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() 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..35632081 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py @@ -0,0 +1,31 @@ +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..f50fc02a --- /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/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 140863e7..1b207c5e 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -9,9 +9,15 @@ from src.aws.s3 import S3Client from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel +from src.model.view.ultmarc_doctor_info_view_model import UltmarcDoctorInfoViewModel from src.repositories.base_repository import BaseRepository from src.repositories.prefc_master_repository import PrefcMasterRepository from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository +from src.repositories.ultmarc_trt_course_repository import UltmarcTrtCourseRepository +from src.repositories.ultmarc_sosiety_repository import UltmarcSosietyRepository +from src.repositories.ultmarc_dr_wrkplace_repository import UltmarcDoctorWrkplaceRepository +from src.repositories.ultmarc_dr_wrkplace_his_repository import UltmarcDoctorWrkplaceHisRepository +from src.repositories.ultmarc_specialist_license_repository import UltmarcSpecialistLicenseRepository from src.services.base_service import BaseService from src.system_var import constants, environment @@ -19,16 +25,31 @@ from src.system_var import constants, environment class UltmarcViewService(BaseService): REPOSITORIES = { 'ultmarc_doctor_repository': UltmarcDoctorRepository, - 'prefc_repository': PrefcMasterRepository + 'prefc_repository': PrefcMasterRepository, + 'ultmarc_trt_course_repository': UltmarcTrtCourseRepository, + '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 + ultmarc_trt_course_repository: UltmarcTrtCourseRepository + 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.ultmarc_trt_course_repository = repositories['ultmarc_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_view( self, @@ -46,3 +67,33 @@ class UltmarcViewService(BaseService): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) return ultmarc_doctor_data + + def info_ultmarc_doctor_view( + self, + id, + session: UserSession + ) -> 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 diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html new file mode 100644 index 00000000..e9214447 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -0,0 +1,486 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + 医師情報 + + + + + + + + + + + + + + + + + + +

医師情報

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

所属学会

+
+ + + + + + + + + + {% for sosiety_data in ultmarc.sosiety_data %} + + + + + {% endfor %} + +
コード所属学会
{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}}{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_name)}}
+
+
+

所属学会専門医

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

勤務先履歴

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} + {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + + + {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} + {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + + + + + + + + + + + +
ULT施設コード勤務先略名所属部科名役職名職位開始年月日終了年月日
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}
+
+ + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 475578fa..2168aa3e 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -20,19 +20,17 @@ - - - - - - - -

医師検索一覧

- {% if ultmarc.is_batch_processing %} -
日次バッチ処理中のため、データが正しく表示されない可能性があります
- {% endif %} -
- + + + + + + +

医師検索一覧

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
From c874596c86f28f26d97033becae151825f4d7462 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 16:55:22 +0900 Subject: [PATCH 358/962] =?UTF-8?q?fix:=20SSO=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82=E3=83=AD=E3=82=B0=E3=82=82=E4=BB=95=E8=BE=BC=E3=82=93?= =?UTF-8?q?=E3=81=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 18 ++++++++++++++---- ecs/jskult-webapp/src/model/db/user_master.py | 2 +- .../src/model/internal/session.py | 10 +++++----- .../src/model/view/user_view_model.py | 3 --- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index fea45a75..09032af5 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -9,6 +9,7 @@ from starlette import status from src.depends.auth import code_security from src.depends.services import get_service from src.error.exceptions import JWTTokenVerifyException, NotAuthorizeException +from src.logging.get_logger import get_logger from src.model.internal.session import UserSession from src.model.request.login import LoginModel from src.model.view.mainte_login_view_model import MainteLoginViewModel @@ -21,6 +22,8 @@ from src.templates import templates router = APIRouter() router.route_class = AfterSetCookieSessionRoute +logger = get_logger('ログイン') + ######################### # Views # ######################### @@ -66,9 +69,10 @@ def login( try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: - print(e) + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) - except JWTTokenVerifyException: + except JWTTokenVerifyException as e: + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) verified_token = jwt_token.verify_token() @@ -77,10 +81,13 @@ def login( user_record = login_service.logged_in_user(user_id) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): + logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # メンテユーザーではない場合、ログアウトにリダイレクトする if user_record is None or not user_record.is_maintenance_user(): + logger.info(f'メンテナンスユーザーではない: {user_id}, メンテナンスユーザーフラグ: {user_record.mntuser_flg}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) + logger.info(f'メンテナンスユーザー認証成功: {user_id}') # CSRFトークンを生成 csrf_token = secrets.token_urlsafe(32) # DynamoDBにトークンIDを設定する @@ -118,7 +125,8 @@ def sso_authorize( try: # トークン検証 verified_token = jwt_token.verify_token() - except JWTTokenVerifyException: + except JWTTokenVerifyException as e: + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) # トークンからユーザーIDを取得 @@ -126,11 +134,13 @@ def sso_authorize( user_record = login_service.logged_in_user(user_id) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): + logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # Merckユーザーではない場合、ログアウトにリダイレクトする if user_record is None or not user_record.is_groupware_user(): + logger.info(f'メンテナンスユーザーではない: {user_id}, メンテナンスユーザーフラグ: {user_record.mntuser_flg}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) - + logger.info(f'顧客ユーザー認証成功: {user_id}') # CSRFトークンを生成 csrf_token = secrets.token_urlsafe(32) # DynamoDBにトークンIDを設定する diff --git a/ecs/jskult-webapp/src/model/db/user_master.py b/ecs/jskult-webapp/src/model/db/user_master.py index 82fe50f9..4fe966aa 100644 --- a/ecs/jskult-webapp/src/model/db/user_master.py +++ b/ecs/jskult-webapp/src/model/db/user_master.py @@ -33,4 +33,4 @@ class UserMasterModel(BaseDBModel): return self.mntuser_flg == '1' def is_groupware_user(self): - return self.mntuser_flg == '0' + return self.mntuser_flg == '0' or self.mntuser_flg is None diff --git a/ecs/jskult-webapp/src/model/internal/session.py b/ecs/jskult-webapp/src/model/internal/session.py index 15739c28..d04e6207 100644 --- a/ecs/jskult-webapp/src/model/internal/session.py +++ b/ecs/jskult-webapp/src/model/internal/session.py @@ -14,11 +14,11 @@ class UserSession(DynamoDBTableModel): session_key = UnicodeAttribute(hash_key=True) user_id = UnicodeAttribute() id_token = UnicodeAttribute() - doc_flg = UnicodeAttribute() - inst_flg = UnicodeAttribute() - bio_flg = UnicodeAttribute() - master_mainte_flg = UnicodeAttribute() - user_flg = UnicodeAttribute() + doc_flg = UnicodeAttribute(null=True) + inst_flg = UnicodeAttribute(null=True) + bio_flg = UnicodeAttribute(null=True) + master_mainte_flg = UnicodeAttribute(null=True) + user_flg = UnicodeAttribute(null=True) refresh_token = UnicodeAttribute() csrf_token = UnicodeAttribute() last_access_time = NumberAttribute() 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 3ef9ca12..55f1528a 100644 --- a/ecs/jskult-webapp/src/model/view/user_view_model.py +++ b/ecs/jskult-webapp/src/model/view/user_view_model.py @@ -21,6 +21,3 @@ class UserViewModel(BaseModel): def has_master_maintenance_permission(self): return self.master_mainte_flg == '1' - - def is_maintenance_user(self): - return self.user_flg == '1' From 607784bc50a8597647e145b74812d175f578460d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 6 Jun 2023 17:55:47 +0900 Subject: [PATCH 359/962] =?UTF-8?q?feat:=20=E5=BE=93=E6=A5=AD=E5=93=A1?= =?UTF-8?q?=E6=8B=85=E5=BD=93=E6=96=BD=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E7=8F=BE=E8=A1=8CMINE=E3=81=AE?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AB=E3=83=AD=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index b4b6e4e7..e325d7a4 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -115,15 +115,14 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), emp_chg_inst_row) - # 適用終了日 ≧ 適用開始日の場合 - if _str_to_date_time(emp_chg_inst_row['end_date']) >= start_date: + # 適用開始日 < 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) - if last_end_date >= start_date: - continue - # DCF施設統合マスタの適用月度の前月末日 < 適用開始日、または適用終了日 < 適用開始日の場合、N(論理削除レコード)に設定する + 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']) From 0390e23ca8cd73e0ef7c9c687ae3d44d89211795 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 6 Jun 2023 19:32:46 +0900 Subject: [PATCH 360/962] =?UTF-8?q?=E8=87=AA=E5=8B=95=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E5=AE=9F=E8=A3=85=E3=80=80=E7=95=B0=E5=B8=B8=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vjsk_file_check/test_vjsk_file_check.py | 4 +- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 278 ++++++++++++++++-- .../UnzipError/bio_slip_data_202304270000.gz | Bin 0 -> 2649 bytes .../UnzipError/fcl_mst_202304270000.gz | Bin 0 -> 2003 bytes .../UnzipError/hld_mst_202304270000.gz | Bin 0 -> 541 bytes .../UnzipError/lot_num_mst_202304270000.gz | Bin 0 -> 415 bytes .../UnzipError/mdb_conv_mst_202304270000.gz | Bin 0 -> 533 bytes .../mkr_org_horizon_202304270000.gz | Bin 0 -> 808 bytes .../UnzipError/org_cnv_mst_202304270000.gz | Bin 0 -> 508 bytes .../UnzipError/phm_prd_mst_202304270000.gz | Bin 0 -> 1175 bytes .../UnzipError/phm_price_mst_202304270000.gz | Bin 0 -> 529 bytes .../UnzipError/slip_data_202304270000.gz | Bin 0 -> 2890 bytes .../stock_slip_data_202304270000.gz | Bin 0 -> 928 bytes .../UnzipError/tran_kbn_mst_202304270000.gz | Bin 0 -> 498 bytes .../UnzipError/vop_hco_merge_202304270000.gz | Bin 0 -> 398 bytes .../whs_customer_mst_202304270000.gz | Bin 0 -> 1305 bytes .../UnzipError/whs_mst_202304270000.gz | Bin 0 -> 589 bytes .../testdata/phm_price_mst_dataerror.tsv | 3 + .../testdata/phm_price_mst_formaterror.tsv | 2 + 19 files changed, 255 insertions(+), 32 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/hld_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mdb_conv_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_price_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/tran_kbn_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py index 99b31d68..1c523d0e 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/test_vjsk_file_check.py @@ -10,7 +10,7 @@ def test_check_received_files_ok1(init_check_received_files_ok1): 観点 正常系 : 卸在庫データ取込対象日 期待値 - 例外が発生する + 例外が発生しない """ batch_context = BatchContext.get_instance() batch_context.is_vjsk_stock_import_day = True @@ -29,7 +29,7 @@ def test_check_received_files_ok2(init_check_received_files_ok2): 観点 正常系 : 卸在庫データ取込対象日以外 期待値 - 例外が発生する + 例外が発生しない """ batch_context = BatchContext.get_instance() batch_context.is_vjsk_stock_import_day = False diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 5f373fe0..a648724f 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -10,6 +10,7 @@ from src.batch.vjsk.vjsk_data_load_manager import VjskDataLoadManager from src.batch.vjsk.vjsk_importer import (_check_received_files, _import_file_to_db) from src.db.database import Database +from src.error.exceptions import BatchOperationException # from tests.testing_vjsk_utility import create_vjsk_assertion_dictionary from tests.testing_vjsk_utility import (assert_table_results, create_vjsk_assertion_list) @@ -20,6 +21,7 @@ class TestImportFileToDb: batch_context: BatchContext test_file_path_import_all: str test_file_path_load_individual: str + test_file_path_unzip_error: str @pytest.fixture(autouse=True, scope='function') def pre_test(self, database: Database): @@ -27,6 +29,7 @@ class TestImportFileToDb: # setup self.test_file_path_import_all = path.join(path.dirname(__file__), "testdata", "TestImportFileToDb") self.test_file_path_load_individual = path.join(path.dirname(__file__), "testdata") + self.test_file_path_unzip_error = path.join(path.dirname(__file__), "testdata", "UnzipError") self.batch_context = BatchContext.get_instance() @@ -80,41 +83,72 @@ class TestImportFileToDb: key = f"{receive_folder}/{test_file}" s3_client.upload_file(file_name, bucket_name, key) - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_SLIP_DATA)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_HLD_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_FCL_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA)}") - # self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_ORG_CNV_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_VOP_HCO_MERGE)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_HLD_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_FCL_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MKR_ORG_HORIZON)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_TRAN_KBN_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRD_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_PHM_PRICE_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_WHS_CUSTOMER_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_MDB_CONV_MST)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_BIO_SLIP_DATA)}") + self.db.execute(f"truncate table {mapper.get_src_table(mapper.CONDKEY_LOT_NUM_MST)}") # assertion received_s3_files = _check_received_files() _import_file_to_db(received_s3_files) - # # 検証 (卸在庫データファイル) - # table_name_org = mapper.get_org_table(mapper.CONDKEY_STOCK_SLIP_DATA) - # table_name_src = mapper.get_src_table(mapper.CONDKEY_STOCK_SLIP_DATA) - # result = self.db.execute(f"select * from {table_name_org}") - # assert result.rowcount == 10 - # result = self.db.execute(f"select * from {table_name_src}") - # assert result.rowcount == 10 - - # # 検証 (卸販売データ) - # table_name_org = mapper.get_org_table(mapper.CONDKEY_SLIP_DATA) - # table_name_src = mapper.get_src_table(mapper.CONDKEY_SLIP_DATA) - # result = self.db.execute(f"select * from {table_name_org}") - # assert result.rowcount == 10 - # result = self.db.execute(f"select * from {table_name_src}") - # assert result.rowcount == 10 + # 検証 + condkey = mapper.CONDKEY_STOCK_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_ORG_CNV_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_VOP_HCO_MERGE + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_WHS_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_HLD_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_FCL_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_MKR_ORG_HORIZON + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_TRAN_KBN_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_PHM_PRD_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_PHM_PRICE_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_WHS_CUSTOMER_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_MDB_CONV_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_BIO_SLIP_DATA + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) + condkey = mapper.CONDKEY_LOT_NUM_MST + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_org_table(condkey)}")) + assert 10 == len(self.db.execute_select(f"select * from {mapper.get_src_table(condkey)}")) # teardown for test_file in test_files: @@ -1074,3 +1108,187 @@ class TestImportFileToDb: assert result_src_count[0]['count(*)'] == 6 # teardown + + def test_unzip_to_error(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 異常系 : gzファイルが解凍できない + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload + # ※.gzだが、7zipで圧縮してあるので、解凍に失敗するのが期待値 + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path_unzip_error, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + # assertion + received_s3_files = _check_received_files() + with pytest.raises(Exception) as e: + _import_file_to_db(received_s3_files) + + # 検証 + assert str(e.value) == "file could not be opened successfully" + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + def test_load_data_error(self, mapper): + """ + 観点 + 異常系 : 日付型矛盾のデータ ※製品価格マスタファイルで確認 + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_dataerror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("SQL Error:") > 0 + + # teardown + + def test_load_format_error(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("SQL Error:") > 0 + + # teardown + + def test_s3backup_ok(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 正常系 : S3受領ファイルのバックアップフォルダ移動が完了する + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup - テスト用受領ファイルをS3受領バケットにupload + # ※.gzだが、7zipで圧縮してあるので、解凍に失敗するのが期待値 + test_files = [ + "stock_slip_data_202304270000.gz", + "slip_data_202304270000.gz", + "org_cnv_mst_202304270000.gz", + "vop_hco_merge_202304270000.gz", + "whs_mst_202304270000.gz", + "hld_mst_202304270000.gz", + "fcl_mst_202304270000.gz", + "mkr_org_horizon_202304270000.gz", + "tran_kbn_mst_202304270000.gz", + "phm_prd_mst_202304270000.gz", + "phm_price_mst_202304270000.gz", + "whs_customer_mst_202304270000.gz", + "mdb_conv_mst_202304270000.gz", + "bio_slip_data_202304270000.gz", + "lot_num_mst_202304270000.gz" + ] + for test_file in test_files: + file_name = path.join(self.test_file_path_import_all, test_file) + key = f"{receive_folder}/{test_file}" + s3_client.upload_file(file_name, bucket_name, key) + + # assertion + received_s3_files = _check_received_files() + vjsk_recv_bucket.backup_dat_file(received_s3_files, "test") + + # 検証 + + # teardown + for test_file in test_files: + key = f"{receive_folder}/{test_file}" + s3_client.delete_object(Bucket=bucket_name, Key=key) + + def test_s3backup_to_error(self, s3_client, bucket_name, receive_folder, mapper): + """ + 観点 + 異常系 : S3受領ファイルのバックアップフォルダ移動ができない + 期待値 + 例外が発生する + """ + # setup - 卸在庫データ取込対象日 + self.batch_context.is_vjsk_stock_import_day = True + + # setup - S3受領バケットの内容をすべて削除する + vjsk_recv_bucket = VjskReceiveBucket() + s3_files = vjsk_recv_bucket.get_s3_file_list() + for file_obj in s3_files: + s3_client.delete_object(Bucket=bucket_name, Key=file_obj.get("filename")) + + # setup + + # assertion + with pytest.raises(Exception) as e: + # 有りもしないファイルをバックアップフォルダにコピーさせてコケさせる + received_s3_files = [] + received_s3_files.append({"filename": "dummy.dummy"}) + vjsk_recv_bucket.backup_dat_file(received_s3_files, "test") + + # 検証 + assert str(e.value) == "An error occurred (404) when calling the HeadObject operation: Not Found" + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/bio_slip_data_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..c609baff8d5bb8aa1df1dc627ae1f42d55a619b7 GIT binary patch literal 2649 zcmV-f3a0fpdc3bE8~_CBuppAJ2><{90001r000000002GB5Tj!L;nevo}N7H!}`6!|44bB1Zd zA;|%jBml99_4nA8eWK{mQ|@aUvr5q)p#iS!JzLh+jS-F0>q!Bu{9h#Aoj1PvK-DQg zi?9bnmd5E++p12iIy(d3{*^a$C5|$R?1=2i^oYv0|l|J6A+9t?vymZlos?NLqJ)*&N?E0 zhg-e=Aw*J-Rp~pNmm&&7Tk^5diW_I8v=d{v#wP*|A64&Pjbodn9>ckgn57f%;I9w` z`lkg7pF{UzJwO^w9q8(b*4ha^rvw8!hrZORZZ1S#U>-KnSbVR4lO}q|=@7wfHd1nf z#zpDD6wYe*d4_F62!#HN%?=-DYj5&ekvY-XsRK3UPyrj<-xZZuVU*2&=XHn~ge42V zaUIg&;+WL~&@Vw?&sU7M06xLxk37`OGDPq83lmzz75>NX zPUt|te?LLOLBoz&T`9NFVIfl_F2-I~@wX51_d~arq-=eF(R&~|=B@G|&gPXm z;3RwHhlA@T5D;r>;jff_^YAiq))e$|aLFTL{IRj8h+R;F6vOlX&a^~p^!SRrfE@rR zLAz>Q)!p}5e4rn?%9jKJ9Curv_mb*RJr9x<+P$Q{xW|J7+5dGPV7ecS@7}s6axR*< zGpw|GNGxPv?AYZ`mxWIu%pJV(@uUW;E9ufu|6-3WEiR4;tNh*#-Ds@D3Tdu#hewR& zcUlyKZ;YjS8b`AEck*u+v=t;7YTypsqX+VlrRPBlLaRMr#$X*nago$1J5V&*>hrz; zQ}v~v9ous#a5B3 zihpgfhH5Yy;qIqas;n*E?OcArL)<;PmQfD)k!s5~qN-q~6vz~2!wboq#&nahQI+=grbyO?+s1UTDRCVKFk7?< zLOL%Id&}H4J{jP8Ubl}Ukflf&&=t)#VI_nHp?Bnx9Th@taa!iA_=Yl@%)57 z*Ic7(SoB78L<7yZz)8z1ON3`VbLCy$IpTi_NQjk=f>1FXo$23!*234_ylNh{|FWA7 zeONyc7YndnfOqIJA-CQQ^Ch|_sNvlOFIwd44&Z(H6q~@PK!p-)on|;W+5bYM3xk1; zijOge=hlkkZQV7f?5+g`IuGwC(t58FT@q@5ZM0ARhd~Ed6fh2W#E%1#_Ei}l+?Fcg9tLI%kWkoR=Zhdd+QrU&WZ9YldCSYB>H_sC^eEXXZr&Tio=pl$ zMTYH3t<1_B@yDHMH4(Y|BaubYW~fv(K|Amveb9)XwIm0o>8}h03fF`s?39Ec`e+&A zg^TTn=@$_vb`owMPUEGwS)O_-Krp2napxc#IX*>d zD;1U?7e7YmbwHm!&aBQ%WTk?M9jtz;7PxiEY!~t5E}QDeVxAQdId@#+On^)LK(_E1 zqd#t}KuqJVk47dGtJe`KeuXSIN;~zNP6c(2ND{?#lVV`e)hQ0RhT~ztY*b@UH}{j% zHz20;z+RtTm+zH5Y8GG_3!wozuIqUV!NHE^mWvb<_gOsRhf3qoEPjlK6Iq!3 zX}b6by{T@(J`NW7B$G3g0lHC6aR4q?nFrzo-@Bmh_sJ)-MHu86r%REf=mf_{9N5Qt zy1AlqdCr-@*S1G+Ok@GuLHMdFry&fc9l#TL(_@Cq9wo!OZxfYi*wd+~mEpEVcK{do zNtG>OU0NzDGnoFv6AO}|Akq)ZMF>dq8@P1)HZqMC%kXa6OWGs+1hjGMvQxFcO3Rg3 z>~)dlzT9pwl0gW4oG|zZ5;u@HXn3K>b%9biv&jGE@hT9f1!9Oy{@FSxbxS^*zWJL7B~!zHJ&&nnv<@3Hg^ge^(IjgH`Rg8f`MP`EU#S#e}E z!9K;^z*au7lisX?RkljrQ_YkTly&EpD9Xy(q)6s#I|cX|IXj9PPk4Z+Z<+K++10RSKX H00000Q4Zck literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/fcl_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f532e3b495ea3917ad7209461f48275b23036a0 GIT binary patch literal 2003 zcmV;^2Q2tEdc3bE8~_ATkz9m12LJ#70001b000000000D$omW68~+C}T>vu}$=Ybg zKS(NMs1ba1$3U6Yg*cVK^I7S$l??jsA_&s9t!8@)(gVV<48xNp`>0y;N6li5^G&s> z(w`j%W2~w}7?mn}+_ZKl)3=&trzk5KXRoy{CCwzz^kCk1f!bmGZ7u<3m4ZSdG|hxe zZeG_eoBUP?3wfQ4t4T_fx(Db%H>W7xUwfi|C}7qc#@hW8bk7TLZEgCxQMccGvO{|K zH*0lR%C;^115Eu$w2pJ61?Yumyp`k7G^JojBS)cDm7F%5@umk@%sT+CID9@d9z+Bz zib@3$9Nq(ie74YI(GtiWrx*zrnCtiZa(vn}%}v36?zukFNQ(f2*6yJ)3A618gpThH z)qjS_>*_nj%ydxOgf{uZHlu07XyO06-$g7=92Z|%7B1TnQX#$JX^nY#P^B0#-3y6V zzaI&9FO7WQgC>iAOG|ObvNxJYdR%<`@k#li*Tc&Ef4Z&%D{&PAgis9{{HCXA0Z48G zDbEf6BMl6ia!I#eJtM^k;iExkBCR}u6|cV;nU*Sw&t2Vr)V1vX(qZ{p3>A|nD6j~L?|D8;Ba!o$u~k5JOb2+` z7Z!$&H8)QEmKgZcFPaZ(RKEp*orZBlcsh-TXD($mq=IfD2?^Q9(Xk%l3N;PKtc4L- zKSC4Wr5Y0z*n4a?z4j~Ai0HX=_!k5OO%-%34I!o%p$D|N3eHhSN%EJFAr(c{#K=FD!L_S2jSHj{qW{i#w8Osoq5sSF` zLuW`+{QpNqFL;2FE~y$(n*0-xuJcP+VuH5>*wOPtKzfWdD;Oi<@vNTBUM69zd_bb( zj)S}|a6@Vmd2gDU#D>4$DV(OSVIlsED6*3wh1t0!JCeP?=#=x{aY|504W&YxEA|_X z4_zsIVa%QNn+bHHjJ4r~2eNQPq4J{){7^TgV^8!FM_Ka4f(F`ecaO>;wzp1^g@6L_ z{^W?~Crv(35YdbkH9M_m#aGb3ZlZp(ORumKo5j>x*=fx=JKh}-E?T8pFc~CUydJHb zhOuq>r)qn&HhiS>8F>7qYE^L)ti(QXlfJAuIqO(WTwg*793dX*PKdUnBW-}mCvTEZ z+Zsc4rgE;-$~f@kJfm04kZe1fL52Z=jk4RFQrz-~L}mr6vITF{@tbdesu}*rxYmId zmkok~_C!?l4fIzu;b#v63Lrp3fA=1mGM00JvmLQ8V;W)bzdzBW+?$2K;p}2W0&rtn zFY0rjGUX)bxkB=8!Whct9Eo9ks;gFAFU*~dJ8)jB(rNnN^pIFn6~_&W;k~P*fq#mU zPSn9K-d_dmU1OesB5MgQT&N+ou!wi<2V7G0CaICB)XV_y*^jrBCOLY zz4J-XARn2VioD(zN+UlT>OjtIzf%lQM4;iFp^Oylljx^8mY=GLe-Wa|$;_13)9UzZ z`=XXkEg9%Jb3)p$K*Fg7mNns}8k7z*eozs`JG%H%D}=ie_1l!NaI~uSb$YC7DoE`# zVg|4|Q-=_T1zRR(0tN?b4eNCPo-tm1hEM)a;e7SLH}4}bJ)@+gzoH;yl(O4}3eg32 zRtc2-;WUeS53;J;+>2+@GAKVO}; zE=g`7o?}-qxMflL#W7TZ=v;hN5}$2(>+7hcGOtS53BE3MprR_-8rzf`+`&>RL<&;5 zS(isjmZ{RGR?%}2Wj-fID6$I(VRg@P$rpDyL5}+Kxb7vHvse6P*(K`!az#r#bmaIg zr#yoyXp0R#pB0SSjW00#>J00AK(0Rjx1000OI0Sc-z$p8Qa0T~Ja z000000000001-0)W&mRVYye*XZ2)rsbO2ufG5|0DG5|9GFaR_FG5|LKFaR(BFaR(B lE&y}@VE}Rf000>P6bbffd4;Zbu5F4G{^cY?e-p8DJukPN{>6t zyxM9p^}y%Imz$^Z{CcOvacSGy+`e8{>x87(O{QEiCt}qNG8ljVGmWlL?$j@`6=hj- zrn|n8=S$1+zL{HBQ&c%XqvQ0%|4$IZjW`vVTncr~Z$ zn$^0M6Q4?}tuEL&|EKgxPd)}l7B&V(&c;jHZmD{=85md@ zCApvx2BZXy88R4h7*ZJG8FCql8A^b(5rY8`8v{ubAZ-q$Ay5w}o5)ZE)FjCu!o|qY T@c6V|UCT{IQ8q>f1+a+#BE!|7 literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/lot_num_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..821eccd466b905bf80dd76d301e3fc124198d007 GIT binary patch literal 415 zcmXr7+Ou9=hJnQ+czXF?1_)?^(rr5&Vjpn+XZRY+U?zR)U7?hcI@hH{|VX9u-=XKe36y9`r@mgK= z^qVvOJ3Z`!uVkcLk~?Om_vG~7b(b$TyLM_{2!4_LafRxW1(vtwU$L0A%W0O00?W}Y z=F(>$Rh)cg^IY|L`otoOpquRXPtDo7Q!2Z~VrMA>10xF?10!d{Uj}w=Mg~SjMMegm zE(Qh;E=I`~u51PdRz^uKXixzuL2HH_hJ1z+hIocNhEj%HAf3xl4CWg#7%&(y7z0TY nAZ-q$Ay5w}o5)ZE)GWy$!o|qY(3z=I*K(6ll#P)=0c~w=ef?Nu>KIY#xD?H7A{`BuP2R?L6JT$q}XRFAw=kq--eR=(CO74vLulBns6=WC@#!{a5UT=lgwS4b$YL-h5i2C#V@!ENR z%X&et!W7A;0?+h6y=>SdP@z#{Ca%TQnYqT`ne6*LGs~pv`B}I9lMdLr<@&*Q8Y<2& zZ)Kmm=zG*zDX=J6c*6DG{>8~l((9k;#J-iArSM)<);?cqGixU2SFyvnE90il(vxrI zFZH~&=&sYT105`4=gpT`A98q6Ji~wclG{n%e;td0!%D)P7*n66t_|M4fBHhkM|0*s zVPIfnVPjzAY%FGA=VoMJR8(YS;OSvt;NW6Ba6bDm0|P6gBo{P-fRvyuLoP!KLlQ$g zLo!1?LmopJkd@0&%uoWPjTj7o*ceEf0BLg|4S{+<*+hmSpmq^1MurA`cCEUWn~b7t Jj0_53lL2C#&i?=a literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/mkr_org_horizon_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..d6327182e541ade13aa5222abf35750d251a2f3e GIT binary patch literal 808 zcmXr7+Ou9=hJoetg8Nc+OblSq1)&(U!$oBt$o^+4i)ApIb!t_ya;SWc`v;pf4GED3 zPFw}NN6xeO3pTzCzVOE&Qo+j3&f1x+MAd`aA;Lg7(`TWk$gbB3f&GpeK^m1U1&+-72P{oM(N=j3tpC`{Q7X~gr)tW zzDqwh2?&+>Fo}K;S~tPG_HOT~(>vcC7T!_adivez<83SYm3Do&9kFG-$yUP&eAY^q zyXMb4^mk`O>HcZ!R~2l#@B1*!ESZ0*F#loCL)Tx6w^JPyJ z_UI->*qrlup=n$C;mpR2MHOL8PM@0Bi6kdT)imFi+{mu2_*hp!@lv|(Z%NKV`II#A zIm?be-W(S;VNtSTnv%fr@VEN;dBEflM&i^-*IBGY0>6Kp`hlZ8yrLvlwv<8CmY+kA7+j-06< zy6&Ax-WjNI-HT_}_ z{shjLutetR0|o02U(Tgr8B%SzKN%QV*ccc&o9YGAMv;004SbOXvUq literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/org_cnv_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..1efc8e0f44b3a75dbc3d87909461e23a1dd9f481 GIT binary patch literal 508 zcmXr7+Ou9=hJnR#wD3-x|PN!h(6vh|7_smk;c6sUS z?2CKUmx+ZoX{}3H7S6(*{FpoH+@H2L9jx);+KcTDuK4j@!HA_-B~bkNPsPaHp^1O5 zyh+zOab;27N|m;bMBf|cEFE>ih6lA2O-^?%KJ6=c`gx80Jhqi0T2tQtbCu_8U#s#| z_wzsTx%Qqf(#P44o&=W|U{3tkkS-apYY)Of!K z|G{VRiVV_o)S1s8-uWr(!@51jM}ACaSLL5sTYpIR_{*)cj?b9TziZvsE0MyB#8S;Q zwyLbU?P(WRHd~VGi)uq-?>~pMJZ-~kAEwqyC$;?Dc5cyb6Fbw-%lcY=B&!RSv`yF~ z({N_`#P!mxK7yLJR6gaJ*qqLru=kpg?w`Ot8>$uW3sxz=I`d-6F5kUe{ol5Hj#gZn zrCgl*e`B24=I5R(9_(4WHRkO@{gb9PTRN2(7+KgD7&#lG7}&WP85k8685wwb7#KLX z7}uLugfK9$GD>nm;{iwsS~KJ`6fvYT#4{u_1>0E|lh7urc#9#o##z4{pNSgy` j2-E}0CIa;^Fi0|pa4|A8R6D8GwcKPBWn*Me0GkW|=Sjg? literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/phm_prd_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..c45076da977e36b40f0eaf997380aa19e0be62e7 GIT binary patch literal 1175 zcmV;I1Zev=dc3bE8~_BBw@YXB0{{R30001j000000001AoC>$#6aNG4T>v;53HoF+ z&@S2Jrr0QE?D8ym#8}7ee4+>R!;{%NTS~jgD*WP%kP&<&E-J~ zg)?oPJtV|Hp2x^k5>oGD0d%7G5lrFWyF`h|8!gbCElES@8U-MQ*WkOhVMj1v%)sRV zk+gTXUJ8D3Ry;!0i=UyRC&MCp0uV%+qEjb{fPI0h9z1lK#Idx{3S@&+T+bcfIWB;jJYd>>G`|4uN0tle&~folAVu|^swnMKXSge6`*{w zPvz%!B|My(%wa9hZ5fd`8P8JLYm#)fx1j&YmcuYK8O>1!%1mxxO)~MCMq_GDojUV| z+tIJb^5TUsw@rIbA#WuFi7eSe=>gl1@c!|(FTZHUY}jmSk&gJ=pnEVm1S18e)Dow8 zVhEvW|w#99o4T5uC9+LSA8&Qo-7nU%G?7S^J7PQ z9N*2c&DDzi=U4#oLv`djy@ph4ZDRZ@kPxpiB*!^vmQ3 z=X?rNZ*-fZXZP}b00D9WPsUwAq!R9FECbj)E(3TLZfK~_S>AUEN`dSzmk6Y;R63ZA z7ZYE}K1nBx%-{=QWmgq`BP*nP4k8XFYjY+Ft8%DO5$ljIf;>j!1XshYH6p)rmi@<6 zPKKfhNw`AOAOgNMw>6%^ph4`mf`#BPJ^}yav#+)lx8Rk?bl*t>Ef-+1X?oV*FV0lU zaE$l2Uq5E7zWzilLn-7*4O0;f4}=fkBamNqBJO=m+H*rEuB_Y{<4D@NV{A7uwmVq- z7HjQa5iT)n3j^A zhy(Ky75coj}zC}v^%mb>JWpi0l-GvO8yxSA7cNgm`3v^t-Kz)<(ope`gD#* z=Xzbcvc%_rsV+Tqm za+gJSG_X=t8o)P{>6KUE<{K*O^WQ(?1LEI5>x;IQ>SG!SHFc nqTiQ$(3w<5Ls2 z9Bm2JEhoy5lu-Zx0R#pB0SSZk00#>J00AK(0Raq@000OI0okdpP5=M}0T~Ja00000 z0000001-O?Z~$lkZ2(^YZ~$@uWB^|PZ2)rsbO2ufG5|0DG5|9GFaR_FG5|LKFaR(B pFaR(BE&y}@VE}Rf000>P6bbks85zK!3qmpEaG%h8!2O>wK9<2kit|^B@danGb1&^9ou16R zG-dOH-WRSPzF(<~Q_oU-QkR_KE#%G7pRa%Lh4Hz~lbsJsn>053c=3PdJWHwVhj%Qs z@_9LVqq@Ke&4>N_LCL_i_s|REtgeEx%xP=aD`swStTX z4tq7e%q=RaPr83!()g)KzrC!>)qF`C7Iryk4vJUc7JXm@5}_oh!fISir}t zy3Kl)_?_VEl?JBYp5Ds4oU{FAVz9mCh2vW6)j4ZU*z{Wn6wX$D^Wt?l)2vk!S1dfv z!GHd-W>HJwRJM|>x8@&vAbZZ!{MR4?qCBW1d_1qJ|FHLOp~s%bVKNPKKX56e9~0d6*JS;?zy-E7Q-3^( zxgD5pIa}u4m&RoaIvmy~ZoJo?Y#QYdd2n&6p+Ka+;{>nGg^P6r7#LaD7#KMl(;3*g z85tNA6&V?LdKefuxEKZazXD^0l~Ixl8Yw_Z(4L`yA%h{8As$Ef1&|;E07>V` AX#fBK literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/slip_data_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c2dc3ad8b220f26cf496de8e62e50a8c31e1031 GIT binary patch literal 2890 zcmV-Q3$^q&dc3bE8~_A${EO?T3IG5A0001j000000002Gkw~N9NB;_-T>v?o31RZB zjjL?HEs`wV6&99nWD#rdJ2+Du{Ag@I6IJ|;VedSs$UwB-) z%l9JDE;s%nQzq~*D&e{SX@fcwG?|0{&(VkB4p7mN>%4lB=aL*)BQ2-0rVUAA%2U%Q zn6+v5aBMh!U=m2Hd0R>IZL*&Yj{xUwS~ymP7N``?3R|s7w2p7yT4D%_X|+gkGvW?N zcSq+w>A#((UQ{w;mk81NRs9BgsNE6rh9C^yc;v$<3u}Ouq5-o>y*U07;J(-0>=1BvKgyn=nvSFe1u2PhYU|yawdfzg6f7 z=xyphyn_WGlZ-j8Z^_up>M!}md1PJLj}fwsVrNzTW>7mkCUu;&e%?|;Hxa%#^Rgyg zv*>gow@?g!>XGjPUDgD-1*UiO&hbsWH`2rUW=_{jX8aSn6WV+@7NWc~gt^&*Ryc_- z19a5vuG<|Kbd#H^3|M7Ma$P|>agrZmQ=q5ows`^HnXfgGrn)^O(N}HPh_~*%+EDWj zY5^CHQpyl0GD(LXId$e69$0U_Woy?3a)+YYT$x;w!V14 z!7X20t&+@bx<`sNbp-E5JlbXfOpv9VmL?L!QB;Bx4uW)*0gZjhho_*Z4VHMw$+qFq zJOZ(v_h^~(?g0Qbevy>zY3tL>K2kS}#2sP46O@$`QWgMB*8^>lFUGW>Idih4I<9U;el7ly~j4X;mlx$kfM1s5%-C4$J8>zG127UoB8It z%Kzn%_2(((RK{t&cX)QI^VlJHe*Sq6Dvql5J%abZvtez?yXSFLI(ZEnkh(y-#(MM) zEy)7n28U0>oA*5;5>S4*iKiV6_fxj6Yk5m*`gV5^15N9`RMBbj-pDmoSP`OaAf6SW z9@Byk4t~J#bisL$W;T!3Jh(aE{m8PZqGQFXx2E@%N)`LmPtpA$$^eWJF1Lj$ z?T)QxQ70V)3(bryZn>(*FqU|1vAs|JGnX)T9q|GKfX}>Q7)QFV*#tt@UXNZe-FNy8Og4FtU@u z^>Dci?P;(1dsC`3`*IhSl2(gNkOPWbJznj^kTct1%(`X$Ez$CwvoA-tKjOgi<-iv) z7l?ts4}?Vl)5;R%YVez@-%?KlAbov;^7+Z!0d-AZb*P=yeA`$16pORe!)$q1fB~wW zHpJah#cnPrVMRr}ulPM^LiWZXaY~PnCG51<)?Z|06~`E?RE;`DNrB9>j!S??BiL(y z@1(U4Or!)VY(M)Ea$*Xh5LYgS6}9oOXXW1+nRy%4Nh0|zW>VTj7`ZMdSRtl+gA7xd z6XpVKH87Jl3aRl<&R+I6?0Z?m@kHY-85Y7($`h4KY;3v9$9YRzy|8&2h**F@LSGzT;zfM;&gnp_VQ6%AUzro1V&m(vzM zXf9d5^p}H>cuD=v3(EruAri3gnW+s}T*+;@+ywhm#j|Y<7BEnD(K*^~(=TG}5Q!g% zOT#8c%-`Bby@k<z=tgoanCyaE3QO0 zstAPD!1ZY?V*hRfdD^6#CE^7`5+7SQcmgk1gG1`9&_8%NTnpb;hffzRbAwQITJuhP z;_ifm9l?6!31DMMpdLfEH3$lwze3tRCegv9vN*uI>y-fAQ8Af>&hU~ti7s>at4sSA zSf{aD__30;;tm7pvNRwAypjr*?eBqgmqt7xl@XsLPkS@7iILQRTI=FPeXTxZDzC2O zm{w+7FK)%Pklm&l^5J$w5f`#3D06atW~LFT3NH>p7TGEcUt z(l``eqb;=!cad0L{?R2Q+y@_0vGw^YH$uQi3U{YtO#hZCD0rb6-)C4QSkV?v0W+>@ z_+srBXhn3xz~#n=N5k>N@}nUb{|&6@NJ3vJFJk30FQ3=Mn>dS9Pw$C5+vvCFV}pjb zipp&=G}p>I?ivlXsEGl8$EW)Yz{SCRPNqvH&b@*3;KVS8rxjI~T+}bJa*Vc}b01C+ zpu(hQvJrX+@(-BO(@NvTiV7}1PhnEWO7ju-qIEh>ThFrQzEZb>58XotGsAO-!{azn zpyT4>Y;3A2i(ispT?a~FZLwo+euoD(J$0^XgP3Sv20l>6z*@6uEQ%<)^wayu1C1z> zwwQdT19~dpQM|rS#b23lMWs<6Ii1NP!?X~>%~R)f%KuVCnhMj=4SP0p2E3138tgIe zURopdqGg=?_*lRGt>Ji`_L9pS@^X!218qr!_9WUvDB3b|EZ%@6EAHe1x zQDKy^y0aZM%h|a+KxnCkzcl~Tm=yF(S3wV<$?792rwMdbFdQ7q3;Ta{Vy4hGcwsM-8S zRujJ1i+8MoUSI$L1O@;B35uuy2MYlJ0U;p)1q{FdNB{^50hzg-rT_p10T~GZ00000 z000005jOyH0Bith0B`_b0Av7R0CWIh0ABzy05AYD05bqE05kwH05gxLWV1_1yd000000O-hNQ~&?~ literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/stock_slip_data_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..3d741b23b8d06131ede9740849253dd80d84c9a3 GIT binary patch literal 928 zcmV;R17G|%dc3bE8~_9u_yv?q3L&ZC zEPpun`r`{FYty&VXAAX8Wl4QlPT~VK>FX_(9eL%0^Ps4)<4wI!%pbk`U-(aQy=$&^ z7(B_}8$5lDpAZxK(b}Ht%{Wi~Tnf78a}~Pef1$)d5OLTz$7IsngT=hX!p9@Q$Bl2( ziflrX0zrW-rXCa20O|a_mp`}~gFT#d0MW1zSZBwPE+L2i!KPe*6YfxTZ7w3|31vFq`rE3ch`ju1GoC1T>29ehZ(Mv*1;!uvGJNqZlOP zap1I=$nO4Zxun%M%o=LYlHo%{<9>k`%WLds9o(8)?ee8wu&=enC}X3`NnJU7i*exf zZrvS*1I6?jMRZYLX-~~84647yEm-OFJUX;phqoigF&ne$%v=IPRPd!f7FYVpI+w~Z z(zmR1A0V1)3RFY4C6z zX4Au(7!uHV8zW6!VjeuSWjmxfk#H&3`N-q9FK$OZ42fZY9*WTKaRpv{0k2h@E009IB009Yt_5cS90RRCZAprplm;e9>3IXkjO9ub|1pyff z0000000000000p~0CNCz0B-2RCEI`hR=_8SqAU;jL6 z`^6qDv**&Mdim$7XYQDO2|F$iP<(wB1!j=2r+Iz7W27%PL`g>BhWTs{r zON(nxNU)wgzacPrddNvjEe7?9MXYt7%Tl$=o}{*=KfQ8BUf4Rt<4Z_v*`76BmBnY< z-gzaRVd7jU!My+FtAmdZ;su5c8))Tk3&yHM)C_d1E{1xp?si{=XVQ=YJyhu?2Q za@UKhkUy_}ur%!2Uv%*7ru17;nzyC*38w!!FMOYE#Y^{t`@WnxzPDxnv~>5H+WW_& zr}0HvIX|^{WO;dSh|yw^*+y#?PPpFnzLxRVo2a&J6z1Z^2g7>XDY8S)t78L}CYz;rG{F;Fy~!HB^Ch>d}y36M4i(h#TzluZQcVqg&A WVq|FOQI)7`xydNX#>k)mHW>hN!MgAO literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/vop_hco_merge_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..a698e6313afebab9adfe57be053e1b8ed0a6bfc0 GIT binary patch literal 398 zcmXr7+Ou9=hJnStwbkYc0|azI>0b@Mwm;zf&u}M}!CLxMTFE2HS%2)euIm`^&-1yS))~!mbX=>gF79|?`E?bj+XSw(Jb9(z@4VY|C zupUZC+IL~!`N>+6pRVl;>{uk)W!t-*>rJgY%frgtMa&frdzwS7GH)Ldd%fXhPjr&> z!^n#L+r@Upe!6$W@mOKIOXJpx;$0ulPT5fWadrO;=j{n=kDl?#Q2({D>`%wS2#u}k z>F2V}ZZYwk6R>s5jB8z29}BIjIh**cY0vo;!Atk*?GwMFc!`X(gaAG18E41XV7CPVMqk3V_=YEVqg&A WVq|DAIxJe(a+6V%jgdhCYy$ue&yYL- literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_customer_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..88998e266c3d4bd6bff2f4cb86e957988f50d879 GIT binary patch literal 1305 zcmV+!1?KuUdc3bE8~_Aw7im#%1ONa40001r000000001nHI0to7ykrjT>v|p3e0h| zE7|hh_V3-Wz~ik>d2)l$BqOQ2auwXBN$KZk&pb1F-Mhpti{42yhP&J*#uB5A6*le2 zeGf%!{Uyo><>`Yg_(Ib@XG7x5%2$HV)Ue)>rfe||TTFI#c?jI_Q#^}Cwny}`$G-H$ z@i^##6oTm>dh0e=BIpfWf$(*FqvYHXRUD8fcG6NGuU<`gRU{6Z<;ShTHd^H>@$-wp zVHKFCFc5PXB_VTPu08>z_Go8TNYPal}OT=)=0|FlXBOP2V_i6 zX@L`SgSd{|*Eh=~1{a?bAE&;SLws}OC^9=090;M4_H9=vL)U?jiX-~Y^>|Ew=)%dR z3u90k=D<`(L1V#JKP8%dKehLp7*vE}#sm8>2C}K(uf9 z;w^+X4Glz#=LoP^CMLQR8- z!Yw`InaenSWae>Ik=08-W(v?h9U@kNSoxbKmbKV0R{$R8p|kU8;@$sgCn(jog|4z{ zk9reeM=5{21_B4T`w9zXl9j)OiZe*vTmdnfiv=M(xRI$5&7c%;2qXy~*KXi|HtVG& zUQbqQ{umzZ9Ry*p^PA|FJo_hBA1SbBUKNlfSUa-Y2*ZS`=`26_=FbbmE@}r9p&qpt zx4TA%U9QZSzo(w$)*q;L7eyGe7Ewo|_e!30F{p38SH{esHl2!g+~ zW+qZQKDks8E_-GB9u-iy_j4;nvSW8&2FB|2V3kIoQtn)?p`K3XH{T6$isg{N;TmSS zB3pAl>8zBpD^zZfHprBd2oKHopS{RCuLrv1DLBmgloJiAP{62L17d|u@ZfaPK@u)A z4y;3ll*OI~ztuNK(dg$(dXhM76trHE?YtV8tq31Ywi()xdPbwP@+M=SN>fz)o<^sC zRAdEw8-BdJul7{L&;0p8W{8P7!4xVoluUr6|EZ(Pka*v*vxP)YIlfMbE2&u5Ba5bn zGN<7$TfWww=1VaHjWcTGGC%tKe^DP*n6G_A+yDUt1^@vGgl_-`3jqKDAt3<)4441_ z2nqqWr8oxw00jXV3IG5A000000000HMF4jIXaI8nUjSnObpUe!bO3JvZ2)BeasXcd zZ2)rsbO2ufG5|0DG5|9GFaR_FG5|LKFaR(BFaR(BE&y}@VE}Rf000yU0RRB#We|RZ P*#Q*>0RSKX00000NnT7o literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/UnzipError/whs_mst_202304270000.gz new file mode 100644 index 0000000000000000000000000000000000000000..a97fdb31ea2712b7afc6e043b35a28ea0bbced1d GIT binary patch literal 589 zcmXr7+Ou9=hJhvN(o>zyj0|8<1)&&rhh7(a!26$Zbu5GREUq&}0vD&fIQ9A0Yi`Na zfB!8m*ivNZb>6)_dtqhHmzzRCRxYNB{;P$;Ro2cv!m#^6(lgr)d0tP<#Fx)^*&pe1 zY%81QMn8w6>-I0Wy!+VWIpQbpGJBZa5ZkrDUgY2ZC4S24J_3@g5nr$Ng!<1p@Y^JG z<8B`N6Z~RHPWHtyoVUf9SKQQYyQ8>xXR3_F1(giO$LpjPX|||~&3N$oOV?>xalf3U zDFG|Ldi|5_-|h5_{hah4Kle2`ebSwW@3efK{bafKRA4*4zAYwUhkmL)i_NGz=#+ zS^TfNSDp1Kww8hY)e+|vzJ?l+)|%TY9$9syeM(tU-0oz&Eo-KK_SM+kxB0*AJGaC4 znEsUK65C7FZ>;#G$nyK)117E{7Z$GhuM5~ZgHO+2zu@z>Em~J!t`aksTj514$DgZ4RU%P!A}Z$WR2-B*`Gc1xzb_ S%zSk%HyK6Q7#S46CISG2=j=uR literal 0 HcmV?d00001 diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv new file mode 100644 index 00000000..3df124c1 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv @@ -0,0 +1,3 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"123456701" "01" "1" "12345.6" "yyyy0401" "20190930" "10" "0" "18-03-07 09:48:00" "19-09-19 11:23:47" +"123456701" "02" "1" "12587.8" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv new file mode 100644 index 00000000..20ebb14d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv @@ -0,0 +1,2 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"123456701" "01" "1" "12345.6" "202304 \ No newline at end of file From cdd35e884ee2c6020dfa9f4ca339b22fdf205288 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 7 Jun 2023 09:27:06 +0900 Subject: [PATCH 361/962] =?UTF-8?q?feat:=20print=E3=81=A7=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E5=87=BA=E5=8A=9B=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio_download.py | 6 ++---- ecs/jskult-webapp/src/depends/auth.py | 4 +++- ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py | 6 ++++-- .../src/repositories/pharmacy_product_master_repository.py | 7 ++++--- .../src/repositories/user_master_repository.py | 6 ++++-- .../src/repositories/wholesaler_master_repository.py | 7 ++++--- ecs/jskult-webapp/src/services/session_service.py | 5 ++++- 7 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 7e4d839a..8ff711c8 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -57,7 +57,7 @@ async def download_bio_data( if search_result_df.size < 1: # 検索結果が0件の場合、download_urlを返さない - print('Bio data not found') + logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} # ファイルに打ち出すカラムを抽出 @@ -73,7 +73,7 @@ async def download_bio_data( download_file_url = bio_service.generate_download_file_url( local_file_path, download_param.user_id, download_param.ext) except Exception as e: - print('S3 access error', e.args) + logger.exception(f'S3 アクセスエラー{e}') raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail={'error': 'aws_error', 'message': e.args} @@ -107,9 +107,7 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i try: # 生物由来データを検索 search_result_df, query = bio_service.search_download_bio_data(search_param) - # TODO: ファイルにも出力する except DBException as e: - logger.exception(f'DB Error: {e}') raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail={'error': 'db_error', 'message': e.args} diff --git a/ecs/jskult-webapp/src/depends/auth.py b/ecs/jskult-webapp/src/depends/auth.py index 893c95e4..820cdc9a 100644 --- a/ecs/jskult-webapp/src/depends/auth.py +++ b/ecs/jskult-webapp/src/depends/auth.py @@ -5,11 +5,13 @@ from fastapi import Depends from fastapi.security import APIKeyCookie, APIKeyQuery from src.error.exceptions import JWTTokenVerifyException +from src.logging.get_logger import get_logger from src.model.internal.jwt_token import JWTToken from src.model.internal.session import UserSession from src.services.session_service import get_session from src.system_var import environment +logger = get_logger('認証チェック') cookie_security = APIKeyCookie(name='session', auto_error=False) code_security = APIKeyQuery(name='code', auto_error=False) @@ -45,6 +47,6 @@ def verify_session(session: Union[UserSession, None] = Depends(check_session_exp try: jwt_token.verify_token() except JWTTokenVerifyException as e: - print(e) + logger.info(e) return None return session diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py index 6927533b..46f5bfcc 100644 --- a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.hdke_tbl import HdkeTblModel from src.repositories.base_repository import BaseRepository +logger = get_logger('日付テーブル取得') + class HdkeTblRepository(BaseRepository): FETCH_SQL = "SELECT bch_actf FROM src05.hdke_tbl" @@ -13,8 +16,7 @@ class HdkeTblRepository(BaseRepository): models = [HdkeTblModel(**r) for r in result] return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index 4f10e090..a430ee67 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.pharmacy_product_master import PharmacyProductMasterModel from src.repositories.base_repository import BaseRepository +logger = get_logger('製品取得') + class PharmacyProductMasterRepository(BaseRepository): @@ -31,9 +34,7 @@ class PharmacyProductMasterRepository(BaseRepository): models = [PharmacyProductMasterModel(**r) for r in result] return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] getOroshiData DB Error. ") - print(f"[ERROR] ErrorMessage: {e.args}") + logger.exception(f"DB Error : Exception={e}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/user_master_repository.py b/ecs/jskult-webapp/src/repositories/user_master_repository.py index 60228074..d109c57e 100644 --- a/ecs/jskult-webapp/src/repositories/user_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/user_master_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.user_master import UserMasterModel from src.repositories.base_repository import BaseRepository +logger = get_logger('ユーザー取得') + class UserMasterRepository(BaseRepository): FETCH_SQL = """\ @@ -22,8 +25,7 @@ class UserMasterRepository(BaseRepository): return None return models[0] except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py index 5e58e1b5..8841f643 100644 --- a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.wholesaler_master import WholesalerMasterModel from src.repositories.base_repository import BaseRepository +logger = get_logger('卸データ取得') + class WholesalerMasterRepository(BaseRepository): @@ -34,9 +37,7 @@ class WholesalerMasterRepository(BaseRepository): models = [WholesalerMasterModel(**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}") + logger.exception(f"DB Error : Exception={e}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/services/session_service.py b/ecs/jskult-webapp/src/services/session_service.py index e93d9dde..657e648d 100644 --- a/ecs/jskult-webapp/src/services/session_service.py +++ b/ecs/jskult-webapp/src/services/session_service.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.internal.session import UserSession +logger = get_logger('セッション管理') + def set_session(session: UserSession) -> str: session.save() @@ -12,5 +15,5 @@ def get_session(key: str) -> UserSession: session = UserSession.get(hash_key=key, consistent_read=True) return session except UserSession.DoesNotExist as e: - print(e) + logger.debug(f'セッション取得失敗:{e}') return None From 91f47d4fa450cbc6bc614b49bc1010161c16f7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 7 Jun 2023 09:42:31 +0900 Subject: [PATCH 362/962] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AF=E5=A4=A7=E4=BD=93=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 53 ++- .../src/model/request/ultmarc_doctor.py | 17 + .../view/ultmarc_doctor_info_view_model.py | 17 + ecs/jskult-webapp/src/templates/docInfo.html | 320 ++---------------- .../src/templates/docSearch.html | 21 +- 5 files changed, 125 insertions(+), 303 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 399ca6e4..3037971f 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -6,7 +6,7 @@ from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession -from src.model.request.ultmarc_doctor import UltmarcDoctorModel +from src.model.request.ultmarc_doctor import UltmarcDoctorModel, UltmarcDoctorInfoModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.ultmarc_view_service import UltmarcViewService @@ -115,6 +115,57 @@ def ultmarc_doctor_info_view( ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing + # DocId + ultmarc.DocId = id + # ページ総数(件数) + ultmarc.postCnt = 1 + # ページ数(表示するページNo) + ultmarc.pageNum = 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() + + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + docId = ultmarc_doctor_form.docId.split(',') + + # 医師情報の取得 + ultmarc = ultmarc_service.info_ultmarc_doctor_view(docId[ultmarc_doctor_form.pageNum], session) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # DocId + ultmarc.DocId = ultmarc_doctor_form.docId + # ページ総数(件数) + ultmarc.postCnt = len(docId) + # ページ数(表示するページNo) + ultmarc.pageNum = ultmarc_doctor_form.pageNum # セッション書き換え session.update( diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py index 5935c076..0633624e 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py @@ -49,3 +49,20 @@ class UltmarcDoctorModel(BaseModel): alma=ctrl_alma, grad_y=ctrl_grad_y ) + + +class UltmarcDoctorInfoModel(BaseModel): + docId: Optional[str] + pageNum: Optional[int] + + @classmethod + def as_form( + cls, + docId: str = Form(None), + pageNum: str = Form(None) + ): + + return cls( + docId=docId, + pageNum=int(pageNum) + ) 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 index 1cfbcf5f..993bea14 100644 --- 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 @@ -24,6 +24,9 @@ class UltmarcDoctorInfoViewModel(BaseModel): specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] doctor_wrkplace_his_data: Optional[list[UltmarcDoctorWrkplaceHisDBModel]] + DocId: Optional[str] + postCnt: Optional[int] + pageNum: Optional[int] def ultmarc_data_json_str(self): def date_handler(obj): @@ -66,6 +69,20 @@ class UltmarcDoctorInfoViewModel(BaseModel): def is_input_estab_y(self): return self.doctor_info_data.estab_y or '' + # 現在のページ(表示用) + def is_pageNum_view(self): + return self.pageNum + 1 + + # 前ボタン + def is_disabled_prev(self): + return 'disabled' if self.pageNum == 0 else '' + + # 次ボタン + def is_disabled_next(self): + if self.pageNum == self.postCnt - 1: + return 'disabled' + return '' + def is_input_birthday_fromat(self): return self._format_date_string(self.doctor_info_data.birthday) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index e9214447..1202faee 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -14,169 +14,22 @@ formBtDisabled(); } + - - - - - - -
@@ -193,30 +46,17 @@ if (!isset($isDBSuccess)) {
- - - - - - - - + + + @@ -226,9 +66,7 @@ if (!isset($isDBSuccess)) {
- - + - + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} - - +
- + @@ -259,37 +97,16 @@ if (!isset($isDBSuccess)) { - @@ -309,18 +126,6 @@ if (!isset($isDBSuccess)) { - {% for sosiety_data in ultmarc.sosiety_data %} @@ -348,16 +153,6 @@ if (!isset($isDBSuccess)) { {% endfor %} -
診療科目: - {% for trt_coursed_data in ultmarc.trt_coursed_data %} - + {% endfor %} - - - {% for i in range(5-ultmarc.is_input_trt_course_data_size())%} {% endfor %} -
{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}}{{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_license_name)}}
@@ -371,42 +166,16 @@ if (!isset($isDBSuccess)) { - - - - - - - - - - - - {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} @@ -421,16 +190,6 @@ if (!isset($isDBSuccess)) { {% endif %} {% endfor %} - {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd) != ''%} @@ -444,43 +203,10 @@ if (!isset($isDBSuccess)) { {% endif %} {% endfor %} - - - - - - - - - -
ULT施設コード 勤務先略名 所属部科名 役職名 職位 開始年月日 終了年月日
- - + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 2168aa3e..c3168212 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -31,7 +31,7 @@ -
+ @@ -113,10 +113,11 @@ - + - + + @@ -142,7 +143,7 @@ - + \ No newline at end of file From 0bdcc1fc4afe44302f6d94f37d2ae4db8cf649b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 7 Jun 2023 15:49:20 +0900 Subject: [PATCH 363/962] =?UTF-8?q?feat:=20=E9=96=8B=E7=99=BA=E4=B8=AD?= =?UTF-8?q?=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/sales_laundering.py | 2 + .../laundering/sales_results_laundering.py | 139 +++++ .../src05/hco_to_mdb_laundering.sql | 98 +++ .../src05/inst_merge_laundering.sql | 52 ++ .../src05/sales_lau_delete.sql | 37 ++ .../src05/sales_lau_upsert.sql | 568 ++++++++++++++++++ .../src05/v_inst_merge_laundering.sql | 71 +++ .../src05/whs_org_laundering.sql | 118 ++++ 8 files changed, 1085 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py create mode 100644 rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql create mode 100644 rds_mysql/stored_procedure/src05/inst_merge_laundering.sql create mode 100644 rds_mysql/stored_procedure/src05/sales_lau_delete.sql create mode 100644 rds_mysql/stored_procedure/src05/sales_lau_upsert.sql create mode 100644 rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql create mode 100644 rds_mysql/stored_procedure/src05/whs_org_laundering.sql 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..3862177e 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -20,6 +20,8 @@ def exec(): emp_chg_inst_laundering.exec() # 納入先処方元マスタ洗替 ult_ident_presc_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..979f1042 --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -0,0 +1,139 @@ +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.batch.batch_functions import logging_sql + +logger = get_logger('卸実績洗替') + + +def exec(): + db = Database.get_instance() + try: + db.connect() + logger.debug('処理開始') + # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除 + _call_sales_lau_delete(db, 'sales_lau', 5) + # 卸販売実績テーブル(洗替後)作成 + _call_sales_lau_upsert(db, 'sales_lau', '', '') + # 1:卸組織洗替 + _call_whs_org_laundering(db, 'sales_lau') + # 3:HCO施設コードの洗替 + _update_sales_lau_from_vop_hco_merge_v(db, 'sales_lau') + # 4:メルク施設コードの洗替 + _update_mst_inst_laundering(db, 'sales_lau') + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _call_sales_lau_delete(db: Database, target_table: str, set_year: int): + # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除 + logger.info('sales_lau_delete(プロシージャ―) 開始') + db.execute(f'CALL src05.sales_lau_delete("{target_table}", {set_year})') + logger.info('sales_lau_delete(プロシージャ―) 終了') + return + + +def _call_sales_lau_upsert(db: Database, target_table: str, extract_from_date: str, + extract_to_date: str): + # 卸販売実績テーブル(洗替後)作成 + logger.info('sales_lau_delete(プロシージャ―) 開始') + db.execute(f'CALL src05.sales_lau_delete("{target_table}", "{extract_from_date}", "{extract_to_date}")') + logger.info('sales_lau_delete(プロシージャ―) 終了') + return + + +def _call_whs_org_laundering(db: Database, target_table: str): + # 卸組織洗替 + logger.info('whs_org_laundering(プロシージャ―) 開始') + db.execute(f'CALL src05.whs_org_laundering("{target_table}")') + logger.info('whs_org_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_vop_hco_merge_v(db: Database, target_table: str): + # HCO施設コードの洗替 + if _count_vop_hco_merge_v(db) >= 1: + _call_v_inst_merge_laundering(db, target_table) + return + logger.info('V施設統合マスタにデータは存在しません') + return + + +def _count_vop_hco_merge_v(db: Database) -> int: + # V施設統合マスタのデータ件数の取得 + try: + sql = """ + SELECT + COUNT(v_inst_cd) AS cnt + FROM + src05.vop_hco_merge_v + """ + 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, target_table: str): + # HCO施設コードの洗替(テーブル更新) + logger.info('v_inst_merge_laundering(プロシージャ―) 開始') + db.execute(f'CALL src05.v_inst_merge_laundering("{target_table}")') + logger.info('v_inst_merge_laundering(プロシージャ―) 終了') + return + + +def _update_mst_inst_laundering(db: Database, target_table: str): + # メルク施設コードの洗替 + _call_hco_to_mdb_laundering(db, target_table) + _update_sales_lau_from_dcf_inst_merge(db, target_table) + + +def _call_hco_to_mdb_laundering(db: Database, target_table: str): + # A:医療機関のデータはMDB変換表からHCO⇒DCFへ変換 + logger.info('hco_to_mdb_laundering(プロシージャ―) 開始') + db.execute(f'CALL src05.hco_to_mdb_laundering("{target_table}")') + logger.info('hco_to_mdb_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_dcf_inst_merge(db: Database, target_table: str): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする + if _count_dcf_inst_merge(db) >= 1: + _call_inst_merge_laundering(db, target_table) + return + logger.info('DCF施設統合マスタにデータは存在しません') + return + + +def _count_dcf_inst_merge(db: Database) -> int: + # DCF施設統合マスタのデータ件数の取得 + try: + sql = """ + SELECT + COUNT(dcf_inst_cd) AS cnt + FROM + src05.dcf_inst_merge + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('DCF施設統合マスタのデータ件数の取得 成功') + except Exception as e: + logger.debug('DCF施設統合マスタのデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_inst_merge_laundering(db: Database, target_table: str): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(テーブル更新) + logger.info('inst_merge_laundering(プロシージャ―) 開始') + db.execute(f'CALL src05.inst_merge_laundering("{target_table}")') + logger.info('inst_merge_laundering(プロシージャ―) 終了') + return 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..03402001 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql @@ -0,0 +1,98 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.hco_to_mdb_laundering(@target_table VARCHAR(64)) +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(); + + -- 例外処理 + 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); + 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_vod_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③ 開始'); + + UPDATE src05.@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' + ; + + 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..92ff79a9 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql @@ -0,0 +1,52 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.inst_merge_laundering(@target_table VARCHAR(64)) +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(); + + -- 例外処理 + 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); + 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① 開始'); + + 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, + src05.@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.prefc_cd = imt.prefc_cd + WHERE + tt.inst_cd = imt.dcf_dsf_inst_cd + ; + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】4:メルク施設コードの洗替_B① 終了'); + 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..652db718 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql @@ -0,0 +1,37 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.sales_lau_delete(@target_table VARCHAR(64), @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(); + + -- 例外処理 + 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); + 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年以前のデータ削除① 開始'); + + DELETE FROM + src05.@target_table + WHERE + kjyo_ym < DATE_FORMAT((src05.get_syor_date() - INTERVAL @laundering_period_year YEAR), '%Y%m') + ; + + 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..270495e7 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -0,0 +1,568 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.sales_lau_upsert(@target_table VARCHAR(64), @extract_from_date DATETIME, + @extract_to_date DATETIME) +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(); + + -- 例外処理 + 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); + 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.internal05.fcl_mst_v_t + SELECT + v_inst_cd, + sub_num, + start_date, + end_date, + closed_dt, + fcl_name, + fcl_kn_name, + fcl_abb_name, + mkr_cd, + jsk_proc_kbn, + fmt_addr, + fmt_kn_addr, + postal_cd, + prft_cd, + prft_name, + city_name, + addr_line_1, + tel_num, + admin_kbn, + fcl_type, + rec_sts_kbn, + ins_dt, + upd_dt, + dwh_upd_dt + 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, + '卸販売実績テーブル(洗替後)作成⑤ 開始' + ); + + INSERT INTO + src05.@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 * -1) + 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 * -1) + 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 * -1) + 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 * -1) + 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 prft_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 + CAST(SYSDATE() AS DATE) AS today + ) AS sub + INNER JOIN src05.sales AS s + ON sub.today = CAST(s.dwh_upd_dt AS DATE) + 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 src05.fcl_mst_v_t AS fmvt + ON s.v_inst_cd = fmvt.v_inst_cd + LEFT OUTER JOIN src05.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 = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nonyu_qty * -1) + ELSE + s.nonyu_qty + END + ), + nonyu_price = s.nonyu_price, + nonyu_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nonyu_amt * -1) + ELSE + s.nonyu_amt + END + ), + shikiri_price = s.shikiri_price, + shikiri_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.shikiri_amt * -1) + ELSE + s.shikiri_amt + END + ), + nhi_price = s.nhi_price, + nhi_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nhi_amt * -1) + ELSE + s.nhi_amt + END + ), + v_inst_cd = s.v_inst_cd, + inst_clas_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 + ), + 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 = ( + CASE + WHEN + s.v_inst_cd LIKE '00%' + THEN + ci.prefc_cd + ELSE + fmvt.prft_cd + END + ), + 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() + ; + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑤ 終了' + ); + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑥ 開始' + ); + + UPDATE ( + SELECT + fmvt.v_inst_cd AS v_inst_cd, + fmvt.fcl_type AS fcl_type, + fmvt.prft_cd AS prft_cd, + ci.prefc_cd AS prefc_cd + FROM + (SELECT CAST(SYSDATE() AS DATE) AS today) AS sub + INNER JOIN src05.fcl_mst_v_t AS fmvt + ON sub.today = CAST(fmvt.dwh_upd_dt AS DATE) + LEFT OUTER JOIN src05.com_inst AS ci + ON fmvt.v_inst_cd = ci.dcf_dsf_inst_cd + ) AS t3t5, + src05.sales_lau AS sl + SET + sl.inst_clas_cd = ( + CASE + WHEN + (t3t5.fcl_type = 'A1' OR t3t5.fcl_type = 'A0') + THEN + '3' + WHEN + t3t5.fcl_type BETWEEN '20' AND '29' + THEN + '2' + ELSE + '1' + END + ), + sl.pref_cd = ( + CASE + WHEN + sl.v_inst_cd LIKE '00%' + THEN + t3t5.prefc_cd + ELSE + t3t5.prft_cd + END + ) + WHERE sl.v_inst_cd = t3t5.v_inst_cd + ; + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑥ 終了' + ); + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '卸販売実績テーブル(洗替後)作成⑦ 開始' + ); + + UPDATE + ( SELECT CAST(SYSDATE() AS DATE) AS today ) AS sub, + src05.sales_lau AS sl, + src05.sales AS s + SET + sl.inst_cd = ( + CASE + WHEN + (s.err_flg20 != 'M' AND sl.inst_clas_cd IN ('2', '3')) OR (s.err_flg20 = 'M') + THEN + s.v_inst_cd + ELSE + NULL + END + ) + WHERE + sub.today = CAST(s.dwh_upd_dt AS DATE) + AND sl.slip_mgt_num = s.slip_mgt_num + AND sl.row_num = s.row_num + ; + + 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..4ef2075e --- /dev/null +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -0,0 +1,71 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.v_inst_merge_laundering(@target_table VARCHAR(64)) +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(); + + -- 例外処理 + 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); + 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施設コードの洗替① 開始' + ); + + UPDATE ( + SELECT + v_inst_cd, + v_inst_cd_merge, + fcl_name, + fcl_kn_name, + fmt_addr, + prft_cd + FROM + internal05.v_inst_merge_t + WHERE + (fcl_type IN ('A1', 'A0')) OR fcl_type BETWEEN '20' AND '29' + ) AS vimt, + src05.@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.prefc_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')) + ; + + 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/whs_org_laundering.sql b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql new file mode 100644 index 00000000..e3ce53c7 --- /dev/null +++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql @@ -0,0 +1,118 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +CREATE PROCEDURE src05.whs_org_laundering(@target_table VARCHAR(64)) +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(); + + -- 例外処理 + 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); + 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, + nm_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 + count(1) AS c, + 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.卸組織洗替③ 開始' + ); + + UPDATE + src05.sales_lau AS sl, src05.@target_table AS tt + SET + sl.whs_org_cd = tt.whs_org_cd, + sl.v_whsorg_cd = tt.v_org_cd, + sl.whs_org_name = tt.nm_2 + WHERE + st.whs_cd = tt.whs_cd + AND st.whs_sub_cd = tt.whs_sub_cd + AND st.customer_cd = tt.customer_cd + ; + + call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + '【洗替】1.卸組織洗替③ 終了' + ); + +END \ No newline at end of file From 227f79932c8a66a82ea5286d33a7291733e174da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 8 Jun 2023 10:21:24 +0900 Subject: [PATCH 364/962] =?UTF-8?q?=E6=96=BD=E8=A8=AD=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=EF=BC=88=E5=AE=9F=E8=A3=85=E5=AE=8C=E4=BA=86?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 78 ++++++- .../src/model/db/inst_div_master.py | 8 + .../src/model/db/ultmarc_inst.py | 18 ++ .../src/model/request/ultmarc_inst.py | 61 +++++ .../src/model/view/ultmarc_inst_view_model.py | 103 +++++++++ .../repositories/inst_master_repository.py | 29 +++ .../repositories/ultmarc_inst_repository.py | 108 +++++++++ .../src/services/ultmarc_view_service.py | 32 ++- ecs/jskult-webapp/src/static/css/ultStyle.css | 2 +- .../src/templates/instSearch.html | 212 ++++++++++++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 11 files changed, 649 insertions(+), 4 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/inst_div_master.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst.py create mode 100644 ecs/jskult-webapp/src/model/request/ultmarc_inst.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/inst_master_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py create mode 100644 ecs/jskult-webapp/src/templates/instSearch.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 3037971f..f4747bc8 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -7,6 +7,7 @@ from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel, UltmarcDoctorInfoModel +from src.model.request.ultmarc_inst import UltmarcInstModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.ultmarc_view_service import UltmarcViewService @@ -22,6 +23,81 @@ router.route_class = AuthenticatedRoute ######################### +@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() + + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 検索項目の取得(都道府県・施設区分) + ultmarc = ultmarc_service.ultmarc_inst_view(session) + 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[UltmarcInstModel] = Depends(UltmarcInstModel.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() + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 施設データを検索 + ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form) + + # 検索項目の取得(都道府県・施設区分) + ultmarc = ultmarc_service.ultmarc_inst_view(session) + ultmarc.is_batch_processing = batch_status_service.is_batch_processing() + ultmarc.inst_data = ultmarc_inst_data + ultmarc.form_data = ultmarc_inst_form + + # セッション書き換え + 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('/docSearch') def ultmarc_doctor_view( request: Request, @@ -35,7 +111,7 @@ def ultmarc_doctor_view( # if batch_status_service.is_batch_processing(): # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) - # # 検索項目の取得 + # 検索項目の取得(都道府県) ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) ultmarc.is_batch_processing = is_batch_processing 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/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/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py new file mode 100644 index 00000000..f7919612 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -0,0 +1,61 @@ +from typing import Optional + +from fastapi import Form +from pydantic import BaseModel + +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcInstModel(BaseModel): + 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] + + @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), + ctrl_delFlg: str = Form(None), + ctrl_inst_addr: 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=ctrl_delFlg, + inst_addr=ctrl_inst_addr + ) + + +class UltmarcInstInfoModel(BaseModel): + docId: Optional[str] + pageNum: Optional[int] + + @classmethod + def as_form( + cls, + docId: str = Form(None), + pageNum: str = Form(None) + ): + + return cls( + docId=docId, + pageNum=int(pageNum) + ) 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..a0b5107c --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -0,0 +1,103 @@ +import json +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.prefc_master import PrefcMasterModel +from src.model.db.inst_div_master import InstDivMasterModel +from src.model.request.ultmarc_inst import UltmarcInstModel +from src.model.view.bio_disp_model import BisDisplayModel +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[BisDisplayModel]] = [] + form_data: Optional[UltmarcInstModel] + + 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) + + # ULT施設コード + def is_input_dcf_dsf_inst_cdd(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) + + # 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 '' + return self._checked_value(self.form_data.delFlg) + + # 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 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.BIO_SEARCH_RESULT_MAX_COUNT + + def _format_date_string(self, date_string): + if date_string is None: + return '' + date = datetime.strptime(date_string, '%Y%m%d') + return date.strftime('%Y/%m/%d') + + 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/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/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py new file mode 100644 index 00000000..438c429d --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -0,0 +1,108 @@ +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.request.ultmarc_inst import UltmarcInstModel +from src.repositories.base_repository import BaseRepository +from src.util.string_util import is_not_empty + + +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: UltmarcInstModel) -> list[UltmarcInstDBModel]: + try: + self._database.connect() + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcInstModel(**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: UltmarcInstModel): + 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): + # 部分一致検索 + parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' + 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): + # 論理和での検索 + where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True)) + + # 検索条件が入力されていない場合 + if not where_clauses: + 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 diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 1b207c5e..65cc57a0 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -8,10 +8,14 @@ from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel +from src.model.request.ultmarc_inst import UltmarcInstModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel +from src.model.view.ultmarc_inst_view_model import UltmarcInstViewModel from src.model.view.ultmarc_doctor_info_view_model import UltmarcDoctorInfoViewModel from src.repositories.base_repository import BaseRepository from src.repositories.prefc_master_repository import PrefcMasterRepository +from src.repositories.inst_master_repository import InstDivMasterRepository +from src.repositories.ultmarc_inst_repository import UltmarcInstRepository from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository from src.repositories.ultmarc_trt_course_repository import UltmarcTrtCourseRepository from src.repositories.ultmarc_sosiety_repository import UltmarcSosietyRepository @@ -26,6 +30,8 @@ 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_sosiety_repository': UltmarcSosietyRepository, 'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository, @@ -35,6 +41,8 @@ class UltmarcViewService(BaseService): ultmarc_doctor_repository: UltmarcDoctorRepository prefc_repository: PrefcMasterRepository + inst_div_repository: InstDivMasterRepository + ultmarc_inst_repository: UltmarcInstRepository ultmarc_trt_course_repository: UltmarcTrtCourseRepository ultmarc_sosiety_repository: UltmarcSosietyRepository ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository @@ -45,6 +53,8 @@ class UltmarcViewService(BaseService): 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_sosiety_repository = repositories['ultmarc_sosiety_repository'] self.ultmarc_doctor_wrkplace_repository = repositories['ultmarc_doctor_wrkplace_repository'] @@ -55,7 +65,7 @@ class UltmarcViewService(BaseService): self, session: UserSession ) -> UltmarcDoctorViewModel: - # # 都道府県リストを取得 + # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() ultmarc = UltmarcDoctorViewModel( @@ -63,6 +73,26 @@ class UltmarcViewService(BaseService): ) return ultmarc + def ultmarc_inst_view( + self, + session: UserSession + ) -> 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: UltmarcInstModel): + # 施設データを検索 + ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) + return ultmarc_inst_data + def search_doctor_data(self, search_params: UltmarcDoctorModel): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 3f1850d0..8d018b01 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -134,7 +134,7 @@ table{ } .instSearchButchMsg{ - font-size: 80%; + /* font-size: 80%; */ color: red; } diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html new file mode 100644 index 00000000..92db85ae --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -0,0 +1,212 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + +
+ + + + + +

施設検索一覧

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ULT施設コード: + + 施設区分: + + +
ULT施設名(漢字): + + ULT施設名(かな・カナ): + +
郵便番号: + 電話番号: +
都道府県: + + + + 削除施設表示 +
ULT施設住所: + + + + +
+
+ + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + +
ULT施設コード削除ULT施設名(漢字)ULT施設住所(漢字)郵便番号施設電話番号施設区分名病院種別都道府県
+
+ + +
+ + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index 58f05375..db36bf61 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -14,7 +14,7 @@ Ultmarc照会(医師)

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

+ Ultmarc照会(施設)

{% endif %} {% if menu.is_available_bio_menu() %} {% if not menu.is_batch_processing() %} From 5f4efd451def5911198a8826a117cec361e6ee87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 12 Jun 2023 10:30:52 +0900 Subject: [PATCH 365/962] =?UTF-8?q?feat:=2048-1.=E5=8D=B8=E5=AE=9F?= =?UTF-8?q?=E7=B8=BE=E6=B4=97=E6=9B=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 6 + .../src/batch/laundering/sales_laundering.py | 6 +- .../laundering/sales_results_laundering.py | 85 +- .../src/system_var/environment.py | 7 + .../src05/hco_to_mdb_laundering.sql | 40 +- .../src05/inst_merge_laundering.sql | 57 +- .../src05/sales_lau_delete.sql | 20 +- .../src05/sales_lau_upsert.sql | 864 +++++++++--------- .../src05/v_inst_merge_laundering.sql | 86 +- .../src05/whs_org_laundering.sql | 59 +- 10 files changed, 629 insertions(+), 601 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 95aef7fe..7463e0d2 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -11,3 +11,9 @@ ULTMARC_BACKUP_FOLDER=ultmarc JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau +# 卸実績洗替で作成するデータの期間(年単位) +SALES_LAUNDERING_TARGET_YEAR_OFFSET=5 \ No newline at end of file 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 3862177e..8264f4bd 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,7 @@ 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.logging.get_logger import get_logger batch_context = BatchContext.get_instance() @@ -21,7 +23,7 @@ def 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 index 979f1042..4fe4126a 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -2,6 +2,7 @@ from src.db.database import Database from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.batch.batch_functions import logging_sql +from src.system_var import environment logger = get_logger('卸実績洗替') @@ -12,15 +13,15 @@ def exec(): db.connect() logger.debug('処理開始') # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除 - _call_sales_lau_delete(db, 'sales_lau', 5) + _call_sales_lau_delete(db) # 卸販売実績テーブル(洗替後)作成 - _call_sales_lau_upsert(db, 'sales_lau', '', '') + _call_sales_lau_upsert(db) # 1:卸組織洗替 - _call_whs_org_laundering(db, 'sales_lau') + _call_whs_org_laundering(db) # 3:HCO施設コードの洗替 - _update_sales_lau_from_vop_hco_merge_v(db, 'sales_lau') + _update_sales_lau_from_vop_hco_merge_v(db) # 4:メルク施設コードの洗替 - _update_mst_inst_laundering(db, 'sales_lau') + _update_mst_inst_laundering(db) logger.debug('処理終了') except Exception as e: raise BatchOperationException(e) @@ -28,35 +29,49 @@ def exec(): db.disconnect() -def _call_sales_lau_delete(db: Database, target_table: str, set_year: int): +def _call_sales_lau_delete(db: Database): # 卸販売実績テーブル(洗替後)過去5年以前のデータ削除 logger.info('sales_lau_delete(プロシージャ―) 開始') - db.execute(f'CALL src05.sales_lau_delete("{target_table}", {set_year})') + 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, target_table: str, extract_from_date: str, - extract_to_date: str): +def _call_sales_lau_upsert(db: Database): # 卸販売実績テーブル(洗替後)作成 - logger.info('sales_lau_delete(プロシージャ―) 開始') - db.execute(f'CALL src05.sales_lau_delete("{target_table}", "{extract_from_date}", "{extract_to_date}")') - logger.info('sales_lau_delete(プロシージャ―) 終了') + logger.info('sales_lau_upsert(プロシージャ―) 開始') + db.execute(f""" + CALL src05.sales_lau_upsert( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}', + (src05.get_syor_date() - {environment.SALES_LAUNDERING_EXTRACT_DATE_PERIOD}), + src05.get_syor_date() + ) + """) + logger.info('sales_lau_upsert(プロシージャ―) 終了') return -def _call_whs_org_laundering(db: Database, target_table: str): +def _call_whs_org_laundering(db: Database): # 卸組織洗替 logger.info('whs_org_laundering(プロシージャ―) 開始') - db.execute(f'CALL src05.whs_org_laundering("{target_table}")') + 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, target_table: str): +def _update_sales_lau_from_vop_hco_merge_v(db: Database): # HCO施設コードの洗替 if _count_vop_hco_merge_v(db) >= 1: - _call_v_inst_merge_laundering(db, target_table) + _call_v_inst_merge_laundering(db) return logger.info('V施設統合マスタにデータは存在しません') return @@ -81,32 +96,40 @@ def _count_vop_hco_merge_v(db: Database) -> int: return result[0]['cnt'] -def _call_v_inst_merge_laundering(db: Database, target_table: str): - # HCO施設コードの洗替(テーブル更新) +def _call_v_inst_merge_laundering(db: Database): + # HCO施設コードの洗替(プロシージャ―の呼び出し) logger.info('v_inst_merge_laundering(プロシージャ―) 開始') - db.execute(f'CALL src05.v_inst_merge_laundering("{target_table}")') + 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, target_table: str): +def _update_mst_inst_laundering(db: Database): # メルク施設コードの洗替 - _call_hco_to_mdb_laundering(db, target_table) - _update_sales_lau_from_dcf_inst_merge(db, target_table) + _call_hco_to_mdb_laundering(db) + _update_sales_lau_from_dcf_inst_merge(db) -def _call_hco_to_mdb_laundering(db: Database, target_table: str): +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("{target_table}")') + 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, target_table: str): +def _update_sales_lau_from_dcf_inst_merge(db: Database): # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする if _count_dcf_inst_merge(db) >= 1: - _call_inst_merge_laundering(db, target_table) + _call_inst_merge_laundering(db) return logger.info('DCF施設統合マスタにデータは存在しません') return @@ -131,9 +154,13 @@ def _count_dcf_inst_merge(db: Database) -> int: return result[0]['cnt'] -def _call_inst_merge_laundering(db: Database, target_table: str): - # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(テーブル更新) +def _call_inst_merge_laundering(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(プロシージャ―の呼び出し) logger.info('inst_merge_laundering(プロシージャ―) 開始') - db.execute(f'CALL src05.inst_merge_laundering("{target_table}")') + 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/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index b1730224..a51ab519 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -22,3 +22,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/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql index 03402001..b3cbfc6e 100644 --- a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql +++ b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql @@ -1,5 +1,5 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.hco_to_mdb_laundering(@target_table VARCHAR(64)) +CREATE PROCEDURE src05.hco_to_mdb_laundering(target_table VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -7,10 +7,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'hco_to_mdb_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -23,7 +23,7 @@ BEGIN SET @error_state = NULL, @error_msg = NULL; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】4:メルク施設コードの洗替_A① 開始'); + '【洗替】4:メルク施設コードの洗替_A① 開始'); TRUNCATE TABLE internal05.hco_cnv_mdb_t; @@ -31,11 +31,11 @@ BEGIN '【洗替】4:メルク施設コードの洗替_A① 終了'); call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】4:メルク施設コードの洗替_A② 開始'); + '【洗替】4:メルク施設コードの洗替_A② 開始'); INSERT INTO internal05.hco_cnv_mdb_t ( - hco_vod_v, + hco_vid_v, mdb_cd, form_inst_name_kana, form_inst_name_kanji, @@ -78,19 +78,23 @@ BEGIN '【洗替】4:メルク施設コードの洗替_A② 終了'); call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】4:メルク施設コードの洗替_A③ 開始'); + '【洗替】4:メルク施設コードの洗替_A③ 開始'); - UPDATE src05.@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 = " + 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③ 終了'); diff --git a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql index 92ff79a9..6a0642a9 100644 --- a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql @@ -1,5 +1,5 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.inst_merge_laundering(@target_table VARCHAR(64)) +CREATE PROCEDURE src05.inst_merge_laundering(target_table VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -7,10 +7,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'inst_merge_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -25,28 +25,35 @@ BEGIN call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】4:メルク施設コードの洗替_B① 開始'); - 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, - src05.@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.prefc_cd = imt.prefc_cd - WHERE - tt.inst_cd = imt.dcf_dsf_inst_cd - ; + 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① 終了'); + '【洗替】4:メルク施設コードの洗替_B① 終了'); +END \ No newline at end of file diff --git a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql index 652db718..c1610435 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql @@ -1,5 +1,5 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.sales_lau_delete(@target_table VARCHAR(64), @laundering_period_year INT) +CREATE PROCEDURE src05.sales_lau_delete(target_table VARCHAR(255), laundering_period_year INT) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -7,10 +7,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_delete'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -25,11 +25,15 @@ BEGIN call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)過去5年以前のデータ削除① 開始'); - DELETE FROM - src05.@target_table - WHERE - kjyo_ym < DATE_FORMAT((src05.get_syor_date() - INTERVAL @laundering_period_year YEAR), '%Y%m') - ; + 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; + EXECUTE delete_data_stmt USING @laundering_period_year; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)過去5年以前のデータ削除① 終了'); diff --git a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql index 270495e7..ecb2b671 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -1,6 +1,6 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.sales_lau_upsert(@target_table VARCHAR(64), @extract_from_date DATETIME, - @extract_to_date DATETIME) +CREATE PROCEDURE src05.sales_lau_upsert(target_table VARCHAR(255), extract_from_date date, + extract_to_date date) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -8,10 +8,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_upsert'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -24,7 +24,7 @@ BEGIN 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; @@ -36,7 +36,7 @@ BEGIN call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成② 開始' ); - + INSERT INTO internal05.bu_prd_name_contrast_t ( prd_cd, @@ -46,15 +46,15 @@ BEGIN pp_end_date, update_date, bp_start_date, - bp_end_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.update_date AS update_date, bpnc.start_date AS bp_start_date, bpnc.end_date AS bp_end_date FROM @@ -63,7 +63,7 @@ BEGIN 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, '卸販売実績テーブル(洗替後)作成② 終了' @@ -71,46 +71,47 @@ BEGIN 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.internal05.fcl_mst_v_t + internal05.fcl_mst_v_t SELECT - v_inst_cd, - sub_num, - start_date, - end_date, - closed_dt, - fcl_name, - fcl_kn_name, - fcl_abb_name, - mkr_cd, - jsk_proc_kbn, - fmt_addr, - fmt_kn_addr, - postal_cd, - prft_cd, - prft_name, - city_name, - addr_line_1, - tel_num, - admin_kbn, - fcl_type, - rec_sts_kbn, - ins_dt, - upd_dt, - dwh_upd_dt + 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 ( @@ -129,334 +130,176 @@ BEGIN ; 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 - src05.@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 * -1) - 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 * -1) - 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 * -1) - 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 * -1) - 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 prft_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 ( + SET @insert_sales_laundering = " + 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 - CAST(SYSDATE() AS DATE) AS today - ) AS sub - INNER JOIN src05.sales AS s - ON sub.today = CAST(s.dwh_upd_dt AS DATE) - 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 src05.fcl_mst_v_t AS fmvt - ON s.v_inst_cd = fmvt.v_inst_cd - LEFT OUTER JOIN src05.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 = ( - CASE - WHEN - (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) - THEN - (s.nonyu_qty * -1) - ELSE - s.nonyu_qty - END - ), - nonyu_price = s.nonyu_price, - nonyu_amt = ( - CASE - WHEN - (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) - THEN - (s.nonyu_amt * -1) - ELSE - s.nonyu_amt - END - ), - shikiri_price = s.shikiri_price, - shikiri_amt = ( - CASE - WHEN - (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) - THEN - (s.shikiri_amt * -1) - ELSE - s.shikiri_amt - END - ), - nhi_price = s.nhi_price, - nhi_amt = ( - CASE - WHEN - (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) - THEN - (s.nhi_amt * -1) - ELSE - s.nhi_amt - END - ), - v_inst_cd = s.v_inst_cd, - inst_clas_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 - ), - 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 = ( + 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 * -1) + 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 * -1) + 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 * -1) + 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 * -1) + 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%' @@ -464,105 +307,224 @@ BEGIN ci.prefc_cd ELSE fmvt.prft_cd - END - ), - 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() - ; - - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '卸販売実績テーブル(洗替後)作成⑤ 終了' - ); - - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '卸販売実績テーブル(洗替後)作成⑥ 開始' - ); - - UPDATE ( + END AS prft_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 - fmvt.v_inst_cd AS v_inst_cd, - fmvt.fcl_type AS fcl_type, - fmvt.prft_cd AS prft_cd, - ci.prefc_cd AS prefc_cd - FROM - (SELECT CAST(SYSDATE() AS DATE) AS today) AS sub - INNER JOIN src05.fcl_mst_v_t AS fmvt - ON sub.today = CAST(fmvt.dwh_upd_dt AS DATE) - LEFT OUTER JOIN src05.com_inst AS ci - ON fmvt.v_inst_cd = ci.dcf_dsf_inst_cd - ) AS t3t5, - src05.sales_lau AS sl - SET - sl.inst_clas_cd = ( - CASE - WHEN - (t3t5.fcl_type = 'A1' OR t3t5.fcl_type = 'A0') - THEN - '3' - WHEN - t3t5.fcl_type BETWEEN '20' AND '29' - THEN - '2' - ELSE - '1' - END - ), - sl.pref_cd = ( - CASE - WHEN - sl.v_inst_cd LIKE '00%' - THEN - t3t5.prefc_cd - ELSE - t3t5.prft_cd - END - ) - WHERE sl.v_inst_cd = t3t5.v_inst_cd - ; + CAST(SYSDATE() AS DATE) AS today + ) AS sub + INNER JOIN src05.sales AS s + ON sub.today = CAST(s.dwh_upd_dt AS DATE) + 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.dwh_upd_dt AND s.dwh_upd_dt <= ?) + AND ( + (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 = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nonyu_qty * -1) + ELSE + s.nonyu_qty + END + ), + nonyu_price = s.nonyu_price, + nonyu_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nonyu_amt * -1) + ELSE + s.nonyu_amt + END + ), + shikiri_price = s.shikiri_price, + shikiri_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.shikiri_amt * -1) + ELSE + s.shikiri_amt + END + ), + nhi_price = s.nhi_price, + nhi_amt = ( + CASE + WHEN + (LEFT(s.v_tran_cd, 1) = 2 AND (s.err_flg20 IS NULL OR s.err_flg20 != 'M')) + THEN + (s.nhi_amt * -1) + ELSE + s.nhi_amt + END + ), + v_inst_cd = s.v_inst_cd, + inst_clas_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 + ), + 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 = ( + CASE + WHEN + s.v_inst_cd LIKE '00%' + THEN + ci.prefc_cd + ELSE + fmvt.prft_cd + END + ), + 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 @insert_sales_laundering = REPLACE(@insert_sales_laundering, "$$target_table$$", target_table); + PREPARE insert_sales_laundering_stmt from @insert_sales_laundering; + EXECUTE insert_sales_laundering_stmt USING @extract_from_date, @extract_to_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, - '卸販売実績テーブル(洗替後)作成⑦ 開始' + '卸販売実績テーブル(洗替後)作成⑥ 開始' ); - UPDATE - ( SELECT CAST(SYSDATE() AS DATE) AS today ) AS sub, - src05.sales_lau AS sl, - src05.sales AS s - SET - sl.inst_cd = ( - CASE - WHEN - (s.err_flg20 != 'M' AND sl.inst_clas_cd IN ('2', '3')) OR (s.err_flg20 = 'M') - THEN - s.v_inst_cd - ELSE - NULL - END - ) - WHERE - sub.today = CAST(s.dwh_upd_dt AS DATE) - AND sl.slip_mgt_num = s.slip_mgt_num - AND sl.row_num = s.row_num - ; + SET @update_institution_code = " + UPDATE + ( SELECT CAST(SYSDATE() AS DATE) AS today ) 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 + sub.today = CAST(s.dwh_upd_dt AS DATE) + 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; 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 index 4ef2075e..35c4a700 100644 --- a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -1,5 +1,5 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.v_inst_merge_laundering(@target_table VARCHAR(64)) +CREATE PROCEDURE src05.v_inst_merge_laundering(target_table VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -7,10 +7,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'v_inst_merge_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -23,46 +23,50 @@ BEGIN SET @error_state = NULL, @error_msg = NULL; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】3:HCO施設コードの洗替① 開始' + '【洗替】3:HCO施設コードの洗替① 開始' ); - UPDATE ( - SELECT - v_inst_cd, - v_inst_cd_merge, - fcl_name, - fcl_kn_name, - fmt_addr, - prft_cd - FROM - internal05.v_inst_merge_t - WHERE - (fcl_type IN ('A1', 'A0')) OR fcl_type BETWEEN '20' AND '29' - ) AS vimt, - src05.@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.prefc_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 = " + UPDATE ( + SELECT + v_inst_cd, + v_inst_cd_merge, + fcl_name, + fcl_kn_name, + fmt_addr, + prft_cd + FROM + internal05.v_inst_merge_t + WHERE + (fcl_type IN ('A1', 'A0')) OR fcl_type BETWEEN '20' AND '29' + ) 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施設コードの洗替① 終了' diff --git a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql index e3ce53c7..4b5835ee 100644 --- a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql +++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql @@ -1,5 +1,5 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.whs_org_laundering(@target_table VARCHAR(64)) +CREATE PROCEDURE src05.whs_org_laundering(target_table VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -7,10 +7,10 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'whs_org_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); -- 例外処理 - DECLARE EXIT HANDLER FOR SQLEXCEPTION + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; @@ -29,11 +29,11 @@ BEGIN TRUNCATE TABLE internal05.whs_customer_org_t; call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】1.卸組織洗替① 終了' + '【洗替】1.卸組織洗替① 終了' ); call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, - '【洗替】1.卸組織洗替② 開始' + '【洗替】1.卸組織洗替② 開始' ); INSERT INTO @@ -43,7 +43,7 @@ BEGIN customer_cd, whs_org_cd, v_org_cd, - nm_2 + name_2 ) SELECT wcmv.whs_cd, @@ -89,30 +89,35 @@ BEGIN 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.卸組織洗替③ 開始' - ); - - UPDATE - src05.sales_lau AS sl, src05.@target_table AS tt - SET - sl.whs_org_cd = tt.whs_org_cd, - sl.v_whsorg_cd = tt.v_org_cd, - sl.whs_org_name = tt.nm_2 - WHERE - st.whs_cd = tt.whs_cd - AND st.whs_sub_cd = tt.whs_sub_cd - AND st.customer_cd = tt.customer_cd + 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.卸組織洗替③ 終了' + '【洗替】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 From 4e529493634e22f54bff1de26fe10fe6f976909f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 12 Jun 2023 11:00:25 +0900 Subject: [PATCH 366/962] =?UTF-8?q?fix:=20=E7=94=9F=E7=89=A9=E7=94=B1?= =?UTF-8?q?=E6=9D=A5=E6=A4=9C=E7=B4=A2=E3=81=8C=E3=81=86=E3=81=BE=E3=81=8F?= =?UTF-8?q?=E5=8B=95=E3=81=84=E3=81=A6=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=81=AE=E3=82=92=E3=81=A4=E3=81=84=E3=81=A7=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/bioSearchList.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 5ede3802..0e1ed683 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -290,6 +290,7 @@ showNavigator: true, formatNavigator: '件数: <%= totalNumber %>件 ページ数: <%= totalPage %>', callback: function(data, pagination) { + console.log(pagination.pageNumber) $('#result_data').html(pagination_content(data)) } }) @@ -335,7 +336,6 @@ 'v_tran_cd', 'iko_flg', ]; - const tableRow = documen.sendt.createElement('tr') return datas.map(function (data) { return ` @@ -343,7 +343,6 @@ ` }) - return tableRow } From ce883d8ad7d0c910e88cfe1a35f932ae38e8678e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 14 Jun 2023 09:41:07 +0900 Subject: [PATCH 367/962] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E5=89=8D=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 1 + ecs/jskult-webapp/src/controller/ultmarc.py | 108 +++++-- .../model/db/ultmarc_doctor_wrkplace_count.py | 9 + .../src/model/db/ultmarc_inst_info.py | 57 ++++ .../src/model/db/ultmarc_inst_trt_course.py | 9 + .../src/model/db/ultmarc_trt_course.py | 2 +- .../src/model/request/ultmarc_inst.py | 6 +- .../view/ultmarc_doctor_info_view_model.py | 29 +- .../model/view/ultmarc_doctor_view_model.py | 15 +- .../view/ultmarc_inst_info_view_model.py | 264 ++++++++++++++++ .../src/model/view/ultmarc_inst_view_model.py | 31 +- .../repositories/ultmarc_doctor_repository.py | 9 +- .../ultmarc_dr_wrkplace_his_repository.py | 30 +- .../ultmarc_dr_wrkplace_repository.py | 24 ++ .../repositories/ultmarc_inst_repository.py | 87 +++++- .../ultmarc_inst_trt_course_repository.py | 31 ++ .../ultmarc_trt_course_repository.py | 6 +- .../src/services/ultmarc_view_service.py | 26 ++ .../src/system_var/environment.py | 3 +- ecs/jskult-webapp/src/templates/docInfo.html | 68 +++-- .../src/templates/docSearch.html | 43 ++- ecs/jskult-webapp/src/templates/instInfo.html | 285 ++++++++++++++++++ .../src/templates/instSearch.html | 62 +++- .../task_settings/web_task_settings.env | 1 + 24 files changed, 1089 insertions(+), 117 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py create mode 100644 ecs/jskult-webapp/src/templates/instInfo.html diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index f330f3d5..c604e43e 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -22,4 +22,5 @@ AWS_REGION=ap-northeast-1 AUTHORIZE_ENDPOINT=oauth2/authorize TOKEN_ENDPOINT=oauth2/token BIO_SEARCH_RESULT_MAX_COUNT=35000 +SEARCH_RESULT_MAX_COUNT=500 SESSION_EXPIRE_MINUTE=20 diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index f4747bc8..914826c9 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -1,18 +1,15 @@ from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, Request -from fastapi.exceptions import HTTPException -from starlette import status +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 UltmarcDoctorModel, UltmarcDoctorInfoModel -from src.model.request.ultmarc_inst import UltmarcInstModel +from src.model.request.ultmarc_inst import UltmarcInstModel, UltmarcInstInfoModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.ultmarc_view_service import UltmarcViewService from src.services.session_service import set_session -from src.system_var import constants from src.templates import templates router = APIRouter() @@ -33,9 +30,6 @@ def ultmarc_inst_view( # バッチ処理中の場合、機能を利用させない is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) - # 検索項目の取得(都道府県・施設区分) ultmarc = ultmarc_service.ultmarc_inst_view(session) ultmarc.is_batch_processing = is_batch_processing @@ -66,10 +60,9 @@ def search_inst( batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない # is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) # 施設データを検索 ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form) @@ -98,6 +91,89 @@ def search_inst( 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.info_ultmarc_inst_view(id, session) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # instId + ultmarc.instId = id + # ページ総数(件数) + ultmarc.postCnt = 1 + # ページ数(表示するページNo) + ultmarc.pageNum = 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() + + instId = ultmarc_inst_form.instId.split(',') + + # 施設情報の取得 + ultmarc = ultmarc_service.info_ultmarc_inst_view(instId[ultmarc_inst_form.pageNum], session) + + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # InstId + ultmarc.instId = ultmarc_inst_form.instId + # ページ総数(件数) + ultmarc.postCnt = len(instId) + # ページ数(表示するページNo) + ultmarc.pageNum = ultmarc_inst_form.pageNum + + # セッション書き換え + 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, @@ -108,9 +184,6 @@ def ultmarc_doctor_view( # バッチ処理中の場合、機能を利用させない is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) - # 検索項目の取得(都道府県) ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) ultmarc.is_batch_processing = is_batch_processing @@ -141,10 +214,9 @@ def search_doc( batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない # is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) # 医師データを検索 ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form) @@ -184,9 +256,6 @@ def ultmarc_doctor_info_view( # バッチ処理中の場合、機能を利用させない is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) - # 医師情報の取得 ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) # バッチ起動判定の取得 @@ -227,9 +296,6 @@ def ultmarc_doctor_info_search( # バッチ処理中の場合、機能を利用させない is_batch_processing = batch_status_service.is_batch_processing() - # if batch_status_service.is_batch_processing(): - # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) - docId = ultmarc_doctor_form.docId.split(',') # 医師情報の取得 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_inst_info.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py new file mode 100644 index 00000000..a72b38a9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py @@ -0,0 +1,57 @@ +from typing import Optional +from datetime import datetime +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +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_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py index 23908fce..788d9748 100644 --- a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py +++ b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py @@ -5,5 +5,5 @@ from src.util.sanitize import sanitize @sanitize -class UltmarcTrtCoursedbmodel(BaseDBModel): +class UltmarcTrtCourseDBModel(BaseDBModel): trt_course_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index f7919612..8b9a52c6 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -45,17 +45,17 @@ class UltmarcInstModel(BaseModel): class UltmarcInstInfoModel(BaseModel): - docId: Optional[str] + instId: Optional[str] pageNum: Optional[int] @classmethod def as_form( cls, - docId: str = Form(None), + instId: str = Form(None), pageNum: str = Form(None) ): return cls( - docId=docId, + instId=instId, pageNum=int(pageNum) ) 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 index 993bea14..0af599d4 100644 --- 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 @@ -1,17 +1,13 @@ -import json -from collections import OrderedDict -from datetime import datetime +from datetime import datetime, date from typing import Optional - from pydantic import BaseModel from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel -from src.model.db.ultmarc_trt_course import UltmarcTrtCoursedbmodel +from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel from src.model.db.ultmarc_specialist_license import UltmarcSpecialistLicenseDBModel from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel from src.model.db.ultmarc_doctor_wrkplace_his import UltmarcDoctorWrkplaceHisDBModel - from src.system_var import environment @@ -19,7 +15,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): subtitle: str = '医師情報' is_batch_processing: Optional[bool] doctor_info_data: Optional[UltmarcDoctorInfoDBModel] - trt_coursed_data: Optional[list[UltmarcTrtCoursedbmodel]] + trt_coursed_data: Optional[list[UltmarcTrtCourseDBModel]] sosiety_data: Optional[list[UltmarcSosietyDBModel]] specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] @@ -28,11 +24,6 @@ class UltmarcDoctorInfoViewModel(BaseModel): postCnt: Optional[int] pageNum: Optional[int] - 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 is_input_dcf_pcf_dr_cd(self): return self.doctor_info_data.dcf_pcf_dr_cd or '' @@ -86,6 +77,11 @@ class UltmarcDoctorInfoViewModel(BaseModel): def is_input_birthday_fromat(self): return self._format_date_string(self.doctor_info_data.birthday) + def is_input_ymd_fromat(self, ymd): + if ymd is None: + return '' + return ymd.strftime('%Y/%m/%d') + def is_input_trt_course_data_size(self): return len(self.trt_coursed_data) @@ -102,13 +98,16 @@ class UltmarcDoctorInfoViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) >= environment.SEARCH_RESULT_MAX_COUNT def _format_date_string(self, date_string): if date_string is None: return '' - date = datetime.strptime(date_string, '%Y%m%d') - return date.strftime('%Y/%m/%d') + date_str = datetime.strptime(date_string, '%Y%m%d') + return date_str.strftime('%Y/%m/%d') def _selected_value(self, form_value: str, current_value: str): return 'selected' if form_value == current_value else '' + + def is_octor_wrkplace_data_count(self): + return len(self.doctor_wrkplace_data) 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 index ea2afe48..47f55454 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from src.model.db.prefc_master import PrefcMasterModel from src.model.request.ultmarc_doctor import UltmarcDoctorModel -from src.model.view.bio_disp_model import BisDisplayModel +from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel from src.system_var import environment @@ -15,7 +15,7 @@ class UltmarcDoctorViewModel(BaseModel): subtitle: str = '医師検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] - doctor_data: Optional[list[BisDisplayModel]] = [] + doctor_data: Optional[list[UltmarcDoctorDBModel]] = [] form_data: Optional[UltmarcDoctorModel] def ultmarc_data_json_str(self): @@ -65,6 +65,11 @@ class UltmarcDoctorViewModel(BaseModel): 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(): @@ -99,13 +104,13 @@ class UltmarcDoctorViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) >= environment.SEARCH_RESULT_MAX_COUNT def _format_date_string(self, date_string): if date_string is None: return '' - date = datetime.strptime(date_string, '%Y%m%d') - return date.strftime('%Y/%m/%d') + date_str = datetime.strptime(date_string, '%Y%m%d') + return date_str.strftime('%Y/%m/%d') 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..6d64e04f --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py @@ -0,0 +1,264 @@ +import json +from collections import OrderedDict +from datetime import datetime +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] + instId: Optional[str] + postCnt: Optional[int] + pageNum: Optional[int] + + # 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 is_input_dcf_dsf_inst_cd(self): + return self.inst_info_data.dcf_dsf_inst_cd or '' + + # 未確認 + def is_checked_unconf_flg(self): + return 'checked' if self.inst_info_data.unconf_flg == '1' else '' + + # 施設コード変換先 + def is_input_dup_opp_cd(self): + return self.inst_info_data.dup_opp_cd or '' + + # 休院店開始年月 + def is_input_close_start_ym(self): + return self.inst_info_data.close_start_ym or '' + + # 休院店 + def is_checked_close_flg(self): + return 'checked' if self.inst_info_data.close_flg == '1' else '' + + # 削除予定理由 + def is_input_delete_sche_reason_cd(self): + return self.inst_info_data.delete_sche_reason_cd or '' + + def is_input_delete_sche_reason(self): + return self.inst_info_data.delete_sche_reason or '' + + # 削除日 + def is_input_abolish_ymd(self): + return self.inst_info_data.abolish_ymd or '' + + # 開業予定年月 + def is_input_estab_sche_ym(self): + return self.inst_info_data.estab_sche_ym or '' + + # 開業 + def is_checked_estab_sche_flg(self): + return 'checked' if self.inst_info_data.estab_sche_flg == '1' else '' + + # 正式施設名(カナ) + def is_input_form_inst_name_kana(self): + return self.inst_info_data.form_inst_name_kana or '' + + # 正式施設名(漢字) + def is_input_form_inst_name_kanji(self): + return self.inst_info_data.form_inst_name_kanji or '' + + # 略式施設名(カナ) + def is_input_inst_name_kana(self): + return self.inst_info_data.inst_name_kana or '' + + # 施設区分名 + def is_input_inst_div_name(self): + return self.inst_info_data.inst_div_name or '' + + # 略式施設名(漢字) + def is_input_inst_name_kanji(self): + return self.inst_info_data.inst_name_kanji or '' + + # 経営体 + def is_input_manage_cd(self): + return self.inst_info_data.manage_cd or '' + + def is_input_manage_name(self): + return self.inst_info_data.manage_name or '' + + # 郵便番号 + def is_input_postal_number(self): + return self.inst_info_data.postal_number or '' + + # 住所不明 + def is_checked_addr_unknown_reason_cd(self): + return 'checked' if self.inst_info_data.addr_unknown_reason_cd else '' + + # 施設電話番号 + def is_input_inst_phone_number(self): + return self.inst_info_data.inst_phone_number or '' + + # 開業 + def is_checked_phone_number_non_flg(self): + return 'checked' if self.inst_info_data.phone_number_non_flg == '1' else '' + + # 住所(カナ) + def is_input_inst_addr_kana(self): + return self.inst_info_data.inst_addr_kana or '' + + # 住所(漢字) + def is_input_inst_addr(self): + return self.inst_info_data.inst_addr or '' + + # 病院種別 + def is_input_hp_assrt_name(self): + return self.inst_info_data.hp_assrt_name or '' + + # 再審査区分 + def is_checked_re_exam_cd(self): + return 'checked' if self.inst_info_data.re_exam_cd else '' + + # 関連大学親名 + def is_input_rltd_univ_prnt_cd(self): + return self.inst_info_data.rltd_univ_prnt_cd or '' + + def is_input_parent_name(self): + return self.inst_info_data.parent_name or '' + + # 微生物 + def is_input_insp_item_micrb(self): + return self.inst_info_data.insp_item_micrb or '' + + # 血清 + def is_input_insp_item_serum(self): + return self.inst_info_data.insp_item_serum or '' + + # 血液 + def is_input_insp_item_blood(self): + return self.inst_info_data.insp_item_blood or '' + + # 病理 + def is_input_insp_item_patho(self): + return self.inst_info_data.insp_item_patho or '' + + # 寄生虫 + def is_input_insp_item_paras(self): + return self.inst_info_data.insp_item_paras or '' + + # 生化 + def is_input_insp_item_biochem(self): + return self.inst_info_data.insp_item_biochem or '' + + # RI + def is_input_insp_item_ri(self): + return self.inst_info_data.insp_item_ri or '' + + # 特務医務室 + def is_input_dcf_prnt_inst_cd(self): + return self.inst_info_data.dcf_prnt_inst_cd or '' + + # 一般 + def is_input_prmit_bed_num_gen(self): + return self.inst_info_data.prmit_bed_num_gen or '' + + # 療養 + def is_input_prmit_bed_num_rcup(self): + return self.inst_info_data.prmit_bed_num_rcup or '' + + # 精神 + def is_input_prmit_bed_num_mental(self): + return self.inst_info_data.prmit_bed_num_mental or '' + + # 感染症 + def is_input_prmit_bed_num_infection(self): + return self.inst_info_data.prmit_bed_num_infection or '' + + # 結核 + def is_input_prmit_bed_num_tuber(self): + return self.inst_info_data.prmit_bed_num_tuber or '' + + # その他 + def is_input_prmit_bed_num_other(self): + return self.inst_info_data.prmit_bed_num_other or '' + + # 合計 + def is_input_prmit_bed_num_sum(self): + return self.inst_info_data.prmit_bed_num_sum or '' + + # 病棟閉鎖   + 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_bed_num(self): + return self.inst_info_data.bed_num or '' + + # メンテ年月日 + def is_input_prmit_bed_maint_ymd(self): + return self.inst_info_data.prmit_bed_maint_ymd or '' + + # 代表者個人コード + def is_input_inst_repre_cd(self): + return self.inst_info_data.inst_repre_cd or '' + + # 施設代表者(カナ) + def is_input_inst_repre_kana(self): + return self.inst_info_data.inst_repre_kana or '' + + # 施設代表者(漢字) + def is_input_inst_repre(self): + return self.inst_info_data.inst_repre or '' + + # 修正年月日 + 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_pageNum_view(self): + return self.pageNum + 1 + + # 前ボタン + def is_disabled_prev(self): + return 'disabled' if self.pageNum == 0 else '' + + # 次ボタン + def is_disabled_next(self): + if self.pageNum == self.postCnt - 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 is_data_string_empty_fromat(self, data_string): + return data_string 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.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 index a0b5107c..e728945a 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from src.model.db.prefc_master import PrefcMasterModel from src.model.db.inst_div_master import InstDivMasterModel from src.model.request.ultmarc_inst import UltmarcInstModel -from src.model.view.bio_disp_model import BisDisplayModel +from src.model.db.ultmarc_inst import UltmarcInstDBModel from src.system_var import environment @@ -16,7 +16,7 @@ class UltmarcInstViewModel(BaseModel): is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] inst_div_models: list[InstDivMasterModel] - inst_data: Optional[list[BisDisplayModel]] = [] + inst_data: Optional[list[UltmarcInstDBModel]] = [] form_data: Optional[UltmarcInstModel] def ultmarc_data_json_str(self): @@ -25,7 +25,7 @@ class UltmarcInstViewModel(BaseModel): return json.dumps([model.dict() for model in self.inst_data], ensure_ascii=False, default=date_handler) # ULT施設コード - def is_input_dcf_dsf_inst_cdd(self): + def is_input_dcf_dsf_inst_cd(self): if not self.is_form_submitted(): return '' return self.form_data.dcf_dsf_inst_cd or '' @@ -36,6 +36,11 @@ class UltmarcInstViewModel(BaseModel): 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(): @@ -63,9 +68,14 @@ class UltmarcInstViewModel(BaseModel): # 削除施設表示 def is_checked_delFlg(self): if not self.is_form_submitted(): - return '' + 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(): @@ -78,6 +88,11 @@ class UltmarcInstViewModel(BaseModel): 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 '' @@ -85,16 +100,16 @@ class UltmarcInstViewModel(BaseModel): return self.form_data is not None def is_data_empty(self): - return len(self.doctor_data) == 0 + return len(self.inst_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT + return len(self.inst_data) >= environment.SEARCH_RESULT_MAX_COUNT def _format_date_string(self, date_string): if date_string is None: return '' - date = datetime.strptime(date_string, '%Y%m%d') - return date.strftime('%Y/%m/%d') + date_str = datetime.strptime(date_string, '%Y%m%d') + return date_str.strftime('%Y/%m/%d') 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/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 60f1543d..5860148c 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -34,7 +34,7 @@ class UltmarcDoctorRepository(BaseRepository): 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 + 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, @@ -127,6 +127,13 @@ class UltmarcDoctorRepository(BaseRepository): parameter.grad_y = f'%{parameter.grad_y}%' where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y')) + # 検索条件が入力されていない場合 + # if not 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 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 index 14f0de45..67ab328d 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -5,21 +5,23 @@ 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.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 + 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.aply_start_ymd DESC + 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]: diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py index fd1295d7..cc6a9dc3 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -1,4 +1,6 @@ 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 @@ -37,3 +39,25 @@ class UltmarcDoctorWrkplaceRepository(BaseRepository): 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 index 438c429d..2cf08f77 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -1,6 +1,7 @@ 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 UltmarcInstModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -95,14 +96,94 @@ class UltmarcInstRepository(BaseRepository): where_clauses.append(SQLCondition('inst_addr', condition.LIKE, 'inst_addr')) # 削除表示フラグ - if is_not_empty(parameter.delFlg): + if is_not_empty(parameter.delFlg) == False: # 論理和での検索 where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True)) # 検索条件が入力されていない場合 - if not where_clauses: - where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True)) + # if not where_clauses: + # 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_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py index f50fc02a..c76032a3 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -1,4 +1,4 @@ -from src.model.db.ultmarc_trt_course import UltmarcTrtCoursedbmodel +from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel from src.repositories.base_repository import BaseRepository @@ -13,13 +13,13 @@ class UltmarcTrtCourseRepository(BaseRepository): ORDER BY com_trt_course.trt_course_cd """ - def fetch_many(self, id) -> list[UltmarcTrtCoursedbmodel]: + 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] + models = [UltmarcTrtCourseDBModel(**r) for r in result] if len(models) == 0: return None return models diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 65cc57a0..d8103c93 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -11,6 +11,7 @@ from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.request.ultmarc_inst import UltmarcInstModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel from src.model.view.ultmarc_inst_view_model import UltmarcInstViewModel +from src.model.view.ultmarc_inst_info_view_model import UltmarcInstInfoViewModel from src.model.view.ultmarc_doctor_info_view_model import UltmarcDoctorInfoViewModel from src.repositories.base_repository import BaseRepository from src.repositories.prefc_master_repository import PrefcMasterRepository @@ -18,6 +19,7 @@ from src.repositories.inst_master_repository import InstDivMasterRepository from src.repositories.ultmarc_inst_repository import UltmarcInstRepository from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository from src.repositories.ultmarc_trt_course_repository import UltmarcTrtCourseRepository +from src.repositories.ultmarc_inst_trt_course_repository import UltmarcInstTrtCourseRepository from src.repositories.ultmarc_sosiety_repository import UltmarcSosietyRepository from src.repositories.ultmarc_dr_wrkplace_repository import UltmarcDoctorWrkplaceRepository from src.repositories.ultmarc_dr_wrkplace_his_repository import UltmarcDoctorWrkplaceHisRepository @@ -33,6 +35,7 @@ class UltmarcViewService(BaseService): '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, @@ -44,6 +47,7 @@ class UltmarcViewService(BaseService): 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 @@ -56,6 +60,7 @@ class UltmarcViewService(BaseService): 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'] @@ -93,6 +98,27 @@ class UltmarcViewService(BaseService): ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) return ultmarc_inst_data + def info_ultmarc_inst_view( + self, + id, + session: UserSession + ) -> 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 + def search_doctor_data(self, search_params: UltmarcDoctorModel): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index aed9916c..cd54d35d 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -19,4 +19,5 @@ 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']) -SESSION_EXPIRE_MINUTE=int(os.environ['SESSION_EXPIRE_MINUTE']) \ No newline at end of file +SEARCH_RESULT_MAX_COUNT = int(os.environ['SEARCH_RESULT_MAX_COUNT']) +SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE']) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 1202faee..7e807303 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -33,7 +33,7 @@ - + - + + @@ -175,35 +188,44 @@ + - {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} - {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} - - - - - - - - - - {% endif %} - {% endfor %} - + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} + {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd) != ''%} - - + + - - + + {% endif %} {% endfor %} - +

医師情報

{{ultmarc.subtitle}}

{% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
@@ -50,16 +50,29 @@
- + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} - +
終了年月日
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
+ {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}
+ {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}} + {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}
diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index c3168212..403b7f33 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -22,7 +22,7 @@ - +

医師検索一覧

{{ultmarc.subtitle}}

{% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
@@ -140,7 +140,17 @@
- + {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} +
+ 検索結果が最大件数を超えました。検索条件を見直しして下さい。 +
+ {% endif %} + {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} +
+ 対象のデータが存在しません。 +
+ {% endif %} + @@ -156,8 +166,24 @@ const searchResultData = JSON.parse(searchResultString) if (searchResultData.length == 0) { return - } - $(".pagination").pagination({ + }else if(searchResultData.length > 500){ + return + } + // 検索条件をセッションに入れる + sessionStorage.clear(); + sessionStorage.setItem('ctrl_dcf_pcf_dr_cd','{{ultmarc.is_input_dcf_pcf_dr_cd()}}'); + sessionStorage.setItem('ctrl_dr_name','{{ultmarc.is_input_dr_name()}}'); + sessionStorage.setItem('ctrl_dr_name_kana','{{ultmarc.is_input_dr_name_kana()}}'); + sessionStorage.setItem('ctrl_dcf_dsf_inst_cd','{{ultmarc.is_input_dcf_dsf_inst_cd()}}'); + sessionStorage.setItem('ctrl_form_inst_name_kanji','{{ultmarc.is_input_form_inst_name_kanji()}}'); + sessionStorage.setItem('ctrl_form_inst_name_kana','{{ultmarc.is_input_form_inst_name_kana()}}'); + sessionStorage.setItem('ctrl_prefc_cd','{{ultmarc.is_input_form_prefc_cd()}}'); + sessionStorage.setItem('ctrl_blng_sec_name','{{ultmarc.is_input_blng_sec_name()}}'); + sessionStorage.setItem('ctrl_trt_course_name','{{ultmarc.is_input_trt_course_name()}}'); + sessionStorage.setItem('ctrl_alma','{{ultmarc.is_input_alma()}}'); + sessionStorage.setItem('ctrl_grad_y','{{ultmarc.is_input_grad_y()}}'); + + $(".pagination").pagination({ dataSource: function(done) { done(searchResultData) }, @@ -175,6 +201,11 @@ }) }); + function OnLinkClick(){ + sessionStorage.clear(); + return true; + } + function pagination_content(datas) { const display_keys = [ 'dcf_pcf_dr_cd', @@ -192,7 +223,7 @@ if(key=='dcf_pcf_dr_cd') inner_content = `${data['dcf_pcf_dr_cd'] || ''}`; if(key=='dcf_dsf_inst_cd') - inner_content = `${data['form_inst_name_kanji'] || ''}`; + inner_content = `${data['form_inst_name_kanji'] || ''}`; return `${inner_content || ''}` }); return ` @@ -208,7 +239,7 @@ }) } - // 配列パラメータを加工にする + 配列パラメータを加工にする function CheckBoxListPocessing() { var vals = []; // 配列を定義 diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html new file mode 100644 index 00000000..2ce03d2b --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -0,0 +1,285 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + +

+ {{ultmarc.subtitle}} +

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
施設コード + + 未確認 + 施設コード変換先 + + 休院店開始年月 + + 休院店 +
削除予定理由削除日 + + 開業予定年月 + + 開業 +
正式施設名(カナ)
正式施設名(漢字)
略式施設名(カナ)施設区分名
略式施設名(漢字)経営体 + + +
郵便番号 + + 住所不明 + 施設電話番号 + + 電話なし +
住所(カナ)
住所(漢字)
+ +
+ + + + + + + + + + + + + + + + + + + + +
病院種別再審査区分関連大学親名 + + +
診療科目 + {% if ultmarc.inst_trt_coursed_data != None %} + {% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %} + + {% endfor %} + {% endif %} + {% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %} + + {% endfor %} + +
検査工程 + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
特務医務室許可病床数 + + + + + + + + + + + + + + + + + + + + + +
一般療養精神感染症結核その他合計
+
病棟閉鎖  一部病棟閉鎖
病床数(定員)メンテ年月日
+ + + + + + + + + + + + + + + + + + + + +
代表者個人コード
施設代表者(カナ)
施設代表者(漢字)
修正年月日
+ + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 92db85ae..15988f05 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -7,7 +7,7 @@ \ 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..b10c9342 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 +SEARCH_RESULT_MAX_COUNT=500 From 0421aa8ccd44f1bb4463c7c08a2ae07cb181da24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 14 Jun 2023 11:56:44 +0900 Subject: [PATCH 368/962] =?UTF-8?q?feat:=20=E4=BB=95=E6=A7=98=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 170 ++++++++++++------ 1 file changed, 113 insertions(+), 57 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index e325d7a4..2e4f9ca7 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -55,76 +55,128 @@ def _set_disabled_dct_inst_merge(db: Database): _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') +def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 納入先処方元マスタから、DCF施設コードに対応した領域コードの取得 + try: + sql = """ + SELECT + ta_cd + 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('納入先処方元マスタから領域コードの取得に成功') + except Exception as e: + logger.debug('納入先処方元マスタから領域コードの取得に失敗') + 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_ta_cd_records = _select_ult_ident_presc_ta_cd(db, enabled_merge_record['dcf_inst_cd']) + for ult_ident_presc_ta_cd_record in ult_ident_presc_ta_cd_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_ta_cd_record['ta_cd']) + 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 - ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], - enabled_merge_record['dup_opp_cd']) - 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: - break + 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) - 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 _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: - # 対象レコードを物理削除する - _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, - '開始月>適用開始日のため物理削除') - continue - # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 - if not is_exists_duplicate_key: - 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) + # 適用終了日 < 適用開始日の場合 + if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + # 対象レコードを物理削除する + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '開始月>適用開始日のため物理削除') + continue + # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 + if not is_exists_duplicate_key: + 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_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd']) - for emp_chg_inst_row in emp_chg_inst_records: - # 重複時相手先コードが存在したかのチェック - if emp_chg_inst_row['opp_count'] > 0: - break + 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 + 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) + _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']) + # 適用開始日 < 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('従業員担当施設マスタの登録 終了') @@ -468,7 +520,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, raise e -def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: +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 = """ @@ -487,16 +539,18 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis FROM src05.emp_chg_inst AS eciopp WHERE - eciopp.inst_cd = :dup_opp_cd + 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} + 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('従業員担当施設マスタの取得 成功') @@ -506,7 +560,7 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis return emp_chg_inst_records -def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: +def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: # ult_ident_prescからSELECT try: sql = """ @@ -522,15 +576,17 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> FROM src05.ult_ident_presc AS uipopp WHERE - uipopp.presc_cd = :dup_opp_cd + uipopp.presc_cd = :dup_opp_cd + AND uipopp.ta_cd = :ta_cd ) 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} + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd} ult_ident_presc_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('納入先処方元マスタの取得 成功') From 5359486197fa214974a56888d1ec0b2cb498e84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 14 Jun 2023 15:35:55 +0900 Subject: [PATCH 369/962] =?UTF-8?q?delFlg=5Fctrl=20=E8=8B=A6=E8=82=89?= =?UTF-8?q?=E3=81=AE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/request/ultmarc_inst.py | 4 ++-- .../repositories/ultmarc_doctor_repository.py | 9 ++------- .../src/templates/bioSearchList.html | 4 ++-- .../src/templates/docSearch.html | 2 -- .../src/templates/instSearch.html | 20 +++++++++---------- 5 files changed, 15 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index 8b9a52c6..ba06a443 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -28,7 +28,7 @@ class UltmarcInstModel(BaseModel): ctrl_postal_number: str = Form(None), ctrl_inst_phone_number: str = Form(None), ctrl_prefc_cd: str = Form(None), - ctrl_delFlg: str = Form(None), + delFlg_ctrl: str = Form(None), ctrl_inst_addr: str = Form(None) ): return cls( @@ -39,7 +39,7 @@ class UltmarcInstModel(BaseModel): postal_number=ctrl_postal_number, inst_phone_number=ctrl_inst_phone_number, prefc_cd=ctrl_prefc_cd, - delFlg=ctrl_delFlg, + delFlg=delFlg_ctrl, inst_addr=ctrl_inst_addr ) diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 5860148c..bd89db0b 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -34,6 +34,8 @@ class UltmarcDoctorRepository(BaseRepository): LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd WHERE {where_clause} + AND (length(com_inst.abolish_ymd) = 0 OR com_inst.abolish_ymd IS NULL) + AND (length(com_dr.abolish_ymd) = 0 OR com_dr.abolish_ymd IS NULL) 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, @@ -127,13 +129,6 @@ class UltmarcDoctorRepository(BaseRepository): parameter.grad_y = f'%{parameter.grad_y}%' where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y')) - # 検索条件が入力されていない場合 - # if not 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 diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index d44247c1..09f1a718 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -176,12 +176,12 @@ {% if bio.is_form_submitted() and bio.is_data_overflow_max_length() %}
- 検索結果が最大件数を超えました。検索条件を見直しして下さい。 + 検索件数が500件を超えています 検索項目を見直してください
{% endif %} {% if bio.is_form_submitted() and bio.is_data_empty() %}
- 対象のデータが存在しません。 + 対象のデータが存在しません
{% endif %} diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 403b7f33..0b86e837 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -7,8 +7,6 @@ diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html index 2ce03d2b..b582b54d 100644 --- a/ecs/jskult-webapp/src/templates/instInfo.html +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -18,12 +18,12 @@ $(function(){ // 前ページ遷移処理 $('#prev').click(function(){ - $('#pageNum').val(Number($('#pageNum').val()) - 1); + $('#page_num').val(Number($('#page_num').val()) - 1); $('#instInfo').submit(); }); // 次ページ遷移処理 $('#next').click(function(){ - $('#pageNum').val(Number($('#pageNum').val()) + 1); + $('#page_num').val(Number($('#page_num').val()) + 1); $('#instInfo').submit(); }); }); @@ -48,13 +48,13 @@
- - + + - {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} + {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 8cb92402..25e55ed8 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -114,8 +114,8 @@ - - + + @@ -236,7 +236,7 @@ $('input[name="data"]:checked').each(function() { vals.push( $(this).val() ); // 配列に値を追加 }); - $("#instId").val(vals.join(',')); + $("#inst_id").val(vals.join(',')); } diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env index b10c9342..9336383d 100644 --- a/s3/config/jskult/task_settings/web_task_settings.env +++ b/s3/config/jskult/task_settings/web_task_settings.env @@ -4,4 +4,4 @@ AUTHORIZE_ENDPOINT=oauth2/authorize TOKEN_ENDPOINT=oauth2/token BIO_SEARCH_RESULT_MAX_COUNT=35000 SESSION_EXPIRE_MINUTE=20 -SEARCH_RESULT_MAX_COUNT=500 +UTL_SEARCH_RESULT_MAX_COUNT=500 From f261cda65befba0433db776b0f1b30a22aeacf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 16 Jun 2023 18:12:28 +0900 Subject: [PATCH 377/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 2 +- ecs/jskult-webapp/src/controller/ultmarc.py | 48 +++-- .../src/model/request/ultmarc_doctor.py | 7 +- .../src/model/request/ultmarc_inst.py | 9 +- .../src/model/view/bio_view_model.py | 2 +- .../view/ultmarc_doctor_info_view_model.py | 42 +---- .../model/view/ultmarc_doctor_view_model.py | 8 +- .../view/ultmarc_inst_info_view_model.py | 166 +----------------- .../src/model/view/ultmarc_inst_view_model.py | 12 +- .../repositories/ultmarc_inst_repository.py | 8 +- .../src/services/ultmarc_view_service.py | 101 +++++------ .../src/system_var/environment.py | 2 +- .../src/templates/bioSearchList.html | 2 +- ecs/jskult-webapp/src/templates/docInfo.html | 63 ++++--- .../src/templates/docSearch.html | 40 +++-- ecs/jskult-webapp/src/templates/instInfo.html | 84 ++++----- .../src/templates/instSearch.html | 32 ++-- .../task_settings/web_task_settings.env | 2 +- 18 files changed, 239 insertions(+), 391 deletions(-) diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index d6fcbdcc..0630afe4 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -22,6 +22,6 @@ AWS_REGION=ap-northeast-1 AUTHORIZE_ENDPOINT=oauth2/authorize TOKEN_ENDPOINT=oauth2/token BIO_SEARCH_RESULT_MAX_COUNT=35000 -UTL_SEARCH_RESULT_MAX_COUNT=500 +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/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 00678cb0..5e9c046f 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -4,10 +4,10 @@ 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_doctor import ( + UltmarcDoctorInfoModel, UltmarcDoctorSearchModel) from src.model.request.ultmarc_inst import (UltmarcInstInfoModel, - UltmarcInstModel) + UltmarcInstSearchModel) from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.session_service import set_session @@ -21,6 +21,10 @@ router.route_class = AuthenticatedRoute # Views # ######################### +######################### +# アルトマーク施設検索 # +######################### + @router.get('/instSearch') def ultmarc_inst_view( @@ -33,7 +37,7 @@ def ultmarc_inst_view( is_batch_processing = batch_status_service.is_batch_processing() # 検索項目の取得(都道府県・施設区分) - ultmarc = ultmarc_service.ultmarc_inst_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_inst_search_view() ultmarc.is_batch_processing = is_batch_processing # セッション書き換え @@ -57,7 +61,7 @@ def ultmarc_inst_view( @router.post('/instSearch') def search_inst( request: Request, - ultmarc_inst_form: Optional[UltmarcInstModel] = Depends(UltmarcInstModel.as_form), + ultmarc_inst_form: Optional[UltmarcInstSearchModel] = Depends(UltmarcInstSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -70,7 +74,7 @@ def search_inst( ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form) # 検索項目の取得(都道府県・施設区分) - ultmarc = ultmarc_service.ultmarc_inst_view(session) + 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 @@ -92,6 +96,10 @@ def search_inst( ) return templates_response +######################### +# アルトマーク施設詳細 # +######################### + @router.get('/instInfo') def ultmarc_inst_info_view( @@ -105,8 +113,8 @@ def ultmarc_inst_info_view( is_batch_processing = batch_status_service.is_batch_processing() # 施設情報の取得 - ultmarc = ultmarc_service.info_ultmarc_inst_view(id, session) - # バッチ起動判定の取得 + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(id) + # バッチ起動判定 ultmarc.is_batch_processing = is_batch_processing # inst_id ultmarc.inst_id = id @@ -133,7 +141,7 @@ def ultmarc_inst_info_view( return templates_response -@router.post('/instInfo') +@ router.post('/instInfo') def ultmarc_inst_info_search( request: Request, ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form), @@ -147,7 +155,7 @@ def ultmarc_inst_info_search( inst_id = ultmarc_inst_form.inst_id.split(',') # 施設情報の取得 - ultmarc = ultmarc_service.info_ultmarc_inst_view(inst_id[ultmarc_inst_form.page_num], session) + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(inst_id[ultmarc_inst_form.page_num]) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing @@ -175,6 +183,10 @@ def ultmarc_inst_info_search( ) return templates_response +######################### +# アルトマーク医師検索 # +######################### + @router.get('/docSearch') def ultmarc_doctor_view( @@ -187,7 +199,7 @@ def ultmarc_doctor_view( is_batch_processing = batch_status_service.is_batch_processing() # 検索項目の取得(都道府県) - ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_search_view() ultmarc.is_batch_processing = is_batch_processing # セッション書き換え @@ -218,14 +230,14 @@ def search_doc( session: UserSession = request.session # バッチ処理中ステータスを取得 - # is_batch_processing = batch_status_service.is_batch_processing() + 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_view(session) - ultmarc.is_batch_processing = batch_status_service.is_batch_processing() + 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 @@ -246,6 +258,10 @@ def search_doc( ) return templates_response +######################### +# アルトマーク医師詳細 # +######################### + @router.get('/docInfo') def ultmarc_doctor_info_view( @@ -259,7 +275,7 @@ def ultmarc_doctor_info_view( is_batch_processing = batch_status_service.is_batch_processing() # 医師情報の取得 - ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(id) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing # doc_id @@ -301,7 +317,7 @@ def ultmarc_doctor_info_search( doc_id = ultmarc_doctor_form.doc_id.split(',') # 医師情報の取得 - ultmarc = ultmarc_service.info_ultmarc_doctor_view(doc_id[ultmarc_doctor_form.page_num], session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(doc_id[ultmarc_doctor_form.page_num]) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing # doc_id diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py index 135869b9..e1fd6224 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py @@ -19,6 +19,7 @@ class UltmarcDoctorSearchModel(BaseModel): trt_course_name: Optional[str] alma: Optional[str] grad_y: Optional[str] + pagination_pageNumber: Optional[int] @classmethod def as_form( @@ -33,7 +34,8 @@ class UltmarcDoctorSearchModel(BaseModel): 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) + ctrl_grad_y: str = Form(None), + pagination_pageNumber: str = Form(None) ): return cls( @@ -47,7 +49,8 @@ class UltmarcDoctorSearchModel(BaseModel): blng_sec_name=ctrl_blng_sec_name, trt_course_name=ctrl_trt_course_name, alma=ctrl_alma, - grad_y=ctrl_grad_y + grad_y=ctrl_grad_y, + pagination_pageNumber=pagination_pageNumber ) diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index 1b5972ff..8f28df30 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -7,7 +7,7 @@ from src.util.sanitize import sanitize @sanitize -class UltmarcInstModel(BaseModel): +class UltmarcInstSearchModel(BaseModel): dcf_dsf_inst_cd: Optional[str] inst_div_cd: Optional[str] form_inst_name_kanji: Optional[str] @@ -17,6 +17,7 @@ class UltmarcInstModel(BaseModel): prefc_cd: Optional[str] delFlg: Optional[str] inst_addr: Optional[str] + pagination_pageNumber: Optional[int] @classmethod def as_form( @@ -29,7 +30,8 @@ class UltmarcInstModel(BaseModel): ctrl_inst_phone_number: str = Form(None), ctrl_prefc_cd: str = Form(None), delFlg_ctrl: str = Form(None), - ctrl_inst_addr: str = Form(None) + ctrl_inst_addr: str = Form(None), + pagination_pageNumber: str = Form(None) ): return cls( dcf_dsf_inst_cd=ctrl_dcf_dsf_inst_cd, @@ -40,7 +42,8 @@ class UltmarcInstModel(BaseModel): inst_phone_number=ctrl_inst_phone_number, prefc_cd=ctrl_prefc_cd, delFlg=delFlg_ctrl, - inst_addr=ctrl_inst_addr + inst_addr=ctrl_inst_addr, + pagination_pageNumber=pagination_pageNumber ) 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/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py index ddbd5542..e84a3f3f 100644 --- 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 @@ -27,42 +27,6 @@ class UltmarcDoctorInfoViewModel(BaseModel): post_cnt: Optional[int] page_num: Optional[int] - # 医師コード - def is_input_dcf_pcf_dr_cd(self): - return self.doctor_info_data.dcf_pcf_dr_cd or '' - - # 氏名(漢字) - def is_input_dr_name(self): - return self.doctor_info_data.dr_name or '' - - # 氏名(かな・カナ) - def is_input_dr_name_kana(self): - return self.doctor_info_data.dr_name_kana or '' - - # 性別 - def is_input_sex(self): - return self.doctor_info_data.sex or '' - - # 出身大学 - def is_input_alma(self): - return self.doctor_info_data.alma or '' - - # 出身県 - def is_input_hometown(self): - return self.doctor_info_data.hometown or '' - - # 卒年 - def is_input_grad_y(self): - return self.doctor_info_data.grad_y or '' - - # 登録年 - def is_input_drday_y(self): - return self.doctor_info_data.drday_y or '' - - # 開業年 - def is_input_estab_y(self): - return self.doctor_info_data.estab_y or '' - # 現在のページ(表示用) def is_page_num_view(self): return self.page_num + 1 @@ -77,6 +41,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): return 'disabled' return '' + # 生年月日 def is_input_birthday_fromat(self): return self._format_date_string(self.doctor_info_data.birthday) @@ -88,9 +53,6 @@ class UltmarcDoctorInfoViewModel(BaseModel): def is_input_trt_course_data_size(self): return len(self.trt_coursed_data) - def is_data_string_empty_fromat(self, data_string): - return data_string or '' - def disabled_button(self): return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' @@ -101,7 +63,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) > environment.ULTMARC_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/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py index a97956fd..0cb0123d 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -21,6 +21,12 @@ class UltmarcDoctorViewModel(BaseModel): 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 is_input_pagination_pageNumber(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_pageNumber or 1 + # 医師コード def is_input_dcf_pcf_dr_cd(self): if not self.is_form_submitted(): @@ -102,7 +108,7 @@ class UltmarcDoctorViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + 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 index 7caad57b..4244bef4 100644 --- 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 @@ -17,171 +17,30 @@ class UltmarcInstInfoViewModel(BaseModel): post_cnt: Optional[int] page_num: Optional[int] - # 施設コード - def is_input_dcf_dsf_inst_cd(self): - return self.inst_info_data.dcf_dsf_inst_cd or '' - # 未確認 def is_checked_unconf_flg(self): return 'checked' if self.inst_info_data.unconf_flg == '1' else '' - # 施設コード変換先 - def is_input_dup_opp_cd(self): - return self.inst_info_data.dup_opp_cd or '' - - # 休院店開始年月 - def is_input_close_start_ym(self): - return self.inst_info_data.close_start_ym or '' - # 休院店 def is_checked_close_flg(self): return 'checked' if self.inst_info_data.close_flg == '1' else '' - # 削除予定理由 - def is_input_delete_sche_reason_cd(self): - return self.inst_info_data.delete_sche_reason_cd or '' - - def is_input_delete_sche_reason(self): - return self.inst_info_data.delete_sche_reason or '' - - # 削除日 - def is_input_abolish_ymd(self): - return self.inst_info_data.abolish_ymd or '' - - # 開業予定年月 - def is_input_estab_sche_ym(self): - return self.inst_info_data.estab_sche_ym or '' - # 開業 def is_checked_estab_sche_flg(self): return 'checked' if self.inst_info_data.estab_sche_flg == '1' else '' - # 正式施設名(カナ) - def is_input_form_inst_name_kana(self): - return self.inst_info_data.form_inst_name_kana or '' - - # 正式施設名(漢字) - def is_input_form_inst_name_kanji(self): - return self.inst_info_data.form_inst_name_kanji or '' - - # 略式施設名(カナ) - def is_input_inst_name_kana(self): - return self.inst_info_data.inst_name_kana or '' - - # 施設区分名 - def is_input_inst_div_name(self): - return self.inst_info_data.inst_div_name or '' - - # 略式施設名(漢字) - def is_input_inst_name_kanji(self): - return self.inst_info_data.inst_name_kanji or '' - - # 経営体 - def is_input_manage_cd(self): - return self.inst_info_data.manage_cd or '' - - def is_input_manage_name(self): - return self.inst_info_data.manage_name or '' - - # 郵便番号 - def is_input_postal_number(self): - return self.inst_info_data.postal_number or '' - # 住所不明 def is_checked_addr_unknown_reason_cd(self): return 'checked' if self.inst_info_data.addr_unknown_reason_cd else '' - # 施設電話番号 - def is_input_inst_phone_number(self): - return self.inst_info_data.inst_phone_number or '' - # 開業 def is_checked_phone_number_non_flg(self): return 'checked' if self.inst_info_data.phone_number_non_flg == '1' else '' - # 住所(カナ) - def is_input_inst_addr_kana(self): - return self.inst_info_data.inst_addr_kana or '' - - # 住所(漢字) - def is_input_inst_addr(self): - return self.inst_info_data.inst_addr or '' - - # 病院種別 - def is_input_hp_assrt_name(self): - return self.inst_info_data.hp_assrt_name or '' - # 再審査区分 def is_checked_re_exam_cd(self): return 'checked' if self.inst_info_data.re_exam_cd else '' - # 関連大学親名 - def is_input_rltd_univ_prnt_cd(self): - return self.inst_info_data.rltd_univ_prnt_cd or '' - - def is_input_parent_name(self): - return self.inst_info_data.parent_name or '' - - # 微生物 - def is_input_insp_item_micrb(self): - return self.inst_info_data.insp_item_micrb or '' - - # 血清 - def is_input_insp_item_serum(self): - return self.inst_info_data.insp_item_serum or '' - - # 血液 - def is_input_insp_item_blood(self): - return self.inst_info_data.insp_item_blood or '' - - # 病理 - def is_input_insp_item_patho(self): - return self.inst_info_data.insp_item_patho or '' - - # 寄生虫 - def is_input_insp_item_paras(self): - return self.inst_info_data.insp_item_paras or '' - - # 生化 - def is_input_insp_item_biochem(self): - return self.inst_info_data.insp_item_biochem or '' - - # RI - def is_input_insp_item_ri(self): - return self.inst_info_data.insp_item_ri or '' - - # 特務医務室 - def is_input_dcf_prnt_inst_cd(self): - return self.inst_info_data.dcf_prnt_inst_cd or '' - - # 一般 - def is_input_prmit_bed_num_gen(self): - return self.inst_info_data.prmit_bed_num_gen or '' - - # 療養 - def is_input_prmit_bed_num_rcup(self): - return self.inst_info_data.prmit_bed_num_rcup or '' - - # 精神 - def is_input_prmit_bed_num_mental(self): - return self.inst_info_data.prmit_bed_num_mental or '' - - # 感染症 - def is_input_prmit_bed_num_infection(self): - return self.inst_info_data.prmit_bed_num_infection or '' - - # 結核 - def is_input_prmit_bed_num_tuber(self): - return self.inst_info_data.prmit_bed_num_tuber or '' - - # その他 - def is_input_prmit_bed_num_other(self): - return self.inst_info_data.prmit_bed_num_other or '' - - # 合計 - def is_input_prmit_bed_num_sum(self): - return self.inst_info_data.prmit_bed_num_sum or '' - # 病棟閉鎖   def is_checked_ward_abolish_flg(self): return 'checked' if self.inst_info_data.ward_abolish_flg == '1' else '' @@ -190,26 +49,6 @@ class UltmarcInstInfoViewModel(BaseModel): def is_checked_ward_abolish_flg_part(self): return 'checked' if self.inst_info_data.ward_abolish_flg == '2' else '' - # 病床数(定員) - def is_input_bed_num(self): - return self.inst_info_data.bed_num or '' - - # メンテ年月日 - def is_input_prmit_bed_maint_ymd(self): - return self.inst_info_data.prmit_bed_maint_ymd or '' - - # 代表者個人コード - def is_input_inst_repre_cd(self): - return self.inst_info_data.inst_repre_cd or '' - - # 施設代表者(カナ) - def is_input_inst_repre_kana(self): - return self.inst_info_data.inst_repre_kana or '' - - # 施設代表者(漢字) - def is_input_inst_repre(self): - return self.inst_info_data.inst_repre or '' - # 修正年月日 def is_input_sys_update_date(self): sys_update_date = str(self.inst_info_data.sys_update_date) @@ -239,9 +78,6 @@ class UltmarcInstInfoViewModel(BaseModel): return 0 return len(self.inst_trt_coursed_data) - def is_data_string_empty_fromat(self, data_string): - return data_string or '' - def disabled_button(self): return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' @@ -252,4 +88,4 @@ class UltmarcInstInfoViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + 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 index f98794d3..6215f8bf 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -6,7 +6,7 @@ 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 UltmarcInstModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.system_var import environment @@ -16,13 +16,19 @@ class UltmarcInstViewModel(BaseModel): prefc_models: list[PrefcMasterModel] inst_div_models: list[InstDivMasterModel] inst_data: Optional[list[UltmarcInstDBModel]] = [] - form_data: Optional[UltmarcInstModel] + 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 is_input_pagination_pageNumber(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_pageNumber or 1 + # ULT施設コード def is_input_dcf_dsf_inst_cd(self): if not self.is_form_submitted(): @@ -102,7 +108,7 @@ class UltmarcInstViewModel(BaseModel): return len(self.inst_data) == 0 def is_data_overflow_max_length(self): - return len(self.inst_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + 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 '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py index 2ceebd0a..95e8605c 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -2,7 +2,7 @@ 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 UltmarcInstModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -30,11 +30,11 @@ class UltmarcInstRepository(BaseRepository): \ """ - def fetch_many(self, parameter: UltmarcInstModel) -> list[UltmarcInstDBModel]: + def fetch_many(self, parameter: UltmarcInstSearchModel) -> list[UltmarcInstDBModel]: try: self._database.connect() # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 - clone_parameter = UltmarcInstModel(**parameter.dict()) + 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()) @@ -48,7 +48,7 @@ class UltmarcInstRepository(BaseRepository): finally: self._database.disconnect() - def __build_condition(self, parameter: UltmarcInstModel): + def __build_condition(self, parameter: UltmarcInstSearchModel): where_clauses: list[SQLCondition] = [] # ULT施設コード diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 44f99cda..5c441421 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -1,7 +1,6 @@ from src.aws.aws_api_client import AWSAPIClient -from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel -from src.model.request.ultmarc_inst import UltmarcInstModel +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 @@ -66,10 +65,13 @@ class UltmarcViewService(BaseService): 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_view( - self, - session: UserSession + ######################### + # アルトマーク医師 # + ######################### + def prepare_ultmarc_doctor_search_view( + self ) -> UltmarcDoctorViewModel: + # 医師一覧画面の表示データ取得 # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() @@ -78,58 +80,15 @@ class UltmarcViewService(BaseService): ) return ultmarc - def ultmarc_inst_view( - self, - session: UserSession - ) -> 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: UltmarcInstModel): - # 施設データを検索 - ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) - return ultmarc_inst_data - - def info_ultmarc_inst_view( - self, - id, - session: UserSession - ) -> 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 - 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 info_ultmarc_doctor_view( + def prepare_ultmarc_doctor_info_view( self, - id, - session: UserSession + id ) -> UltmarcDoctorInfoViewModel: - # 医師情報画面の表示データ取得 # 医師情報を取得 doctor_info = self.ultmarc_doctor_repository.fetch_one(id) @@ -153,3 +112,45 @@ class UltmarcViewService(BaseService): 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/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index 91b661b3..c5bf66ef 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -19,7 +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']) -UTL_SEARCH_RESULT_MAX_COUNT = int(os.environ['UTL_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/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 2ab9b7cb..32ca883a 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -176,7 +176,7 @@ {% if bio.is_form_submitted() and bio.is_data_overflow_max_length() %}
- 検索件数が500件を超えています 検索項目を見直してください + 検索結果が最大件数を超えました。検索条件を見直しして下さい。
{% endif %} {% if bio.is_form_submitted() and bio.is_data_empty() %} diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 1a40192b..ca70b292 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -84,30 +84,30 @@ 医師コード: - + 氏名(漢字): - + 氏名(カナ): - + 性別: - + 生年月日: 出身大学: - + 出身県: - + 卒年: - + 登録年: - + 開業年: - + @@ -141,8 +141,8 @@ {% for sosiety_data in ultmarc.sosiety_data %} - {{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}} - {{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_name)}} + {{sosiety_data.sosiety_cd or ''}} + {{sosiety_data.sosiety_name or ''}} {% endfor %} @@ -162,8 +162,8 @@ {% for specialist_license_data in ultmarc.specialist_license_data %} - {{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_cd)}} - {{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_license_name)}} + {{specialist_license_data.specialist_cd or ''}} + {{specialist_license_data.specialist_license_name or ''}} {% endfor %} @@ -176,7 +176,7 @@

勤務先履歴

- +
@@ -196,31 +196,30 @@ {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} - {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} + {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} - - - - - - + + + + + + {% endif %} {% endfor %} {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} - {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd) != ''%} + {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} - - - - - - - + + + + + + + {% endif %} {% endfor %} diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 3d532374..1654f1eb 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -111,11 +111,12 @@ - + + @@ -140,7 +141,7 @@
ULT施設コード
- {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_data.aply_start_ymd)}} + {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_data.inst_name_kanji or ''}}{{doctor_wrkplace_data.blng_sec_name or ''}}{{doctor_wrkplace_data.univ_post_name or ''}}{{doctor_wrkplace_data.post_name or ''}}{{doctor_wrkplace_data.aply_start_ymd or ''}} 9999/99/99
- {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}} - {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_end_ymd)}} + {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_his_data.inst_name_kanji or ''}}{{doctor_wrkplace_his_data.blng_sec_name or ''}}{{doctor_wrkplace_his_data.univ_post_name or ''}}{{doctor_wrkplace_his_data.post_name or ''}}{{doctor_wrkplace_his_data.aply_start_ymd or ''}}{{doctor_wrkplace_his_data.aply_end_ymd or ''}}
{% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %}
- 検索結果が最大件数を超えました。検索条件を見直しして下さい。 + 検索件数が500件を超えています 検索項目を見直してください
{% endif %} {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} @@ -157,14 +158,15 @@ - + diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index e630b9d8..5ac6c003 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -15,7 +15,7 @@ } - + @@ -37,7 +37,7 @@ ULT施設コード: - 施設区分: @@ -56,22 +56,22 @@ ULT施設名(漢字): - ULT施設名(かな・カナ): - 郵便番号: - 電話番号: - @@ -83,7 +83,7 @@ {% for prefc in ultmarc.prefc_models %} - @@ -91,14 +91,14 @@ - ULT施設住所: - @@ -116,7 +116,7 @@ - + @@ -152,7 +152,7 @@
- + \ No newline at end of file From 3b2362442d130853af51cbda8c1d5cf876262310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 22 Jun 2023 10:34:14 +0900 Subject: [PATCH 394/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93NG=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/sales_results_laundering.py | 2 +- rds_mysql/stored_procedure/src05/sales_lau_upsert.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 index 04d0dcaa..530fd9b9 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -141,7 +141,7 @@ def _count_inst_merge_t(db: Database) -> int: try: sql = """ SELECT - COUNT(dcf_inst_cd) AS cnt + COUNT(dcf_dsf_inst_cd) AS cnt FROM internal05.inst_merge_t """ diff --git a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql index 182c3b3a..63049f09 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -138,7 +138,7 @@ BEGIN ); SET @extract_from_datetime = CAST(extract_from_date AS DATETIME); - SET @extract_to_datetime = CAST(extract_to_date AS DATETIME); + SET @extract_to_datetime = ADDTIME(CAST(extract_to_date AS DATETIME), '23:59:59'); SET @upsert_sales_launderning = " INSERT INTO From 7f82cc9e48208adf765802b08590c89f1c78ccbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 23 Jun 2023 14:20:48 +0900 Subject: [PATCH 395/962] =?UTF-8?q?=E7=92=B0=E5=A2=83=E6=A7=8B=E7=AF=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/.dockerignore | 12 + ecs/jskult-batch-monthly/.env.example | 22 + ecs/jskult-batch-monthly/.gitignore | 10 + ecs/jskult-batch-monthly/.vscode/launch.json | 16 + .../.vscode/recommended_settings.json | 31 ++ ecs/jskult-batch-monthly/Dockerfile | 20 + ecs/jskult-batch-monthly/Pipfile | 26 ++ ecs/jskult-batch-monthly/Pipfile.lock | 387 ++++++++++++++++++ ecs/jskult-batch-monthly/README.md | 48 +++ ecs/jskult-batch-monthly/entrypoint.py | 10 + ecs/jskult-batch-monthly/src/__init__.py | 0 ecs/jskult-batch-monthly/src/aws/__init__.py | 0 ecs/jskult-batch-monthly/src/aws/s3.py | 98 +++++ .../src/batch/batch_functions.py | 101 +++++ .../src/batch/common/__init__.py | 0 .../src/batch/common/batch_context.py | 37 ++ .../src/batch/common/calendar_file.py | 32 ++ .../src/batch/parallel_processes.py | 32 ++ ecs/jskult-batch-monthly/src/db/__init__.py | 0 ecs/jskult-batch-monthly/src/db/database.py | 178 ++++++++ .../src/error/__init__.py | 0 .../src/error/exceptions.py | 10 + .../src/jobctrl_monthly.py | 88 ++++ .../src/logging/get_logger.py | 37 ++ .../src/system_var/__init__.py | 0 .../src/system_var/constants.py | 17 + .../src/system_var/environment.py | 25 ++ .../src/time/elapsed_time.py | 22 + .../calendar/jskult_arisj_output_day_list.txt | 100 +++++ 29 files changed, 1359 insertions(+) create mode 100644 ecs/jskult-batch-monthly/.dockerignore create mode 100644 ecs/jskult-batch-monthly/.env.example create mode 100644 ecs/jskult-batch-monthly/.gitignore create mode 100644 ecs/jskult-batch-monthly/.vscode/launch.json create mode 100644 ecs/jskult-batch-monthly/.vscode/recommended_settings.json create mode 100644 ecs/jskult-batch-monthly/Dockerfile create mode 100644 ecs/jskult-batch-monthly/Pipfile create mode 100644 ecs/jskult-batch-monthly/Pipfile.lock create mode 100644 ecs/jskult-batch-monthly/README.md create mode 100644 ecs/jskult-batch-monthly/entrypoint.py create mode 100644 ecs/jskult-batch-monthly/src/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/aws/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/aws/s3.py create mode 100644 ecs/jskult-batch-monthly/src/batch/batch_functions.py create mode 100644 ecs/jskult-batch-monthly/src/batch/common/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/batch/common/batch_context.py create mode 100644 ecs/jskult-batch-monthly/src/batch/common/calendar_file.py create mode 100644 ecs/jskult-batch-monthly/src/batch/parallel_processes.py create mode 100644 ecs/jskult-batch-monthly/src/db/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/db/database.py create mode 100644 ecs/jskult-batch-monthly/src/error/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/error/exceptions.py create mode 100644 ecs/jskult-batch-monthly/src/jobctrl_monthly.py create mode 100644 ecs/jskult-batch-monthly/src/logging/get_logger.py create mode 100644 ecs/jskult-batch-monthly/src/system_var/__init__.py create mode 100644 ecs/jskult-batch-monthly/src/system_var/constants.py create mode 100644 ecs/jskult-batch-monthly/src/system_var/environment.py create mode 100644 ecs/jskult-batch-monthly/src/time/elapsed_time.py create mode 100644 s3/config/jskult/calendar/jskult_arisj_output_day_list.txt diff --git a/ecs/jskult-batch-monthly/.dockerignore b/ecs/jskult-batch-monthly/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-batch-monthly/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-batch-monthly/.env.example b/ecs/jskult-batch-monthly/.env.example new file mode 100644 index 00000000..19a3f19f --- /dev/null +++ b/ecs/jskult-batch-monthly/.env.example @@ -0,0 +1,22 @@ +DB_HOST=************ +DB_PORT=************ +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 +LOG_LEVEL=INFO +ULTMARC_DATA_BUCKET=**************** +ULTMARC_DATA_FOLDER=recv +JSKULT_BACKUP_BUCKET=**************** +ULTMARC_BACKUP_FOLDER=ultmarc +JSKULT_CONFIG_BUCKET=********************** +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt +ARISJ_DATA_BUCKET=********** +LOG_LEVEL=************** +ARISJ_BACKUP_FOLDER=************** +JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME=jskult_arisj_output_day_list.txt +DB_CONNECTION_MAX_RETRY_ATTEMPT=************** +DB_CONNECTION_RETRY_INTERVAL_INIT=************** +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************** +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************* +VJSK_DATA_BUCKET=************* \ No newline at end of file diff --git a/ecs/jskult-batch-monthly/.gitignore b/ecs/jskult-batch-monthly/.gitignore new file mode 100644 index 00000000..bd0b37f8 --- /dev/null +++ b/ecs/jskult-batch-monthly/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-batch-monthly/.vscode/launch.json b/ecs/jskult-batch-monthly/.vscode/launch.json new file mode 100644 index 00000000..e0267567 --- /dev/null +++ b/ecs/jskult-batch-monthly/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG)jskult batch monthly", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-batch-monthly/.vscode/recommended_settings.json b/ecs/jskult-batch-monthly/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-batch-monthly/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-batch-monthly/Dockerfile b/ecs/jskult-batch-monthly/Dockerfile new file mode 100644 index 00000000..dd891d48 --- /dev/null +++ b/ecs/jskult-batch-monthly/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-batch-monthly/Pipfile b/ecs/jskult-batch-monthly/Pipfile new file mode 100644 index 00000000..24e5efcd --- /dev/null +++ b/ecs/jskult-batch-monthly/Pipfile @@ -0,0 +1,26 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[scripts] +"test:ultmarc" = "pytest tests/batch/ultmarc/" +"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" + +[packages] +boto3 = "*" +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" +pytest = "*" +pytest-cov = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-batch-monthly/Pipfile.lock b/ecs/jskult-batch-monthly/Pipfile.lock new file mode 100644 index 00000000..3e58b727 --- /dev/null +++ b/ecs/jskult-batch-monthly/Pipfile.lock @@ -0,0 +1,387 @@ +{ + "_meta": { + "hash": { + "sha256": "0b1dbc40a5069476aa66f172175ae24ffae385c335ff8e4794c1b25a111b9e43" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "boto3": { + "hashes": [ + "sha256:7694df61bd6d253d6d9db34adbcd218b8efbe7f894a4a51611f7e0587ae33218", + "sha256:fe49f91e057b241b23a58c74c2f22654216788052ce95b73439fdb18bfd0e155" + ], + "index": "pypi", + "version": "==1.26.159" + }, + "botocore": { + "hashes": [ + "sha256:86fe4641fd32dc6a5be4a289e00dc180448fc7bc37abac21bd624656985eef62", + "sha256:da1c61757d466b82cc89f379a50662064bcb0beb67cc6efa1fbfc9a341bd08b0" + ], + "markers": "python_version >= '3.7'", + "version": "==1.29.159" + }, + "greenlet": { + "hashes": [ + "sha256:0a9dfcadc1d79696e90ccb1275c30ad4ec5fd3d1ab3ae6671286fac78ef33435", + "sha256:0f313771cb8ee0a04dfdf586b7d4076180d80c94be09049daeea018089b5b957", + "sha256:17503397bf6cbb5e364217143b6150c540020c51a3f6b08f9a20cd67c25e2ca8", + "sha256:180ec55cb127bc745669eddc9793ffab6e0cf7311e67e1592f183d6ca00d88c1", + "sha256:1b3f3568478bc21b85968e8038c4f98f4bf0039a692791bc324b5e0d1522f4b1", + "sha256:1bd4ea36f0aeb14ca335e0c9594a5aaefa1ac4e2db7d86ba38f0be96166b3102", + "sha256:21ebcb570e0d8501457d6a2695a44c5af3b6c2143dc6644ec73574beba067c90", + "sha256:24071eee113d75fedebaeb86264d94f04b5a24e311c5ba3e8003c07d00112a7e", + "sha256:270432cfdd6a50016b8259b3bbf398a3f7c06a06f2c68c7b93e49f53bc193bcf", + "sha256:271ed380389d2f7e4c1545b6e0837986e62504ab561edbaff05da9c9f3f98f96", + "sha256:2840187a94e258445e62ff1545e34f0b1a14aef4d0078e5c88246688d2b6515e", + "sha256:2cda110faee67613fed221f90467003f477088ef1cc84c8fc88537785a5b4de9", + "sha256:2e160a65cc6023a237be870f2072513747d512a1d018efa083acce0b673cccc0", + "sha256:2fcf7af83516db35af3d0ed5d182dea8585eddd891977adff1b74212f4bfd2fd", + "sha256:36cebce1f30964d5672fd956860e7e7b69772da69658d5743cb676b442eeff36", + "sha256:42bfe67824a9b53e73f568f982f0d1d4c7ac0f587d2e702a23f8a7b505d7b7c2", + "sha256:450a7e52a515402fd110ba807f1a7d464424bfa703be4effbcb97e1dfbfcc621", + "sha256:463d63ca5d8c236788284a9a44b9715372a64d5318a6b5eee36815df1ea0ba3d", + "sha256:4d0c0ffd732466ff324ced144fad55ed5deca36f6036c1d8f04cec69b084c9d6", + "sha256:4ff2a765f4861fc018827eab4df1992f7508d06c62de5d2fe8a6ac2233d4f1d0", + "sha256:53abf19b7dc62795c67b8d0a3d8ef866db166b21017632fff2624cf8fbf3481c", + "sha256:5552d7be37d878e9b6359bbffa0512d857bb9703616a4c0656b49c10739d5971", + "sha256:585810056a8adacd3152945ebfcd25deb58335d41f16ae4e0f3d768918957f9a", + "sha256:5942b1d6ba447cff1ec23a21ec525dde2288f00464950bc647f4e0f03bd537d1", + "sha256:5c355c99be5bb23e85d899b059a4f22fdf8a0741c57e7029425ee63eb436f689", + "sha256:5f61df4fe07864561f49b45c8bd4d2c42e3f03d2872ed05c844902a58b875028", + "sha256:665942d3a954c3e4c976581715f57fb3b86f4cf6bae3ac30b133f8ff777ac6c7", + "sha256:68368e908f14887fb202a81960bfbe3a02d97e6d3fa62b821556463084ffb131", + "sha256:6aac94ff957b5dea0216af71ab59c602e1b947b394e4f5e878a5a65643090038", + "sha256:889934aa8d72b6bfc46babd1dc4b817a56c97ec0f4a10ae7551fb60ab1f96fae", + "sha256:a00550757fca1b9cbc479f8eb1cf3514dbc0103b3f76eae46341c26ddcca67a9", + "sha256:a4a2d6ed0515c05afd5cc435361ced0baabd9ba4536ddfe8ad9a95bcb702c8ce", + "sha256:a8dd92fd76a61af2abc8ccad0c6c6069b3c4ebd4727ecc9a7c33aae37651c8c7", + "sha256:ab81f9ff3e3c2ca65e824454214c10985a846cd9bee5f4d04e15cd875d9fe13b", + "sha256:ac10196b8cde7a082e4e371ff171407270d3337c8d57ed43030094eb01d9c95c", + "sha256:b767930af686551dc96a5eb70af3736709d547ffa275c11a5e820bfb3ae61d8d", + "sha256:b9a1f4d256b81f59ba87bb7a29b9b38b1c018e052dba60a543cb0ddb5062d159", + "sha256:ba94c08321b5d345100fc64eb1ab235f42faf9aabba805cface55ebe677f1c2c", + "sha256:bab71f73001cd15723c4e2ca398f2f48e0a3f584c619eefddb1525e8986e06eb", + "sha256:bce5cf2b0f0b29680396c5c98ab39a011bd70f2dfa8b8a6811a69ee6d920cf9f", + "sha256:c02e514c72e745e49a3ae7e672a1018ba9b68460c21e0361054e956e5d595bc6", + "sha256:c3fb459ced6c5e3b2a895f23f1400f93e9b24d85c30fbe2d637d4f7706a1116b", + "sha256:cd31ab223e43ac64fd23f8f5dad249addadac2a459f040546200acbf7e84e353", + "sha256:ce70aa089ec589b5d5fab388af9f8c9f9dfe8fe4ad844820a92eb240d8628ddf", + "sha256:d47b2e1ad1429da9aa459ef189fbcd8a74ec28a16bc4c3f5f3cf3f88e36535eb", + "sha256:d61bad421c1f496f9fb6114dbd7c30a1dac0e9ff90e9be06f4472cbd8f7a1704", + "sha256:d7ba2e5cb119eddbc10874b41047ad99525e39e397f7aef500e6da0d6f46ab91", + "sha256:dde0ab052c7a1deee8d13d72c37f2afecee30ebdf6eb139790157eaddf04dd61", + "sha256:df34b52aa50a38d7a79f3abc9fda7e400791447aa0400ed895f275f6d8b0bb1f", + "sha256:e0fc20e6e6b298861035a5fc5dcf9fbaa0546318e8bda81112591861a7dcc28f", + "sha256:e20d5e8dc76b73db9280464d6e81bea05e51a99f4d4dd29c5f78dc79f294a5d3", + "sha256:e31d1a33dc9006b278f72cb0aacfe397606c2693aa2fdc0c2f2dcddbad9e0b53", + "sha256:e3a99f890f2cc5535e1b3a90049c6ca9ff9da9ec251cc130c8d269997f9d32ee", + "sha256:e7b192c3df761d0fdd17c2d42d41c28460f124f5922e8bd524018f1d35610682", + "sha256:ed0f4fad4c3656e34d20323a789b6a2d210a6bb82647d9c86dded372f55c58a1", + "sha256:f34ec09702be907727fd479046193725441aaaf7ed4636ca042734f469bb7451", + "sha256:f3530c0ec1fc98c43d5b7061781a8c55bd0db44f789f8152e19d9526cbed6021", + "sha256:f5672082576d0e9f52fa0fa732ff57254d65faeb4a471bc339fe54b58b3e79d2", + "sha256:ffb9f8969789771e95d3c982a36be81f0adfaa7302a1d56e29f168ca15e284b8" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.0a1" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "pymysql": { + "hashes": [ + "sha256:766b72e4370aba94e6266a4dbd62c51fbc6a894c38de25a41a8a01f0461a2387", + "sha256:aade29b861e81a3c68a9e90d43f3db257940c0208983a0128b82f1a4cef639aa" + ], + "index": "pypi", + "version": "==1.1.0rc2" + }, + "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" + }, + "s3transfer": { + "hashes": [ + "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", + "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.1" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256: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.16" + }, + "tenacity": { + "hashes": [ + "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", + "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" + ], + "index": "pypi", + "version": "==8.2.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:16224afa8cc2b3679dd9e9a1efe719dd2e20a03f0cc2e4cc4c97870ae9622532", + "sha256:3c2c2cd887648efa0ea8f8ba4260a1213058e8e4a25a6a6f4e084740b2c858e2" + ], + "markers": "python_version >= '3.7'", + "version": "==4.7.0rc1" + }, + "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" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, + "coverage": { + "extras": [ + "toml" + ], + "hashes": [ + "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.7" + }, + "exceptiongroup": { + "hashes": [ + "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", + "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + ], + "markers": "python_version < '3.11'", + "version": "==1.1.1" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pluggy": { + "hashes": [ + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "pytest": { + "hashes": [ + "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295", + "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b" + ], + "index": "pypi", + "version": "==7.3.2" + }, + "pytest-cov": { + "hashes": [ + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" + ], + "index": "pypi", + "version": "==4.1.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-batch-monthly/README.md b/ecs/jskult-batch-monthly/README.md new file mode 100644 index 00000000..acf096d2 --- /dev/null +++ b/ecs/jskult-batch-monthly/README.md @@ -0,0 +1,48 @@ +# 実消化&アルトマーク 月次バッチ + +## 概要 + +実消化&アルトマークの月次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_daily.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/jskult-batch-monthly/entrypoint.py b/ecs/jskult-batch-monthly/entrypoint.py new file mode 100644 index 00000000..191d0eae --- /dev/null +++ b/ecs/jskult-batch-monthly/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチのエントリーポイント""" +from src import jobctrl_monthly + +if __name__ == '__main__': + try: + exit(jobctrl_monthly.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-batch-monthly/src/__init__.py b/ecs/jskult-batch-monthly/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/aws/__init__.py b/ecs/jskult-batch-monthly/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/aws/s3.py b/ecs/jskult-batch-monthly/src/aws/s3.py new file mode 100644 index 00000000..847f5bad --- /dev/null +++ b/ecs/jskult-batch-monthly/src/aws/s3.py @@ -0,0 +1,98 @@ +import os.path as path +import tempfile + +import boto3 + +from src.system_var import environment + + +class S3Client: + __s3_client = boto3.client('s3') + _bucket_name: str + + def list_objects(self, bucket_name: str, folder_name: str): + response = self.__s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_name) + if response['KeyCount'] == 0: + return [] + contents = response['Contents'] + # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする + objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')] + return objects + + def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None: + copy_source = {'Bucket': src_bucket, 'Key': src_key} + self.__s3_client.copy(copy_source, dest_bucket, dest_key) + return + + def download_file(self, bucket_name: str, file_key: str, file): + self.__s3_client.download_fileobj( + Bucket=bucket_name, + Key=file_key, + Fileobj=file + ) + return + + def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): + self.__s3_client.upload_file( + local_file_path, + Bucket=bucket_name, + Key=file_key + ) + + def delete_file(self, bucket_name: str, file_key: str): + self.__s3_client.delete_object( + Bucket=bucket_name, + Key=file_key + ) + + +class S3Bucket(): + _s3_client = S3Client() + _bucket_name: str = None + + +class UltmarcBucket(S3Bucket): + _bucket_name = environment.ULTMARC_DATA_BUCKET + _folder = environment.ULTMARC_DATA_FOLDER + + def list_dat_file(self): + return self._s3_client.list_objects(self._bucket_name, self._folder) + + def download_dat_file(self, dat_filename: str): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, f'{dat_filename.replace(f"{self._folder}/", "")}') + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, dat_filename, f) + f.seek(0) + return temporary_file_path + + def backup_dat_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + ultmarc_backup_bucket = UltmarcBackupBucket() + backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key) + # コピー元のファイルを削除 + self._s3_client.delete_file(self._bucket_name, dat_file_key) + + +class ConfigBucket(S3Bucket): + _bucket_name = environment.JSKULT_CONFIG_BUCKET + + def download_arisj_output_day_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME) + arisj_output_day_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, arisj_output_day_list_key, f) + f.seek(0) + return temporary_file_path + + +class JskUltBackupBucket(S3Bucket): + _bucket_name = environment.JSKULT_BACKUP_BUCKET + + +class UltmarcBackupBucket(JskUltBackupBucket): + _folder = environment.ULTMARC_BACKUP_FOLDER diff --git a/ecs/jskult-batch-monthly/src/batch/batch_functions.py b/ecs/jskult-batch-monthly/src/batch/batch_functions.py new file mode 100644 index 00000000..27aac450 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/batch_functions.py @@ -0,0 +1,101 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap +from datetime import datetime + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants + + +def get_batch_statuses() -> tuple[str, str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - dump取得状況区分 + - 処理日(YYYY/MM/DD) + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ、dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + syor_date = hdke_tbl_record['syor_date'] + # 処理日を文字列に変換する + syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') + + return batch_processing_flag, dump_status_kbn, syor_date_str + + +def update_batch_processing_flag_in_processing() -> None: + """バッチ処理中フラグを処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = 'UPDATE src05.hdke_tbl SET bch_actf = :in_processing' + try: + db.connect() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_batch_process_complete() -> None: + """バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + bch_actf = :batch_complete, + dump_sts_kbn = :dump_unprocessed, + syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d') -- +1日 + """ + try: + db.connect() + db.execute(sql, { + 'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED, + 'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-batch-monthly/src/batch/common/__init__.py b/ecs/jskult-batch-monthly/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/batch/common/batch_context.py b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py new file mode 100644 index 00000000..8b76415a --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py @@ -0,0 +1,37 @@ +class BatchContext: + __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) + __is_not_business_monthly: bool # 月次バッチ起動日フラグ + + def __init__(self) -> None: + self.__is_not_business_monthly = False + + @classmethod + def get_instance(cls): + if cls.__instance is None: + cls.__instance = cls() + return cls.__instance + + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + + @property + def is_not_business_monthly(self): + return self.__is_not_business_monthly + + @is_not_business_monthly.setter + def is_not_business_monthly(self, flag: bool): + self.__is_not_business_monthly = flag + + @property + def is_ultmarc_imported(self): + return self.__is_ultmarc_imported + + @is_ultmarc_imported.setter + def is_ultmarc_imported(self, flag: bool): + self.__is_ultmarc_imported = flag diff --git a/ecs/jskult-batch-monthly/src/batch/common/calendar_file.py b/ecs/jskult-batch-monthly/src/batch/common/calendar_file.py new file mode 100644 index 00000000..b456f03c --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/common/calendar_file.py @@ -0,0 +1,32 @@ +from src.system_var import constants + + +class CalendarFile: + """カレンダーファイル""" + + __calendar_file_lines: list[str] + + def __init__(self, calendar_file_path): + with open(calendar_file_path) as f: + self.__calendar_file_lines: list[str] = f.readlines() + + def compare_date(self, date_str: str) -> bool: + """与えられた日付がカレンダーファイル内に含まれているかどうか + カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提 + コメント(#)が含まれている行は無視される + + Args: + date_str (str): yyyy/mm/dd文字列 + + Returns: + bool: 含まれていればTrue + """ + for calendar_date in self.__calendar_file_lines: + # コメント行が含まれている場合はスキップ + if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: + continue + + if date_str in calendar_date: + return True + + return False diff --git a/ecs/jskult-batch-monthly/src/batch/parallel_processes.py b/ecs/jskult-batch-monthly/src/batch/parallel_processes.py new file mode 100644 index 00000000..0fb2d715 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/parallel_processes.py @@ -0,0 +1,32 @@ +"""並列処理""" + +import concurrent.futures + +from src.batch.bio_sales import create_bio_sales_lot +from src.batch.laundering import sales_laundering +from src.error.exceptions import BatchOperationException + + +def exec(): + # 並列処理を開始 + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + + # 実績更新 + future_sales_laundering = executor.submit(sales_laundering.exec) + # 生物由来ロット分解 + future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec) + + # 両方の処理が完了するまで待つ + concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) + + # エラーがあれば呼び出し元でキャッチする + sales_laundering_exc = future_sales_laundering.exception() + create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() + + # いずれかにエラーが発生していれば、1つのエラーとして返す。 + if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: + sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' + create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' + raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') + + return diff --git a/ecs/jskult-batch-monthly/src/db/__init__.py b/ecs/jskult-batch-monthly/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/db/database.py b/ecs/jskult-batch-monthly/src/db/database.py new file mode 100644 index 00000000..f67a21b9 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/db/database.py @@ -0,0 +1,178 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-batch-monthly/src/error/__init__.py b/ecs/jskult-batch-monthly/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/error/exceptions.py b/ecs/jskult-batch-monthly/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py new file mode 100644 index 00000000..b58c4601 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -0,0 +1,88 @@ +"""実消化&アルトマーク 月次バッチ処理""" + +from src.aws.s3 import ConfigBucket +from src.batch.batch_functions import ( + get_batch_statuses, update_batch_process_complete, + update_batch_processing_flag_in_processing) +from src.batch.common.batch_context import BatchContext +from src.batch.common.calendar_file import CalendarFile +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants + +logger = get_logger('月次処理コントロール') + +# バッチ共通設定を取得 +batch_context = BatchContext.get_instance() + + +def exec(): + try: + logger.info('月次バッチ:開始') + try: + # 月次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() + except BatchOperationException as e: + logger.exception(f'日付テーブル取得(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 月次バッチ処理中の場合、後続の処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('バッチ処理中のため、月次バッチ処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump取得が正常終了していない場合、後続の処理は行わない + if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: + logger.error('dump取得が正常終了していないため、月次バッチ処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + logger.info(f'処理日={syor_date}') + # バッチ共通設定に処理日を追加 + batch_context.syor_date = syor_date + + # 稼働日かかどうかを、実消化&アルトマーク月次バッチ稼働日ファイルをダウンロードして判定 + try: + arisj_output_day_list_file_path = ConfigBucket().download_arisj_output_day_list() + arisj_output_day_calendar = CalendarFile(arisj_output_day_list_file_path) + batch_context.is_not_business_monthly = arisj_output_day_calendar.compare_date(syor_date) + except Exception as e: + logger.exception(f'実消化&アルトマーク月次バッチ稼働日ファイルの読み込みに失敗しました。{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 調査目的でV実消化稼働日かどうかをログ出力 + logger.debug(f'本日は{"実消化&アルトマーク月次バッチ稼働日です。" if batch_context.is_not_business_monthly else "実消化&アルトマーク月次バッチ非稼働日です。"}') + + # バッチ処理中に更新 + try: + update_batch_processing_flag_in_processing() + except BatchOperationException as e: + logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + try: + logger.info('月次バッチ:起動') + # ultmarc_process.exec_import() + logger.info('月次バッチ:終了') + except BatchOperationException as e: + logger.exception(f'月次バッチ処理エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 調査目的で月次バッチが行われたかどうかをログ出力 + logger.debug(f'{"月次バッチが行われました。" if batch_context.is_not_business_monthly else "月次バッチが行われませんでした。"}') + + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 + logger.info('業務日付更新・バッチステータスリフレッシュ:起動') + try: + update_batch_process_complete() + except BatchOperationException as e: + logger.exception(f'業務日付更新・バッチステータスリフレッシュ エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('業務日付更新・バッチステータスリフレッシュ:終了') + + # 正常終了を保守ユーザーに通知 + logger.info('[NOTICE]月次バッチ:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'月次バッチ処理中に想定外のエラーが発生しました {e}') + raise e diff --git a/ecs/jskult-batch-monthly/src/logging/get_logger.py b/ecs/jskult-batch-monthly/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-batch-monthly/src/system_var/__init__.py b/ecs/jskult-batch-monthly/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-monthly/src/system_var/constants.py b/ecs/jskult-batch-monthly/src/system_var/constants.py new file mode 100644 index 00000000..8a0ccbb3 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/system_var/constants.py @@ -0,0 +1,17 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:dump取得正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' + +# カレンダーファイルのコメントシンボル +CALENDAR_COMMENT_SYMBOL = '#' + +# 月曜日(datetime.weekday()で月曜日を表す数字) +WEEKDAY_MONDAY = 0 diff --git a/ecs/jskult-batch-monthly/src/system_var/environment.py b/ecs/jskult-batch-monthly/src/system_var/environment.py new file mode 100644 index 00000000..25afc294 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/system_var/environment.py @@ -0,0 +1,25 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] +ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] +JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] +JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] +JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] +JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') +DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) +DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) diff --git a/ecs/jskult-batch-monthly/src/time/elapsed_time.py b/ecs/jskult-batch-monthly/src/time/elapsed_time.py new file mode 100644 index 00000000..c1432e91 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/time/elapsed_time.py @@ -0,0 +1,22 @@ +import time + + +class ElapsedTime: + """処理実行時間計測クラス""" + def __init__(self) -> None: + """このクラスの新たなインスタンスを初期化します。""" + self.__start = time.perf_counter() + + @property + def of(self): + """インスタンス化してからの経過時間をhh:mm:ssの形式にフォーマットして返す + Returns: + str: 時分秒形式の経過時間 + """ + elapsed_time = time.perf_counter() - self.__start + h, rem = divmod(elapsed_time, 3600) + m, s = divmod(rem, 60) + h_str = f'{h:02.0f} hour ' if h > 0.0 else '' + m_str = f'{m:02.0f} min ' if m > 0.0 else '' + s_str = f'{s:06.02f} sec' if s > 0.0 else '' + return f"{h_str}{m_str}{s_str}" diff --git a/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt b/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt new file mode 100644 index 00000000..2d5f42c0 --- /dev/null +++ b/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt @@ -0,0 +1,100 @@ +2023/06/23 +2023/06/24 +2023/06/25 +2023/06/26 +2023/06/27 +2023/06/28 +2023/06/29 +2023/06/30 +2023/07/01 +2023/07/02 +2023/07/03 +2023/07/04 +2023/07/05 +2023/07/06 +2023/07/07 +2023/07/08 +2023/07/09 +2023/07/10 +2023/07/11 +2023/07/12 +2023/07/13 +2023/07/14 +2023/07/15 +2023/07/16 +2023/07/17 +2023/07/18 +2023/07/19 +2023/07/20 +2023/07/21 +2023/07/22 +2023/07/23 +2023/07/24 +2023/07/25 +2023/07/26 +2023/07/27 +2023/07/28 +2023/07/29 +2023/07/30 +2023/07/31 +2023/08/01 +2023/08/02 +2023/08/03 +2023/08/04 +2023/08/05 +2023/08/06 +2023/08/07 +2023/08/08 +2023/08/09 +2023/08/10 +2023/08/11 +2023/08/12 +2023/08/13 +2023/08/14 +2023/08/15 +2023/08/16 +2023/08/17 +2023/08/18 +2023/08/19 +2023/08/20 +2023/08/21 +2023/08/22 +2023/08/23 +2023/08/24 +2023/08/25 +2023/08/26 +2023/08/27 +2023/08/28 +2023/08/29 +2023/08/30 +2023/08/31 +2023/09/01 +2023/09/02 +2023/09/03 +2023/09/04 +2023/09/05 +2023/09/06 +2023/09/07 +2023/09/08 +2023/09/09 +2023/09/10 +2023/09/11 +2023/09/12 +2023/09/13 +2023/09/14 +2023/09/15 +2023/09/16 +2023/09/17 +2023/09/18 +2023/09/19 +2023/09/20 +2023/09/21 +2023/09/22 +2023/09/23 +2023/09/24 +2023/09/25 +2023/09/26 +2023/09/27 +2023/09/28 +2023/09/29 +2023/09/30 From 9cea113944fc455af73d87e3a019a4c131154e0a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 23 Jun 2023 17:03:43 +0900 Subject: [PATCH 396/962] =?UTF-8?q?fix:=20=E5=8D=98=E4=BD=93=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AE=E4=B8=8D=E5=85=B7=E5=90=88=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=E3=80=82=E6=97=A2=E5=AD=98=E3=81=AE=E3=83=AC=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=82=E3=80=81=E8=A3=BD=E5=93=81=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E3=80=81=E3=83=AD=E3=83=83=E3=83=88=E6=9C=89=E5=8A=B9?= =?UTF-8?q?=E6=9C=9F=E9=99=90=E3=82=92=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/bio_sales/create_bio_sales_lot.py | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) 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 ede7939b..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 @@ -357,16 +357,14 @@ def _set_prd_info_from_v_prd_mst(db: Database): elapsed_time = ElapsedTime() sql = """ UPDATE - src05.bio_sales_lot bio, - src05.phm_prd_mst_v prd + 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 - WHERE - 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' - """ res = db.execute(sql) logging_sql(logger, sql) @@ -384,13 +382,12 @@ def _set_expr_dt_from_lot_num_mst(db: Database): elapsed_time = ElapsedTime() sql = """ UPDATE - src05.bio_sales_lot bio, - src05.lot_num_mst lot + 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 - WHERE - bio.mkr_cd = lot.ser_num - AND bio.rec_lot_num = lot.lot_num """ res = db.execute(sql) logging_sql(logger, sql) From d285a28c9636d3dbee1d81620ad2301a7b7bf412 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 23 Jun 2023 20:03:37 +0900 Subject: [PATCH 397/962] =?UTF-8?q?LOAD=E3=81=AE=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E3=81=AE=E3=83=AF=E3=83=BC=E3=83=8B=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=92=E3=82=AD=E3=83=A3=E3=83=83=E3=83=81=E3=81=97?= =?UTF-8?q?=E3=81=A6=E4=BE=8B=E5=A4=96=E3=81=A7=E8=90=BD=E3=81=A8=E3=81=99?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 17 +++++++++-------- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 61f287c5..f869b983 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -35,17 +35,18 @@ class VjskDataLoadManager: ENCLOSED BY '\"' IGNORE 1 LINES; """ + db.begin() result = db.execute(sql, {"src_file_name": src_file_name}) - logger.debug(sql) - # MEMO : sqlalchemy(engine=pymysql)としたときの result.context.cursor は、engineに依存してクラスが異なる - # https://nds-tyo.backlog.com/view/NEWDWH2021-1006#comment-266127218 - if result.context.cursor._result.warning_count > 0: - result_w = db.execute("SHOW WARNINGS;") - for row in result_w.fetchall(): - logger.info(f"SHOW WARNINGS : {row}") + result_w = db.execute("SHOW WARNINGS;") + has_mysql_warnings = False + for row in result_w.fetchall(): + has_mysql_warnings = True + logger.info(f"SHOW WARNINGS : {row}") + if has_mysql_warnings: raise Exception("LOAD文実行時にWARNINGが発生しました。") - + logger.debug(sql) logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') + db.commit() # org→srcにinsert select db.begin() diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index a5cfd370..2dbe2ef5 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -35,6 +35,7 @@ class TestImportFileToDb: self.db = database self.db.connect() + self.db.execute("set sql_mode = 'TRADITIONAL';") # self.db.begin() # testing From 626ee291c36245e5fc6562f3114c29a0261998a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 26 Jun 2023 08:54:13 +0900 Subject: [PATCH 398/962] =?UTF-8?q?=E4=BD=9C=E6=A5=AD=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/jskult_batch_monthly.py | 236 ++++++++++++++++++ .../src/jobctrl_monthly.py | 5 +- 2 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py diff --git a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py new file mode 100644 index 00000000..3cbecd15 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py @@ -0,0 +1,236 @@ + +from datetime import datetime + +# from src.aws.s3 import UltmarcBucket +# 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.system_var import constants +import pathlib +import os + +logger = get_logger('実消化&アルトマーク月次バッチ') + + +class JskultBathcMonthly(): + """ 実消化&アルトマーク月次バッチ """ + + # WKテーブルの過去分削除SQL + PHYSICAL_NORMAL_DELETE_QUERY = """\ + DELETE FROM src05.wk_inst_aris_if + """ + + # 正常系データを取得しWKテーブルに保存SQL + NORMAL_INSERT_SELECT_QUERY = """\ + INSERT src05.wk_inst_aris_if + SELECT + TRIM(' ' FROM TRIM(' ' FROM SUBSTRIN(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' FROM ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' FROM cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' FROM cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date + ,sysdate() + FROM src05.com_inst ci + LEFT JOIN src05.mst_prefc cp + ON ci.prefc_cd = cp.prefc_cd + LEFT JOIN src05.mst_city cc + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd + LEFT OUTER JOIN src05.JOIN com_inst_div cd + ON ci.inst_div_cd = cd.inst_div_cd + WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' + AND ci.dcf_dsf_inst_cd IS NOT NULL + AND ci.form_inst_name_kanji IS NOT NULL + AND ci.prefc_cd IS NOT NULL + AND cp.prefc_name IS NOT NULL + AND cc.city_name IS NOT NULL + AND ci.inst_addr IS NOT NULL + ORDER BY ci.dcf_dsf_inst_cd + """ + + # 正常系データの件数を取得SQL + NORMAL_COUNT_QUERY = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if + """ + + # 異常系WKテーブルの過去分削除SQL + PHYSICAL_ABNORMAL_DELETE_QUERY = """\ + DELETE FROM src05.wk_inst_aris_if_wrn + """ + + # 異常系データを取得しWKテーブルに保存SQL + ABNORMAL_INSERT_SELECT_QUERY = """\ + INSERT src05.wk_inst_aris_if_wrn + SELECT + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' from ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' from ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' from cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' from ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' from cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' from ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' from ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' from ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date + ,IF(ci.dcf_dsf_inst_cd IS NULL,'bi0402000001', NULL) AS wrnid_dcf_inst_cd + ,IF(ci.form_inst_name_kanji IS NULL,'bi0402000002', NULL) AS wrnid_inst_name_form + ,IF(ci.prefc_cd IS NULL,'bi0402000003', NULL) AS wrnid_pref_cd + ,IF(cp.prefc_name IS NULL,'bi0402000004', NULL) AS wrnid_pref_name + ,IF(cc.city_name IS NULL,'bi0402000005', NULL) AS wrnid_city_name + ,IF(ci.inst_addr IS NULL,'bi0402000006', NULL) AS wrnid_address + ,sysdate() + FROM src05.com_inst ci + LEFT JOIN src05.mst_prefc cp + ON ci.prefc_cd = cp.prefc_cd + LEFT JOIN src05.mst_city cc + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd + LEFT OUTER JOIN src05.com_inst_div cd + ON ci.inst_div_cd = cd.inst_div_cd + WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' + AND( ci.dcf_dsf_inst_cd IS NULL + OR ci.form_inst_name_kanji IS NULL + OR ci.prefc_cd IS NULL + OR cp.prefc_name IS NULL + OR cc.city_name IS NULL + OR ci.inst_addr IS NULL) + ORDER BY ci.dcf_dsf_inst_cd + """ + + # 正常系データの件数を取得SQL + ABNORMAL_COUNT_QUERY = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if_wrn + """ + # CSVファイルの作成用のSQL + SELECT_QUERY = """\ + SELECT dcf_inst_cd, inst_name_form, inst_name, inst_name_kana_form, pref_cd, pref_name, + postal_cd, city_name, address, inst_div_name, phone_no, inst_div_cd, manage_cd, + '', inst_delete_date + FROM src05.wk_inst_aris_if ORDER BY dcf_inst_cd + """ + + aris_log = '/var/log/temporarydwh/' + move_file_path = '/data/mountaris/DATA/' + create_date = datetime.now().strftime('%Y%m%d%H%M%S') + create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + aris_create_csv = f'/home/nds_dwh/tmpcsv/D0004_ARIS_M_DCF_{create_date}csv' + aris_move_csv = f'{move_file_path}D0004_ARIS_M_DCF_{create_date}.csv' + res_log = f'{aris_log}D0004{create_date}.log' + move_res_og = f'{move_file_path}D0004{create_date}log' + prg_id = 'PrgId:BI0402' + head_str = 'TC_HOSPITAL, TJ_HOSPITAL, TJ_HOSPITALSHORT, TK_HOSPITAL, \ + TC_PREFECTURE, TJ_PREFECTURE, TJ_ZIPCODE, TJ_CITY, TJ_ADDRESS, TJ_DEPARTMENT, \ + TJ_TELEPHONENUMBER, TC_HOSPITALCAT, TC_HOSPITALTYPE, TS_UPDATE, TD_UPDATE' + + start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。\n" + dbConnect_err_msg = "MsgID:999999000002 Message:DB接続エラーです。\n" + err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。\n" + move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。\n" + sql_err_msg = "MsgID:999999000002 Message:SQL実行エラーです。\n" + csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。\n" + cnt_msg = "MsgID: Message: LogText:" + suc_end_msg = "MsgID:BI0000009999 Message:バッチ処理を正常に終了しました。\n" + + def exec_batch_monthly(self): + """ 実消化&アルトマーク月次バッチ """ + try: + # 実行ログに書き込む + res_log_p = pathlib.Path(self.res_log) + res_log_p.touch() + os.chmod(self.res_log, '0664') + + # 実行ログ + resLog_f = open(self.res_log) + print(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.start_msg}') + + db = Database.get_instance() + # DB接続 + db.connect() + # トランザクションの開始 + db.begin() + + # 正常系データの反映 + # 過去分は不要のため、デリート + db.execute(self.PHYSICAL_NORMAL_DELETE_QUERY) + + # 正常系データを取得しWKテーブルに保存する。 + db.execute(self.NORMAL_INSERT_SELECT_QUERY) + + # 正常系データの件数を取得 + record_count = db.execute_select(self.NORMAL_COUNT_QUERY) + suc_count = record_count[0]['countNum'] + + # 警告系データの反映 + # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 + db.execute(self.PHYSICAL_ABNORMAL_DELETE_QUERY) + + # 異常系データを取得しWKテーブルに保存する。 + db.execute(self.ABNORMAL_INSERT_SELECT_QUERY) + + # 異常系データの件数を取得 + record_count = db.execute_select(self.ABNORMAL_COUNT_QUERY) + wrn_count = record_count[0]['countNum'] + + # CSVファイルの作成用のSQL実行 + record_csv = db.execute_select(self.SELECT_QUERY) + + # CSVファイル作成 + arisCreateCsv_p = pathlib.Path(self.arisCreateCsv) + arisCreateCsv_p.touch() + if not os.path.exists(self.arisCreateCsv): + print(f'{self.create_date_format}[DWH][5][ERROR]{self.prg_id} {self.csv_err_msg}') + print(f'{self.create_date_format}[DWH][5][ERROR]{self.prg_id} {self.err_end_msg}') + + # ヘッダ行書き込み + resLog_f = open(self.aris_create_csv) + print(f'{self.head_str}\r\n') + + # データ部分書き込み + for record_data in record_csv: + csv_data = ",".join(record_data).encode('shift_jis') + print(f'{csv_data}\r\n') + + logger.info('use memory--->') + logger.info('memory_get_usage 与えられたメモリの量') + logger.info('\n') + logger.info('max memory--->') + logger.info('memory_get_peak_usage  メモリの最大値') + logger.info('\n') + + resLog_f.close() + + # トランザクションの終了 + db.commit() + + # 実行ログファイルの追記 + # 実行ログに処理件数を書き込む。 + sum_count = suc_count + wrn_count + print(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') + + # ファイル移動処理 + + logger.info('実消化&アルトマーク月次バッチ処理: 終了') + except Exception as e: + raise BatchOperationException(e) + + finally: + # 終了時に必ずコミットする + db.commit() + db.disconnect() + return diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py index b58c4601..302993a2 100644 --- a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -9,6 +9,7 @@ from src.batch.common.calendar_file import CalendarFile from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants +from src.batch.jskult_batch_monthly import JskultBathcMonthly logger = get_logger('月次処理コントロール') @@ -34,7 +35,7 @@ def exec(): # dump取得が正常終了していない場合、後続の処理は行わない if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: logger.error('dump取得が正常終了していないため、月次バッチ処理を終了します。') - return constants.BATCH_EXIT_CODE_SUCCESS + # 戻すんだよ return constants.BATCH_EXIT_CODE_SUCCESS logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 @@ -61,7 +62,7 @@ def exec(): try: logger.info('月次バッチ:起動') - # ultmarc_process.exec_import() + JskultBathcMonthly.exec_batch_monthly() logger.info('月次バッチ:終了') except BatchOperationException as e: logger.exception(f'月次バッチ処理エラー(異常終了){e}') From 8534e6d66bcd53ced315251ceec3a198384ded4a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 26 Jun 2023 13:38:23 +0900 Subject: [PATCH 399/962] =?UTF-8?q?feat:=20=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=83=99=E3=83=BC=E3=82=B9=E6=93=8D=E4=BD=9C=E9=83=A8=E5=93=81?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82=E3=83=91=E3=83=A9=E3=83=A1?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E6=8C=87=E5=AE=9A=E3=81=AB=E3=82=88=E3=82=8A?= =?UTF-8?q?=E3=80=81AUTOCOMMIT=E3=81=A7=E6=8E=A5=E7=B6=9A=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=82=92=E5=88=86?= =?UTF-8?q?=E5=B2=90=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laundering/sales_results_laundering.py | 4 +-- ecs/jskult-batch-daily/src/db/database.py | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) 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 index 530fd9b9..87958e5c 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -1,14 +1,14 @@ +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.batch.batch_functions import logging_sql from src.system_var import environment logger = get_logger('卸卸販売洗替') def exec(): - db = Database.get_instance() + db = Database.get_instance(autocommit=True) try: db.connect() logger.debug('処理開始') 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) From 00175d26f7213d912aadecd164898de913736633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 26 Jun 2023 14:20:17 +0900 Subject: [PATCH 400/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/sales_results_laundering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 530fd9b9..05086e4a 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_results_laundering.py @@ -4,7 +4,7 @@ from src.logging.get_logger import get_logger from src.batch.batch_functions import logging_sql from src.system_var import environment -logger = get_logger('卸卸販売洗替') +logger = get_logger('卸販売洗替') def exec(): From c76700a37ae165a10114312c2200767fe33c60e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 26 Jun 2023 16:28:01 +0900 Subject: [PATCH 401/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/.env.example | 3 +- .../src/batch/jskult_batch_monthly.py | 108 +++++++++++------- .../src/jobctrl_monthly.py | 5 +- 3 files changed, 69 insertions(+), 47 deletions(-) diff --git a/ecs/jskult-batch-monthly/.env.example b/ecs/jskult-batch-monthly/.env.example index 19a3f19f..f2bb73c8 100644 --- a/ecs/jskult-batch-monthly/.env.example +++ b/ecs/jskult-batch-monthly/.env.example @@ -13,7 +13,8 @@ JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt ARISJ_DATA_BUCKET=********** LOG_LEVEL=************** -ARISJ_BACKUP_FOLDER=************** +ARISJ_BACKUP_FOLDER=arisj +ARISJ_DATA_FOLDER=DATA JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME=jskult_arisj_output_day_list.txt DB_CONNECTION_MAX_RETRY_ATTEMPT=************** DB_CONNECTION_RETRY_INTERVAL_INIT=************** diff --git a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py index 3cbecd15..b4caefe1 100644 --- a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py +++ b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py @@ -1,14 +1,13 @@ from datetime import datetime -# from src.aws.s3 import UltmarcBucket -# 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.system_var import constants -import pathlib import os +import tempfile +import os.path as path +import boto3 logger = get_logger('実消化&アルトマーク月次バッチ') @@ -25,7 +24,7 @@ class JskultBathcMonthly(): NORMAL_INSERT_SELECT_QUERY = """\ INSERT src05.wk_inst_aris_if SELECT - TRIM(' ' FROM TRIM(' ' FROM SUBSTRIN(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form @@ -47,7 +46,7 @@ class JskultBathcMonthly(): LEFT JOIN src05.mst_city cc ON ci.prefc_cd = cc.prefc_cd AND ci.city_cd = cc.city_cd - LEFT OUTER JOIN src05.JOIN com_inst_div cd + LEFT OUTER JOIN src05.com_inst_div cd ON ci.inst_div_cd = cd.inst_div_cd WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' AND ci.dcf_dsf_inst_cd IS NOT NULL @@ -129,35 +128,26 @@ class JskultBathcMonthly(): move_file_path = '/data/mountaris/DATA/' create_date = datetime.now().strftime('%Y%m%d%H%M%S') create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - aris_create_csv = f'/home/nds_dwh/tmpcsv/D0004_ARIS_M_DCF_{create_date}csv' - aris_move_csv = f'{move_file_path}D0004_ARIS_M_DCF_{create_date}.csv' - res_log = f'{aris_log}D0004{create_date}.log' - move_res_og = f'{move_file_path}D0004{create_date}log' + aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' + res_log = f'D0004{create_date}.log' prg_id = 'PrgId:BI0402' head_str = 'TC_HOSPITAL, TJ_HOSPITAL, TJ_HOSPITALSHORT, TK_HOSPITAL, \ TC_PREFECTURE, TJ_PREFECTURE, TJ_ZIPCODE, TJ_CITY, TJ_ADDRESS, TJ_DEPARTMENT, \ TJ_TELEPHONENUMBER, TC_HOSPITALCAT, TC_HOSPITALTYPE, TS_UPDATE, TD_UPDATE' start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。\n" - dbConnect_err_msg = "MsgID:999999000002 Message:DB接続エラーです。\n" err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。\n" - move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。\n" - sql_err_msg = "MsgID:999999000002 Message:SQL実行エラーです。\n" csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。\n" cnt_msg = "MsgID: Message: LogText:" - suc_end_msg = "MsgID:BI0000009999 Message:バッチ処理を正常に終了しました。\n" def exec_batch_monthly(self): """ 実消化&アルトマーク月次バッチ """ try: # 実行ログに書き込む - res_log_p = pathlib.Path(self.res_log) - res_log_p.touch() - os.chmod(self.res_log, '0664') - - # 実行ログ - resLog_f = open(self.res_log) - print(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.start_msg}') + resLog = make_log_data(self) + resLog_f = resLog[0] + log_file_path = resLog[1] + resLog_f.write(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.start_msg}') db = Database.get_instance() # DB接続 @@ -191,29 +181,11 @@ class JskultBathcMonthly(): record_csv = db.execute_select(self.SELECT_QUERY) # CSVファイル作成 - arisCreateCsv_p = pathlib.Path(self.arisCreateCsv) - arisCreateCsv_p.touch() - if not os.path.exists(self.arisCreateCsv): - print(f'{self.create_date_format}[DWH][5][ERROR]{self.prg_id} {self.csv_err_msg}') - print(f'{self.create_date_format}[DWH][5][ERROR]{self.prg_id} {self.err_end_msg}') + csv_file_path = make_csv_data(self, record_csv) - # ヘッダ行書き込み - resLog_f = open(self.aris_create_csv) - print(f'{self.head_str}\r\n') - - # データ部分書き込み - for record_data in record_csv: - csv_data = ",".join(record_data).encode('shift_jis') - print(f'{csv_data}\r\n') - - logger.info('use memory--->') - logger.info('memory_get_usage 与えられたメモリの量') - logger.info('\n') - logger.info('max memory--->') - logger.info('memory_get_peak_usage  メモリの最大値') - logger.info('\n') - - resLog_f.close() + # テスト用に出力している(あとで消す) + logger.info(log_file_path) + logger.info(csv_file_path) # トランザクションの終了 db.commit() @@ -221,12 +193,17 @@ class JskultBathcMonthly(): # 実行ログファイルの追記 # 実行ログに処理件数を書き込む。 sum_count = suc_count + wrn_count - print(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') + resLog_f.write(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') + + # 実行ログファイルクローズ + resLog_f.close() # ファイル移動処理 + s3_upload_data(self, csv_file_path, log_file_path) logger.info('実消化&アルトマーク月次バッチ処理: 終了') except Exception as e: + resLog_f.write(f'{self.create_date_format}[DWH][5][INFO]{e.message}') raise BatchOperationException(e) finally: @@ -234,3 +211,46 @@ class JskultBathcMonthly(): db.commit() db.disconnect() return + + +def make_csv_data(self, record_csv: list): + # 一時ファイルとして保存する(CSVファイル) + temporary_dir = tempfile.mkdtemp() + csv_file_path = path.join(temporary_dir, self.aris_create_csv) + + # ヘッダ行書き込み + fp = open(csv_file_path, mode='w') + fp.write(f'{self.head_str}\n') + + # データ部分書き込み + for record_data in record_csv: + record_value = list(record_data.values()) + csv_data = ",".join(map(str, record_value)) + fp.write(f'{csv_data}\n') + + # ファイルクローズ + fp.close() + return csv_file_path + + +def make_log_data(self): + # 一時ファイルとして保存する(ログファイル) + temporary_dir = tempfile.mkdtemp() + log_file_path = path.join(temporary_dir, self.res_log) + fp = open(log_file_path, mode='w') + return fp, log_file_path + + +def s3_upload_data(self, csv_file_path, log_file_path): + # s3にログファイルとCSVファイルをUPする + + Bucket = os.environ['ARISJ_DATA_BUCKET'] + folder = os.environ['ARISJ_DATA_FOLDER'] + csv_file_name = f'{folder}/{self.aris_create_csv}' + log_file_name = f'{folder}/{self.res_log}' + + s3_client = boto3.client('s3') + s3_client.upload_file(csv_file_path, Bucket, csv_file_name) + s3_client.upload_file(csv_file_path, Bucket, log_file_name) + + return diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py index 302993a2..3a1e8d68 100644 --- a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -30,7 +30,7 @@ def exec(): # 月次バッチ処理中の場合、後続の処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: logger.error('バッチ処理中のため、月次バッチ処理を終了します。') - return constants.BATCH_EXIT_CODE_SUCCESS + # 戻すんだよ return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: @@ -62,7 +62,8 @@ def exec(): try: logger.info('月次バッチ:起動') - JskultBathcMonthly.exec_batch_monthly() + BathcMonthly = JskultBathcMonthly() + BathcMonthly.exec_batch_monthly() logger.info('月次バッチ:終了') except BatchOperationException as e: logger.exception(f'月次バッチ処理エラー(異常終了){e}') From 07d9f3785353ef33b1e118d9424878df59d45ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 27 Jun 2023 09:33:00 +0900 Subject: [PATCH 402/962] =?UTF-8?q?feat:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=B9=E3=83=9A=E3=83=BC=E3=82=B9=E7=AD=89=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/src05/sales_lau_upsert.sql | 16 ++++++++-------- .../src05/v_inst_merge_laundering.sql | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql index 63049f09..5f26b9c8 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -41,7 +41,7 @@ BEGIN internal05.bu_prd_name_contrast_t ( prd_cd, bu_cd, - phm_itm_cd, + phm_itm_cd, pp_start_date, pp_end_date, update_date, @@ -344,14 +344,14 @@ BEGIN 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') + 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)) + (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 ) ) @@ -427,8 +427,8 @@ BEGIN 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; + 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, '卸販売実績テーブル(洗替後)作成⑤ 終了' @@ -463,8 +463,8 @@ BEGIN 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; + 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, '卸販売実績テーブル(洗替後)作成⑥ 終了' diff --git a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql index 35c4a700..7c1dee91 100644 --- a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -63,10 +63,10 @@ BEGIN 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; + "; + 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施設コードの洗替① 終了' From 6239ef783a21edde213c4c753f8f0fcd40c144b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 27 Jun 2023 14:02:47 +0900 Subject: [PATCH 403/962] =?UTF-8?q?feat:=20=E4=BE=8B=E5=A4=96=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=82=AA=E3=83=90=E3=83=BC=E3=83=95=E3=83=AD=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E5=87=A6=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src05/hco_to_mdb_laundering.sql | 20 ++++++++---- .../src05/inst_merge_laundering.sql | 12 +++++-- .../src05/sales_lau_delete.sql | 12 +++++-- .../src05/sales_lau_upsert.sql | 32 +++++++++++-------- .../src05/v_inst_merge_laundering.sql | 12 +++++-- .../src05/whs_org_laundering.sql | 20 ++++++++---- 6 files changed, 72 insertions(+), 36 deletions(-) diff --git a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql index b3cbfc6e..8201f3bc 100644 --- a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql +++ b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql @@ -14,23 +14,29 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + 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, + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】4:メルク施設コードの洗替_A② 開始'); INSERT INTO @@ -74,10 +80,10 @@ BEGIN AND ci.delete_flg = '0' ; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】4:メルク施設コードの洗替_A③ 開始'); SET @update_institution = " @@ -96,7 +102,7 @@ BEGIN PREPARE update_institution_stmt from @update_institution; EXECUTE update_institution_stmt; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 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 index 6a0642a9..05908ca1 100644 --- a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql @@ -14,15 +14,21 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】4:メルク施設コードの洗替_B① 開始'); SET @update_institution = " @@ -53,7 +59,7 @@ BEGIN PREPARE update_institution_stmt from @update_institution; EXECUTE update_institution_stmt; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 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/sales_lau_delete.sql b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql index c1610435..8b312d6f 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql @@ -14,15 +14,21 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)過去5年以前のデータ削除① 開始'); SET @delete_data = " @@ -35,7 +41,7 @@ BEGIN PREPARE delete_data_stmt from @delete_data; EXECUTE delete_data_stmt USING @laundering_period_year; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + 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 index 5f26b9c8..72a86310 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -15,25 +15,31 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + 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, '卸販売実績テーブル(洗替後)作成① 終了' ); - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成② 開始' ); @@ -65,22 +71,22 @@ BEGIN 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, '卸販売実績テーブル(洗替後)作成② 終了' ); - 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, '卸販売実績テーブル(洗替後)作成③ 終了' ); - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成④ 開始' ); @@ -129,11 +135,11 @@ BEGIN 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, '卸販売実績テーブル(洗替後)作成④ 終了' ); - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成⑤ 開始' ); @@ -430,11 +436,11 @@ BEGIN 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, '卸販売実績テーブル(洗替後)作成⑤ 終了' ); - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成⑥ 開始' ); @@ -466,7 +472,7 @@ BEGIN 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '卸販売実績テーブル(洗替後)作成⑥ 終了' ); diff --git a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql index 7c1dee91..06af3867 100644 --- a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -14,15 +14,21 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】3:HCO施設コードの洗替① 開始' ); @@ -68,7 +74,7 @@ BEGIN PREPARE update_institution_stmt from @update_institution; EXECUTE update_institution_stmt; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】3:HCO施設コードの洗替① 終了' ); diff --git a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql index 65dc9e30..e183d0c8 100644 --- a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql +++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql @@ -14,25 +14,31 @@ BEGIN 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, + 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) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + 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, + 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, + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】1.卸組織洗替② 開始' ); @@ -91,11 +97,11 @@ BEGIN 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, + 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, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】1.卸組織洗替③ 開始' ); @@ -115,7 +121,7 @@ BEGIN PREPARE update_organization_stmt from @update_organization; EXECUTE update_organization_stmt; - call medaca_common.put_info_log(schema_name, procedure_name, procedure_args, + CALL medaca_common.put_info_log(schema_name, procedure_name, procedure_args, '【洗替】1.卸組織洗替③ 終了' ); From 6478bd078b0a49ac82448eae5b08bfba26be5a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 27 Jun 2023 14:15:20 +0900 Subject: [PATCH 404/962] =?UTF-8?q?=E4=BB=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/jskult_batch_monthly.py | 441 +++++++++--------- .../src/jobctrl_monthly.py | 9 +- 2 files changed, 235 insertions(+), 215 deletions(-) diff --git a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py index b4caefe1..fe9b46ee 100644 --- a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py +++ b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py @@ -11,246 +11,267 @@ import boto3 logger = get_logger('実消化&アルトマーク月次バッチ') +# WKテーブルの過去分削除SQL +PHYSICAL_NORMAL_DELETE_QUERY = """\ + DELETE FROM src05.wk_inst_aris_if +""" -class JskultBathcMonthly(): - """ 実消化&アルトマーク月次バッチ """ +# 正常系データを取得しWKテーブルに保存SQL +NORMAL_INSERT_SELECT_QUERY = """\ + INSERT src05.wk_inst_aris_if + SELECT + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' FROM ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' FROM cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' FROM cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date + ,sysdate() + FROM src05.com_inst ci + LEFT JOIN src05.mst_prefc cp + ON ci.prefc_cd = cp.prefc_cd + LEFT JOIN src05.mst_city cc + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd + LEFT OUTER JOIN src05.com_inst_div cd + ON ci.inst_div_cd = cd.inst_div_cd + WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' + AND ci.dcf_dsf_inst_cd IS NOT NULL + AND ci.form_inst_name_kanji IS NOT NULL + AND ci.prefc_cd IS NOT NULL + AND cp.prefc_name IS NOT NULL + AND cc.city_name IS NOT NULL + AND ci.inst_addr IS NOT NULL + ORDER BY ci.dcf_dsf_inst_cd +""" - # WKテーブルの過去分削除SQL - PHYSICAL_NORMAL_DELETE_QUERY = """\ - DELETE FROM src05.wk_inst_aris_if - """ +# 正常系データの件数を取得SQL +NORMAL_COUNT_QUERY = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if +""" - # 正常系データを取得しWKテーブルに保存SQL - NORMAL_INSERT_SELECT_QUERY = """\ - INSERT src05.wk_inst_aris_if +# 異常系WKテーブルの過去分削除SQL +PHYSICAL_ABNORMAL_DELETE_QUERY = """\ + DELETE FROM src05.wk_inst_aris_if_wrn +""" + +# 異常系データを取得しWKテーブルに保存SQL +ABNORMAL_INSERT_SELECT_QUERY = """\ + INSERT src05.wk_inst_aris_if_wrn SELECT - TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form - ,TRIM(' ' FROM TRIM(' ' FROM ci.prefc_cd)) AS pref_cd - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(cp.prefc_name,1,8))) AS pref_name - ,TRIM(' ' FROM TRIM(' ' FROM ci.postal_number)) AS postal_cd - ,TRIM(' ' FROM TRIM(' ' FROM cc.city_name)) AS city_name - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_addr)) AS address - ,TRIM(' ' FROM TRIM(' ' FROM cd.inst_div_name)) - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_phone_number)) AS phone_no - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_div_cd)) - ,TRIM(' ' FROM TRIM(' ' FROM ci.manage_cd)) - ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date - ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date - ,sysdate() + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' from ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' from ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' from cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' from ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' from cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' from ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' from ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' from ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date + ,IF(ci.dcf_dsf_inst_cd IS NULL,'bi0402000001', NULL) AS wrnid_dcf_inst_cd + ,IF(ci.form_inst_name_kanji IS NULL,'bi0402000002', NULL) AS wrnid_inst_name_form + ,IF(ci.prefc_cd IS NULL,'bi0402000003', NULL) AS wrnid_pref_cd + ,IF(cp.prefc_name IS NULL,'bi0402000004', NULL) AS wrnid_pref_name + ,IF(cc.city_name IS NULL,'bi0402000005', NULL) AS wrnid_city_name + ,IF(ci.inst_addr IS NULL,'bi0402000006', NULL) AS wrnid_address + ,sysdate() FROM src05.com_inst ci LEFT JOIN src05.mst_prefc cp - ON ci.prefc_cd = cp.prefc_cd + ON ci.prefc_cd = cp.prefc_cd LEFT JOIN src05.mst_city cc - ON ci.prefc_cd = cc.prefc_cd - AND ci.city_cd = cc.city_cd + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd LEFT OUTER JOIN src05.com_inst_div cd - ON ci.inst_div_cd = cd.inst_div_cd + ON ci.inst_div_cd = cd.inst_div_cd WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' - AND ci.dcf_dsf_inst_cd IS NOT NULL - AND ci.form_inst_name_kanji IS NOT NULL - AND ci.prefc_cd IS NOT NULL - AND cp.prefc_name IS NOT NULL - AND cc.city_name IS NOT NULL - AND ci.inst_addr IS NOT NULL + AND( ci.dcf_dsf_inst_cd IS NULL + OR ci.form_inst_name_kanji IS NULL + OR ci.prefc_cd IS NULL + OR cp.prefc_name IS NULL + OR cc.city_name IS NULL + OR ci.inst_addr IS NULL) ORDER BY ci.dcf_dsf_inst_cd - """ +""" - # 正常系データの件数を取得SQL - NORMAL_COUNT_QUERY = """\ - SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if - """ +# 正常系データの件数を取得SQL +ABNORMAL_COUNT_QUERY = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if_wrn +""" +# CSVファイルの作成用のSQL +SELECT_QUERY = """\ + SELECT dcf_inst_cd, inst_name_form, inst_name, inst_name_kana_form, pref_cd, pref_name, + postal_cd, city_name, address, inst_div_name, phone_no, inst_div_cd, manage_cd, + '', inst_delete_date + FROM src05.wk_inst_aris_if ORDER BY dcf_inst_cd +""" - # 異常系WKテーブルの過去分削除SQL - PHYSICAL_ABNORMAL_DELETE_QUERY = """\ - DELETE FROM src05.wk_inst_aris_if_wrn - """ - - # 異常系データを取得しWKテーブルに保存SQL - ABNORMAL_INSERT_SELECT_QUERY = """\ - INSERT src05.wk_inst_aris_if_wrn - SELECT - TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form - ,TRIM(' ' FROM TRIM(' ' from ci.prefc_cd)) AS pref_cd - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(cp.prefc_name,1,8))) AS pref_name - ,TRIM(' ' FROM TRIM(' ' from ci.postal_number)) AS postal_cd - ,TRIM(' ' FROM TRIM(' ' from cc.city_name)) AS city_name - ,TRIM(' ' FROM TRIM(' ' from ci.inst_addr)) AS address - ,TRIM(' ' FROM TRIM(' ' from cd.inst_div_name)) - ,TRIM(' ' FROM TRIM(' ' from ci.inst_phone_number)) AS phone_no - ,TRIM(' ' FROM TRIM(' ' from ci.inst_div_cd)) - ,TRIM(' ' FROM TRIM(' ' from ci.manage_cd)) - ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date - ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date - ,IF(ci.dcf_dsf_inst_cd IS NULL,'bi0402000001', NULL) AS wrnid_dcf_inst_cd - ,IF(ci.form_inst_name_kanji IS NULL,'bi0402000002', NULL) AS wrnid_inst_name_form - ,IF(ci.prefc_cd IS NULL,'bi0402000003', NULL) AS wrnid_pref_cd - ,IF(cp.prefc_name IS NULL,'bi0402000004', NULL) AS wrnid_pref_name - ,IF(cc.city_name IS NULL,'bi0402000005', NULL) AS wrnid_city_name - ,IF(ci.inst_addr IS NULL,'bi0402000006', NULL) AS wrnid_address - ,sysdate() - FROM src05.com_inst ci - LEFT JOIN src05.mst_prefc cp - ON ci.prefc_cd = cp.prefc_cd - LEFT JOIN src05.mst_city cc - ON ci.prefc_cd = cc.prefc_cd - AND ci.city_cd = cc.city_cd - LEFT OUTER JOIN src05.com_inst_div cd - ON ci.inst_div_cd = cd.inst_div_cd - WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' - AND( ci.dcf_dsf_inst_cd IS NULL - OR ci.form_inst_name_kanji IS NULL - OR ci.prefc_cd IS NULL - OR cp.prefc_name IS NULL - OR cc.city_name IS NULL - OR ci.inst_addr IS NULL) - ORDER BY ci.dcf_dsf_inst_cd - """ - - # 正常系データの件数を取得SQL - ABNORMAL_COUNT_QUERY = """\ - SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if_wrn - """ - # CSVファイルの作成用のSQL - SELECT_QUERY = """\ - SELECT dcf_inst_cd, inst_name_form, inst_name, inst_name_kana_form, pref_cd, pref_name, - postal_cd, city_name, address, inst_div_name, phone_no, inst_div_cd, manage_cd, - '', inst_delete_date - FROM src05.wk_inst_aris_if ORDER BY dcf_inst_cd - """ - - aris_log = '/var/log/temporarydwh/' - move_file_path = '/data/mountaris/DATA/' - create_date = datetime.now().strftime('%Y%m%d%H%M%S') - create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' - res_log = f'D0004{create_date}.log' - prg_id = 'PrgId:BI0402' - head_str = 'TC_HOSPITAL, TJ_HOSPITAL, TJ_HOSPITALSHORT, TK_HOSPITAL, \ - TC_PREFECTURE, TJ_PREFECTURE, TJ_ZIPCODE, TJ_CITY, TJ_ADDRESS, TJ_DEPARTMENT, \ - TJ_TELEPHONENUMBER, TC_HOSPITALCAT, TC_HOSPITALTYPE, TS_UPDATE, TD_UPDATE' - - start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。\n" - err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。\n" - csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。\n" - cnt_msg = "MsgID: Message: LogText:" - - def exec_batch_monthly(self): - """ 実消化&アルトマーク月次バッチ """ - try: - # 実行ログに書き込む - resLog = make_log_data(self) - resLog_f = resLog[0] - log_file_path = resLog[1] - resLog_f.write(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.start_msg}') - - db = Database.get_instance() - # DB接続 - db.connect() - # トランザクションの開始 - db.begin() - - # 正常系データの反映 - # 過去分は不要のため、デリート - db.execute(self.PHYSICAL_NORMAL_DELETE_QUERY) - - # 正常系データを取得しWKテーブルに保存する。 - db.execute(self.NORMAL_INSERT_SELECT_QUERY) - - # 正常系データの件数を取得 - record_count = db.execute_select(self.NORMAL_COUNT_QUERY) - suc_count = record_count[0]['countNum'] - - # 警告系データの反映 - # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 - db.execute(self.PHYSICAL_ABNORMAL_DELETE_QUERY) - - # 異常系データを取得しWKテーブルに保存する。 - db.execute(self.ABNORMAL_INSERT_SELECT_QUERY) - - # 異常系データの件数を取得 - record_count = db.execute_select(self.ABNORMAL_COUNT_QUERY) - wrn_count = record_count[0]['countNum'] - - # CSVファイルの作成用のSQL実行 - record_csv = db.execute_select(self.SELECT_QUERY) - - # CSVファイル作成 - csv_file_path = make_csv_data(self, record_csv) - - # テスト用に出力している(あとで消す) - logger.info(log_file_path) - logger.info(csv_file_path) - - # トランザクションの終了 - db.commit() - - # 実行ログファイルの追記 - # 実行ログに処理件数を書き込む。 - sum_count = suc_count + wrn_count - resLog_f.write(f'{self.create_date_format}[DWH][3][INFO]{self.prg_id} {self.cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') - - # 実行ログファイルクローズ - resLog_f.close() - - # ファイル移動処理 - s3_upload_data(self, csv_file_path, log_file_path) - - logger.info('実消化&アルトマーク月次バッチ処理: 終了') - except Exception as e: - resLog_f.write(f'{self.create_date_format}[DWH][5][INFO]{e.message}') - raise BatchOperationException(e) - - finally: - # 終了時に必ずコミットする - db.commit() - db.disconnect() - return +create_date = datetime.now().strftime('%Y%m%d%H%M%S') +create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') +aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' +res_log = f'D0004{create_date}.log' +prg_id = 'PrgId:BI0402' +head_str = 'TC_HOSPITAL,TJ_HOSPITAL,TJ_HOSPITALSHORT,TK_HOSPITAL,TC_PREFECTURE,TJ_PREFECTURE,TJ_ZIPCODE,TJ_CITY,TJ_ADDRESS,\ +TJ_DEPARTMENT,TJ_TELEPHONENUMBER,TC_HOSPITALCAT,TC_HOSPITALTYPE,TS_UPDATE, TD_UPDATE' +start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。" +err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。" +csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。" +cnt_msg = "MsgID: Message: LogText:" +move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。" -def make_csv_data(self, record_csv: list): +def exec(): + """ 実消化&アルトマーク月次バッチ """ + try: + # 実行ログに書き込む + resLog = make_log_data() + resLog_f = resLog[0] + log_file_path = resLog[1] + resLog_f.write(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}\n') + logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') + + db = Database.get_instance() + # DB接続 + db.connect() + # トランザクションの開始 + db.begin() + + # 正常系データの反映 + # 過去分は不要のため、デリート + db.execute(PHYSICAL_NORMAL_DELETE_QUERY) + + # 正常系データを取得しWKテーブルに保存する。 + db.execute(NORMAL_INSERT_SELECT_QUERY) + + # 正常系データの件数を取得 + record_count = db.execute_select(NORMAL_COUNT_QUERY) + suc_count = record_count[0]['countNum'] + + # 警告系データの反映 + # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 + db.execute(PHYSICAL_ABNORMAL_DELETE_QUERY) + + # 異常系データを取得しWKテーブルに保存する。 + db.execute(ABNORMAL_INSERT_SELECT_QUERY) + + # 異常系データの件数を取得 + record_count = db.execute_select(ABNORMAL_COUNT_QUERY) + wrn_count = record_count[0]['countNum'] + + # CSVファイルの作成用のSQL実行 + record_csv = db.execute_select(SELECT_QUERY) + + # CSVファイル作成 + csv_file_path = make_csv_data(record_csv, resLog_f) + + # トランザクションの終了 + db.commit() + + # 実行ログファイルの追記 + # 実行ログに処理件数を書き込む。 + sum_count = suc_count + wrn_count + resLog_f.write(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') + logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') + + # CSVファイル移動処理 + s3_csv_upload_data(csv_file_path, resLog_f) + + # 実行ログファイルクローズ + resLog_f.close() + + # logファイル移動処理 + s3_log_upload_data(log_file_path) + + logger.info('実消化&アルトマーク月次バッチ処理: 終了') + except Exception as e: + logger.info(f'{create_date_format}[DWH][5][INFO]{e.message}') + raise BatchOperationException(e) + + finally: + # 終了時に必ずコミットする + db.commit() + db.disconnect() + + +def make_csv_data(record_csv: list, resLog_f): # 一時ファイルとして保存する(CSVファイル) - temporary_dir = tempfile.mkdtemp() - csv_file_path = path.join(temporary_dir, self.aris_create_csv) + try: - # ヘッダ行書き込み - fp = open(csv_file_path, mode='w') - fp.write(f'{self.head_str}\n') + temporary_dir = tempfile.mkdtemp() + csv_file_path = path.join(temporary_dir, aris_create_csv) - # データ部分書き込み - for record_data in record_csv: - record_value = list(record_data.values()) - csv_data = ",".join(map(str, record_value)) - fp.write(f'{csv_data}\n') + # ヘッダ行書き込み + fp = open(csv_file_path, mode='w') + fp.write(f'{head_str}\n') + + # データ部分書き込み + for record_data in record_csv: + record_value = list(record_data.values()) + csv_data = ",".join(map(str, record_value)) + fp.write(f'{csv_data}\n') + + # ファイルクローズ + fp.close() + except Exception as e: + resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}\n') + resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}\n') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') + raise e - # ファイルクローズ - fp.close() return csv_file_path -def make_log_data(self): +def make_log_data(): # 一時ファイルとして保存する(ログファイル) temporary_dir = tempfile.mkdtemp() - log_file_path = path.join(temporary_dir, self.res_log) + log_file_path = path.join(temporary_dir, res_log) fp = open(log_file_path, mode='w') return fp, log_file_path -def s3_upload_data(self, csv_file_path, log_file_path): +def s3_csv_upload_data(csv_file_path, resLog_f): # s3にログファイルとCSVファイルをUPする - Bucket = os.environ['ARISJ_DATA_BUCKET'] folder = os.environ['ARISJ_DATA_FOLDER'] - csv_file_name = f'{folder}/{self.aris_create_csv}' - log_file_name = f'{folder}/{self.res_log}' - + csv_file_name = f'{folder}/{aris_create_csv}' s3_client = boto3.client('s3') - s3_client.upload_file(csv_file_path, Bucket, csv_file_name) - s3_client.upload_file(csv_file_path, Bucket, log_file_name) + + try: + s3_client.upload_file(csv_file_path, Bucket, csv_file_name) + except Exception as e: + resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}\n') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') + raise e + + return + + +def s3_log_upload_data(log_file_path): + # s3にログファイルとCSVファイルをUPする + Bucket = os.environ['ARISJ_DATA_BUCKET'] + folder = os.environ['ARISJ_DATA_FOLDER'] + log_file_name = f'{folder}/{res_log}' + s3_client = boto3.client('s3') + + try: + s3_client.upload_file(log_file_path, Bucket, log_file_name) + except Exception as e: + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') + raise e return diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py index 3a1e8d68..fdb7d0c1 100644 --- a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -9,7 +9,7 @@ from src.batch.common.calendar_file import CalendarFile from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants -from src.batch.jskult_batch_monthly import JskultBathcMonthly +from src.batch import jskult_batch_monthly logger = get_logger('月次処理コントロール') @@ -30,12 +30,12 @@ def exec(): # 月次バッチ処理中の場合、後続の処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: logger.error('バッチ処理中のため、月次バッチ処理を終了します。') - # 戻すんだよ return constants.BATCH_EXIT_CODE_SUCCESS + return constants.BATCH_EXIT_CODE_SUCCESS # dump取得が正常終了していない場合、後続の処理は行わない if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: logger.error('dump取得が正常終了していないため、月次バッチ処理を終了します。') - # 戻すんだよ return constants.BATCH_EXIT_CODE_SUCCESS + return constants.BATCH_EXIT_CODE_SUCCESS logger.info(f'処理日={syor_date}') # バッチ共通設定に処理日を追加 @@ -62,8 +62,7 @@ def exec(): try: logger.info('月次バッチ:起動') - BathcMonthly = JskultBathcMonthly() - BathcMonthly.exec_batch_monthly() + jskult_batch_monthly.exec() logger.info('月次バッチ:終了') except BatchOperationException as e: logger.exception(f'月次バッチ処理エラー(異常終了){e}') From 3d54ec82599378e1f26793a90aea29237ae7a45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 27 Jun 2023 16:21:13 +0900 Subject: [PATCH 405/962] =?UTF-8?q?allon=E3=81=A8alloff=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/function/businessLogicScript.js | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index ee4beb0c..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 がついていること From be75bf7a9a5f291f8211d746c1b5df0069fc62db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 27 Jun 2023 16:50:29 +0900 Subject: [PATCH 406/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py index fe9b46ee..2a8d4c06 100644 --- a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py +++ b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py @@ -221,6 +221,7 @@ def make_csv_data(record_csv: list, resLog_f): # データ部分書き込み for record_data in record_csv: record_value = list(record_data.values()) + record_value = ['' if n is None else n for n in record_value] csv_data = ",".join(map(str, record_value)) fp.write(f'{csv_data}\n') From a767457749dc789415efcab987131f43ed434415 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 23 Jun 2023 20:15:35 +0900 Subject: [PATCH 407/962] =?UTF-8?q?LOAD=E5=AE=9F=E8=A1=8C=E7=B5=90?= =?UTF-8?q?=E6=9E=9C=E3=80=81=E3=83=AF=E3=83=BC=E3=83=8B=E3=83=B3=E3=82=B0?= =?UTF-8?q?1261=E3=81=AF=E8=A8=B1=E5=AE=B9=E3=81=99=E3=82=8B=E3=81=A8?= =?UTF-8?q?=E3=81=97=E3=81=A6=E4=BE=8B=E5=A4=96=E5=88=A4=E5=AE=9A=E3=81=8B?= =?UTF-8?q?=E3=82=89=E9=99=A4=E5=A4=96=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index f869b983..fa82805d 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -37,14 +37,18 @@ class VjskDataLoadManager: """ db.begin() result = db.execute(sql, {"src_file_name": src_file_name}) + logger.debug(sql) result_w = db.execute("SHOW WARNINGS;") has_mysql_warnings = False for row in result_w.fetchall(): + # 例外スロー対象から除外 : Warning(1261) Row {ROW NUMBER} doesn't contain data for all columns + if len(row) >= 2 and row[0] == "Warning" and row[1] == 1261: + logger.info(f"SHOW WARNINGS (SKIP) : {row}") + continue has_mysql_warnings = True logger.info(f"SHOW WARNINGS : {row}") if has_mysql_warnings: raise Exception("LOAD文実行時にWARNINGが発生しました。") - logger.debug(sql) logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') db.commit() From e38938a243ac3b2c9a7ee2203496d9f58a9071ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 28 Jun 2023 15:02:16 +0900 Subject: [PATCH 408/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/.env.example | 29 +- ecs/jskult-batch-monthly/Pipfile | 6 - ecs/jskult-batch-monthly/README.md | 2 +- ecs/jskult-batch-monthly/entrypoint.py | 2 +- ecs/jskult-batch-monthly/src/aws/s3.py | 25 -- .../src/batch/batch_functions.py | 58 +-- .../src/batch/common/batch_context.py | 31 +- .../src/batch/jskult_batch_monthly.py | 278 -------------- .../src/batch/output_arisj_file_process.py | 361 ++++++++++++++++++ .../src/batch/parallel_processes.py | 32 -- .../src/jobctrl_monthly.py | 48 +-- .../src/system_var/constants.py | 9 - .../src/system_var/environment.py | 8 +- 13 files changed, 403 insertions(+), 486 deletions(-) delete mode 100644 ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py create mode 100644 ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py delete mode 100644 ecs/jskult-batch-monthly/src/batch/parallel_processes.py diff --git a/ecs/jskult-batch-monthly/.env.example b/ecs/jskult-batch-monthly/.env.example index f2bb73c8..6bda1a69 100644 --- a/ecs/jskult-batch-monthly/.env.example +++ b/ecs/jskult-batch-monthly/.env.example @@ -1,23 +1,20 @@ DB_HOST=************ -DB_PORT=************ +DB_PORT=3306 DB_USERNAME=************ DB_PASSWORD=************ DB_SCHEMA=src05 + +ARISJ_DATA_BUCKET=mbj-newdwh2021-staging-jskult-arisj +JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult +JSKULT_CONFIG_BUCKET=mbj-newdwh2021-staging-config +ULTMARC_BACKUP_FOLDER=************ + LOG_LEVEL=INFO -ULTMARC_DATA_BUCKET=**************** -ULTMARC_DATA_FOLDER=recv -JSKULT_BACKUP_BUCKET=**************** -ULTMARC_BACKUP_FOLDER=ultmarc -JSKULT_CONFIG_BUCKET=********************** -JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar -JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt -ARISJ_DATA_BUCKET=********** -LOG_LEVEL=************** -ARISJ_BACKUP_FOLDER=arisj ARISJ_DATA_FOLDER=DATA +ARISJ_BACKUP_FOLDER=arisj +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME=jskult_arisj_output_day_list.txt -DB_CONNECTION_MAX_RETRY_ATTEMPT=************** -DB_CONNECTION_RETRY_INTERVAL_INIT=************** -DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************** -DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************* -VJSK_DATA_BUCKET=************* \ No newline at end of file +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ diff --git a/ecs/jskult-batch-monthly/Pipfile b/ecs/jskult-batch-monthly/Pipfile index 24e5efcd..fe0fdc38 100644 --- a/ecs/jskult-batch-monthly/Pipfile +++ b/ecs/jskult-batch-monthly/Pipfile @@ -3,10 +3,6 @@ url = "https://pypi.org/simple" verify_ssl = true name = "pypi" -[scripts] -"test:ultmarc" = "pytest tests/batch/ultmarc/" -"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" - [packages] boto3 = "*" sqlalchemy = "*" @@ -16,8 +12,6 @@ pymysql = "*" [dev-packages] autopep8 = "*" flake8 = "*" -pytest = "*" -pytest-cov = "*" [requires] python_version = "3.9" diff --git a/ecs/jskult-batch-monthly/README.md b/ecs/jskult-batch-monthly/README.md index acf096d2..f6e7c2da 100644 --- a/ecs/jskult-batch-monthly/README.md +++ b/ecs/jskult-batch-monthly/README.md @@ -42,7 +42,7 @@ - VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 - 「entrypoint.py」が、バッチ処理のエントリーポイント。 -- 実際の処理は、「src/jobctrl_daily.py」で行っている。 +- 実際の処理は、「src/jobctrl_monthly.py」で行っている。 ## フォルダ構成(工事中) diff --git a/ecs/jskult-batch-monthly/entrypoint.py b/ecs/jskult-batch-monthly/entrypoint.py index 191d0eae..4ab8d3b3 100644 --- a/ecs/jskult-batch-monthly/entrypoint.py +++ b/ecs/jskult-batch-monthly/entrypoint.py @@ -1,4 +1,4 @@ -"""実消化&アルトマーク 日次バッチのエントリーポイント""" +"""実消化&アルトマーク 月次バッチのエントリーポイント""" from src import jobctrl_monthly if __name__ == '__main__': diff --git a/ecs/jskult-batch-monthly/src/aws/s3.py b/ecs/jskult-batch-monthly/src/aws/s3.py index 847f5bad..ed337407 100644 --- a/ecs/jskult-batch-monthly/src/aws/s3.py +++ b/ecs/jskult-batch-monthly/src/aws/s3.py @@ -51,31 +51,6 @@ class S3Bucket(): _bucket_name: str = None -class UltmarcBucket(S3Bucket): - _bucket_name = environment.ULTMARC_DATA_BUCKET - _folder = environment.ULTMARC_DATA_FOLDER - - def list_dat_file(self): - return self._s3_client.list_objects(self._bucket_name, self._folder) - - def download_dat_file(self, dat_filename: str): - # 一時ファイルとして保存する - temporary_dir = tempfile.mkdtemp() - temporary_file_path = path.join(temporary_dir, f'{dat_filename.replace(f"{self._folder}/", "")}') - with open(temporary_file_path, mode='wb') as f: - self._s3_client.download_file(self._bucket_name, dat_filename, f) - f.seek(0) - return temporary_file_path - - def backup_dat_file(self, dat_file_key: str, datetime_key: str): - # バックアップバケットにコピー - ultmarc_backup_bucket = UltmarcBackupBucket() - backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' - self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key) - # コピー元のファイルを削除 - self._s3_client.delete_file(self._bucket_name, dat_file_key) - - class ConfigBucket(S3Bucket): _bucket_name = environment.JSKULT_CONFIG_BUCKET diff --git a/ecs/jskult-batch-monthly/src/batch/batch_functions.py b/ecs/jskult-batch-monthly/src/batch/batch_functions.py index 27aac450..40cf84f2 100644 --- a/ecs/jskult-batch-monthly/src/batch/batch_functions.py +++ b/ecs/jskult-batch-monthly/src/batch/batch_functions.py @@ -5,23 +5,21 @@ from datetime import datetime from src.db.database import Database from src.error.exceptions import BatchOperationException, DBException -from src.system_var import constants -def get_batch_statuses() -> tuple[str, str, str]: +def get_batch_statuses() -> tuple[str, str]: """日付テーブルから、以下を取得して返す。 - バッチ処理中フラグ - - dump取得状況区分 - 処理日(YYYY/MM/DD) Raises: BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき Returns: - tuple[str, str]: [0]バッチ処理中フラグ、dump取得状況区分 + tuple[str, str]: [0]バッチ処理中フラグ,[1]処理日 """ db = Database.get_instance() - sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' + sql = 'SELECT bch_actf, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' try: db.connect() hdke_tbl_result = db.execute_select(sql) @@ -36,59 +34,11 @@ def get_batch_statuses() -> tuple[str, str, str]: # 必ず1件取れる hdke_tbl_record = hdke_tbl_result[0] batch_processing_flag = hdke_tbl_record['bch_actf'] - dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] syor_date = hdke_tbl_record['syor_date'] # 処理日を文字列に変換する syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') - return batch_processing_flag, dump_status_kbn, syor_date_str - - -def update_batch_processing_flag_in_processing() -> None: - """バッチ処理中フラグを処理中に更新する - - Raises: - BatchOperationException: DB操作の何らかのエラー - """ - db = Database.get_instance() - sql = 'UPDATE src05.hdke_tbl SET bch_actf = :in_processing' - try: - db.connect() - db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - return - - -def update_batch_process_complete() -> None: - """バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する - - Raises: - BatchOperationException: DB操作の何らかのエラー - """ - db = Database.get_instance() - sql = """\ - UPDATE src05.hdke_tbl - SET - bch_actf = :batch_complete, - dump_sts_kbn = :dump_unprocessed, - syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d') -- +1日 - """ - try: - db.connect() - db.execute(sql, { - 'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED, - 'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED - }) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - return + return batch_processing_flag, syor_date_str def logging_sql(logger: logging.Logger, sql: str) -> None: diff --git a/ecs/jskult-batch-monthly/src/batch/common/batch_context.py b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py index 8b76415a..6a05a423 100644 --- a/ecs/jskult-batch-monthly/src/batch/common/batch_context.py +++ b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py @@ -1,10 +1,9 @@ class BatchContext: __instance = None - __syor_date: str # 処理日(yyyy/mm/dd形式) - __is_not_business_monthly: bool # 月次バッチ起動日フラグ + __is_arisj_output_day: bool # 月次バッチ起動日フラグ def __init__(self) -> None: - self.__is_not_business_monthly = False + self.__is_arisj_output_day = False @classmethod def get_instance(cls): @@ -13,25 +12,9 @@ class BatchContext: return cls.__instance @property - def syor_date(self): - return self.__syor_date + def is_arisj_output_day(self): + return self.__is_arisj_output_day - @syor_date.setter - def syor_date(self, syor_date_str: str): - self.__syor_date = syor_date_str - - @property - def is_not_business_monthly(self): - return self.__is_not_business_monthly - - @is_not_business_monthly.setter - def is_not_business_monthly(self, flag: bool): - self.__is_not_business_monthly = flag - - @property - def is_ultmarc_imported(self): - return self.__is_ultmarc_imported - - @is_ultmarc_imported.setter - def is_ultmarc_imported(self, flag: bool): - self.__is_ultmarc_imported = flag + @is_arisj_output_day.setter + def is_arisj_output_day(self, flag: bool): + self.__is_arisj_output_day = flag diff --git a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py b/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py deleted file mode 100644 index 2a8d4c06..00000000 --- a/ecs/jskult-batch-monthly/src/batch/jskult_batch_monthly.py +++ /dev/null @@ -1,278 +0,0 @@ - -from datetime import datetime - -from src.db.database import Database -from src.error.exceptions import BatchOperationException -from src.logging.get_logger import get_logger -import os -import tempfile -import os.path as path -import boto3 - -logger = get_logger('実消化&アルトマーク月次バッチ') - -# WKテーブルの過去分削除SQL -PHYSICAL_NORMAL_DELETE_QUERY = """\ - DELETE FROM src05.wk_inst_aris_if -""" - -# 正常系データを取得しWKテーブルに保存SQL -NORMAL_INSERT_SELECT_QUERY = """\ - INSERT src05.wk_inst_aris_if - SELECT - TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form - ,TRIM(' ' FROM TRIM(' ' FROM ci.prefc_cd)) AS pref_cd - ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(cp.prefc_name,1,8))) AS pref_name - ,TRIM(' ' FROM TRIM(' ' FROM ci.postal_number)) AS postal_cd - ,TRIM(' ' FROM TRIM(' ' FROM cc.city_name)) AS city_name - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_addr)) AS address - ,TRIM(' ' FROM TRIM(' ' FROM cd.inst_div_name)) - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_phone_number)) AS phone_no - ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_div_cd)) - ,TRIM(' ' FROM TRIM(' ' FROM ci.manage_cd)) - ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date - ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date - ,sysdate() - FROM src05.com_inst ci - LEFT JOIN src05.mst_prefc cp - ON ci.prefc_cd = cp.prefc_cd - LEFT JOIN src05.mst_city cc - ON ci.prefc_cd = cc.prefc_cd - AND ci.city_cd = cc.city_cd - LEFT OUTER JOIN src05.com_inst_div cd - ON ci.inst_div_cd = cd.inst_div_cd - WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' - AND ci.dcf_dsf_inst_cd IS NOT NULL - AND ci.form_inst_name_kanji IS NOT NULL - AND ci.prefc_cd IS NOT NULL - AND cp.prefc_name IS NOT NULL - AND cc.city_name IS NOT NULL - AND ci.inst_addr IS NOT NULL - ORDER BY ci.dcf_dsf_inst_cd -""" - -# 正常系データの件数を取得SQL -NORMAL_COUNT_QUERY = """\ - SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if -""" - -# 異常系WKテーブルの過去分削除SQL -PHYSICAL_ABNORMAL_DELETE_QUERY = """\ - DELETE FROM src05.wk_inst_aris_if_wrn -""" - -# 異常系データを取得しWKテーブルに保存SQL -ABNORMAL_INSERT_SELECT_QUERY = """\ - INSERT src05.wk_inst_aris_if_wrn - SELECT - TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form - ,TRIM(' ' FROM TRIM(' ' from ci.prefc_cd)) AS pref_cd - ,TRIM(' ' FROM TRIM(' ' from SUBSTR(cp.prefc_name,1,8))) AS pref_name - ,TRIM(' ' FROM TRIM(' ' from ci.postal_number)) AS postal_cd - ,TRIM(' ' FROM TRIM(' ' from cc.city_name)) AS city_name - ,TRIM(' ' FROM TRIM(' ' from ci.inst_addr)) AS address - ,TRIM(' ' FROM TRIM(' ' from cd.inst_div_name)) - ,TRIM(' ' FROM TRIM(' ' from ci.inst_phone_number)) AS phone_no - ,TRIM(' ' FROM TRIM(' ' from ci.inst_div_cd)) - ,TRIM(' ' FROM TRIM(' ' from ci.manage_cd)) - ,DATE_FORMAT(ci.sys_update_date,'%y%m%d') AS update_date - ,DATE_FORMAT(ci.abolish_ymd,'%y%m%d') AS delete_date - ,IF(ci.dcf_dsf_inst_cd IS NULL,'bi0402000001', NULL) AS wrnid_dcf_inst_cd - ,IF(ci.form_inst_name_kanji IS NULL,'bi0402000002', NULL) AS wrnid_inst_name_form - ,IF(ci.prefc_cd IS NULL,'bi0402000003', NULL) AS wrnid_pref_cd - ,IF(cp.prefc_name IS NULL,'bi0402000004', NULL) AS wrnid_pref_name - ,IF(cc.city_name IS NULL,'bi0402000005', NULL) AS wrnid_city_name - ,IF(ci.inst_addr IS NULL,'bi0402000006', NULL) AS wrnid_address - ,sysdate() - FROM src05.com_inst ci - LEFT JOIN src05.mst_prefc cp - ON ci.prefc_cd = cp.prefc_cd - LEFT JOIN src05.mst_city cc - ON ci.prefc_cd = cc.prefc_cd - AND ci.city_cd = cc.city_cd - LEFT OUTER JOIN src05.com_inst_div cd - ON ci.inst_div_cd = cd.inst_div_cd - WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' - AND( ci.dcf_dsf_inst_cd IS NULL - OR ci.form_inst_name_kanji IS NULL - OR ci.prefc_cd IS NULL - OR cp.prefc_name IS NULL - OR cc.city_name IS NULL - OR ci.inst_addr IS NULL) - ORDER BY ci.dcf_dsf_inst_cd -""" - -# 正常系データの件数を取得SQL -ABNORMAL_COUNT_QUERY = """\ - SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if_wrn -""" -# CSVファイルの作成用のSQL -SELECT_QUERY = """\ - SELECT dcf_inst_cd, inst_name_form, inst_name, inst_name_kana_form, pref_cd, pref_name, - postal_cd, city_name, address, inst_div_name, phone_no, inst_div_cd, manage_cd, - '', inst_delete_date - FROM src05.wk_inst_aris_if ORDER BY dcf_inst_cd -""" - -create_date = datetime.now().strftime('%Y%m%d%H%M%S') -create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') -aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' -res_log = f'D0004{create_date}.log' -prg_id = 'PrgId:BI0402' -head_str = 'TC_HOSPITAL,TJ_HOSPITAL,TJ_HOSPITALSHORT,TK_HOSPITAL,TC_PREFECTURE,TJ_PREFECTURE,TJ_ZIPCODE,TJ_CITY,TJ_ADDRESS,\ -TJ_DEPARTMENT,TJ_TELEPHONENUMBER,TC_HOSPITALCAT,TC_HOSPITALTYPE,TS_UPDATE, TD_UPDATE' -start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。" -err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。" -csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。" -cnt_msg = "MsgID: Message: LogText:" -move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。" - - -def exec(): - """ 実消化&アルトマーク月次バッチ """ - try: - # 実行ログに書き込む - resLog = make_log_data() - resLog_f = resLog[0] - log_file_path = resLog[1] - resLog_f.write(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}\n') - logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') - - db = Database.get_instance() - # DB接続 - db.connect() - # トランザクションの開始 - db.begin() - - # 正常系データの反映 - # 過去分は不要のため、デリート - db.execute(PHYSICAL_NORMAL_DELETE_QUERY) - - # 正常系データを取得しWKテーブルに保存する。 - db.execute(NORMAL_INSERT_SELECT_QUERY) - - # 正常系データの件数を取得 - record_count = db.execute_select(NORMAL_COUNT_QUERY) - suc_count = record_count[0]['countNum'] - - # 警告系データの反映 - # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 - db.execute(PHYSICAL_ABNORMAL_DELETE_QUERY) - - # 異常系データを取得しWKテーブルに保存する。 - db.execute(ABNORMAL_INSERT_SELECT_QUERY) - - # 異常系データの件数を取得 - record_count = db.execute_select(ABNORMAL_COUNT_QUERY) - wrn_count = record_count[0]['countNum'] - - # CSVファイルの作成用のSQL実行 - record_csv = db.execute_select(SELECT_QUERY) - - # CSVファイル作成 - csv_file_path = make_csv_data(record_csv, resLog_f) - - # トランザクションの終了 - db.commit() - - # 実行ログファイルの追記 - # 実行ログに処理件数を書き込む。 - sum_count = suc_count + wrn_count - resLog_f.write(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})\n') - logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') - - # CSVファイル移動処理 - s3_csv_upload_data(csv_file_path, resLog_f) - - # 実行ログファイルクローズ - resLog_f.close() - - # logファイル移動処理 - s3_log_upload_data(log_file_path) - - logger.info('実消化&アルトマーク月次バッチ処理: 終了') - except Exception as e: - logger.info(f'{create_date_format}[DWH][5][INFO]{e.message}') - raise BatchOperationException(e) - - finally: - # 終了時に必ずコミットする - db.commit() - db.disconnect() - - -def make_csv_data(record_csv: list, resLog_f): - # 一時ファイルとして保存する(CSVファイル) - try: - - temporary_dir = tempfile.mkdtemp() - csv_file_path = path.join(temporary_dir, aris_create_csv) - - # ヘッダ行書き込み - fp = open(csv_file_path, mode='w') - fp.write(f'{head_str}\n') - - # データ部分書き込み - for record_data in record_csv: - record_value = list(record_data.values()) - record_value = ['' if n is None else n for n in record_value] - csv_data = ",".join(map(str, record_value)) - fp.write(f'{csv_data}\n') - - # ファイルクローズ - fp.close() - except Exception as e: - resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}\n') - resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}\n') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') - raise e - - return csv_file_path - - -def make_log_data(): - # 一時ファイルとして保存する(ログファイル) - temporary_dir = tempfile.mkdtemp() - log_file_path = path.join(temporary_dir, res_log) - fp = open(log_file_path, mode='w') - return fp, log_file_path - - -def s3_csv_upload_data(csv_file_path, resLog_f): - # s3にログファイルとCSVファイルをUPする - Bucket = os.environ['ARISJ_DATA_BUCKET'] - folder = os.environ['ARISJ_DATA_FOLDER'] - csv_file_name = f'{folder}/{aris_create_csv}' - s3_client = boto3.client('s3') - - try: - s3_client.upload_file(csv_file_path, Bucket, csv_file_name) - except Exception as e: - resLog_f.write(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}\n') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') - raise e - - return - - -def s3_log_upload_data(log_file_path): - # s3にログファイルとCSVファイルをUPする - Bucket = os.environ['ARISJ_DATA_BUCKET'] - folder = os.environ['ARISJ_DATA_FOLDER'] - log_file_name = f'{folder}/{res_log}' - s3_client = boto3.client('s3') - - try: - s3_client.upload_file(log_file_path, Bucket, log_file_name) - except Exception as e: - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') - raise e - - return diff --git a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py new file mode 100644 index 00000000..0deec661 --- /dev/null +++ b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py @@ -0,0 +1,361 @@ + +from datetime import datetime + +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.aws.s3 import S3Client +from src.logging.get_logger import get_logger +import tempfile +import os +import os.path as path +import logging +import csv + +logger = get_logger('実消化&アルトマーク月次バッチ') + +create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') +prg_id = 'PrgId:BI0402' +create_date = datetime.now().strftime('%Y%m%d%H%M%S') +aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' +res_log = f'D0004{create_date}.log' +sql_err_msg = "MsgID:999999000002 Message:SQL実行エラーです。" +move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。" + + +def exec(): + """ 実消化&アルトマーク月次バッチ """ + try: + + start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。" + cnt_msg = "MsgID: Message: LogText:" + + # 実行ログに書き込む + resLog, log_file_path = make_log_data() + resLog.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') + logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') + + db = Database.get_instance() + # DB接続 + db.connect() + # トランザクションの開始 + db.begin() + + # 正常系データの反映 + # 過去分は不要のため、デリート + physical_normal_delete(db) + + # 正常系データを取得しWKテーブルに保存する。 + normal_insert_into(db) + + # 正常系データの件数を取得 + suc_count = normal_count(db) + + # 警告系データの反映 + # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 + physical_abnormal_delete(db) + + # 異常系データを取得しWKテーブルに保存する。 + abnormal_insert_into(db) + + # 異常系データの件数を取得 + wrn_count = abnormal_count(db) + + # CSVファイルの作成用のSQL実行 + record_csv = csv_data_select(db) + + # CSVファイル作成 + csv_file_path = make_csv_data(record_csv, resLog) + + # トランザクションの終了 + db.commit() + + # 実行ログファイルの追記 + # 実行ログに処理件数を書き込む。 + sum_count = suc_count + wrn_count + resLog.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') + logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') + + # CSVファイル移動処理 + s3_csv_upload_data(csv_file_path, resLog) + + # logファイル移動処理 + s3_log_upload_data(log_file_path) + + logger.info('実消化&アルトマーク月次バッチ処理: 終了') + except Exception as e: + logger.info(f'{create_date_format}[DWH][5][INFO]') + raise BatchOperationException(e) + + finally: + # 終了時に必ずコミットする + db.commit() + db.disconnect() + + +def physical_normal_delete(db): + # 過去分は不要のため、デリート + try: + # WKテーブルの過去分削除SQL + sql = """\ + DELETE FROM src05.wk_inst_aris_if + """ + db.execute(sql) + return + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def normal_insert_into(db): + # 正常系データを取得しWKテーブルに保存する。 + try: + # 正常系データを取得しWKテーブルに保存SQL + sql = """\ + INSERT src05.wk_inst_aris_if + SELECT + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' FROM ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' FROM SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' FROM cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' FROM cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' FROM ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' FROM ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%Y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%Y%m%d') AS delete_date + ,sysdate() + FROM src05.com_inst ci + LEFT JOIN src05.mst_prefc cp + ON ci.prefc_cd = cp.prefc_cd + LEFT JOIN src05.mst_city cc + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd + LEFT OUTER JOIN src05.com_inst_div cd + ON ci.inst_div_cd = cd.inst_div_cd + WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' + AND ci.dcf_dsf_inst_cd IS NOT NULL + AND ci.form_inst_name_kanji IS NOT NULL + AND ci.prefc_cd IS NOT NULL + AND cp.prefc_name IS NOT NULL + AND cc.city_name IS NOT NULL + AND ci.inst_addr IS NOT NULL + ORDER BY ci.dcf_dsf_inst_cd + """ + + db.execute(sql) + return + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def normal_count(db): + # 正常系データの件数を取得 + try: + # 正常系データの件数を取得SQL + sql = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if + """ + record_count = db.execute_select(sql) + return record_count[0]['countNum'] + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def physical_abnormal_delete(db): + # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 + try: + # 異常系WKテーブルの過去分削除SQL + sql = """\ + DELETE FROM src05.wk_inst_aris_if_wrn + """ + + db.execute(sql) + return + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def abnormal_insert_into(db): + # 異常系データを取得しWKテーブルに保存する。 + try: + # 異常系データを取得しWKテーブルに保存SQL + sql = """\ + INSERT src05.wk_inst_aris_if_wrn + SELECT + TRIM(' ' FROM TRIM(' ' FROM SUBSTRING(ci.dcf_dsf_inst_cd,3))) AS dcf_inst_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kanji,1,50))) AS inst_name_form + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.inst_name_kanji,1,10))) AS inst_name + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(ci.form_inst_name_kana,1,80))) AS inst_name_kana_form + ,TRIM(' ' FROM TRIM(' ' from ci.prefc_cd)) AS pref_cd + ,TRIM(' ' FROM TRIM(' ' from SUBSTR(cp.prefc_name,1,8))) AS pref_name + ,TRIM(' ' FROM TRIM(' ' from ci.postal_number)) AS postal_cd + ,TRIM(' ' FROM TRIM(' ' from cc.city_name)) AS city_name + ,TRIM(' ' FROM TRIM(' ' from ci.inst_addr)) AS address + ,TRIM(' ' FROM TRIM(' ' from cd.inst_div_name)) + ,TRIM(' ' FROM TRIM(' ' from ci.inst_phone_number)) AS phone_no + ,TRIM(' ' FROM TRIM(' ' from ci.inst_div_cd)) + ,TRIM(' ' FROM TRIM(' ' from ci.manage_cd)) + ,DATE_FORMAT(ci.sys_update_date,'%Y%m%d') AS update_date + ,DATE_FORMAT(ci.abolish_ymd,'%Y%m%d') AS delete_date + ,IF(ci.dcf_dsf_inst_cd IS NULL,'bi0402000001', NULL) AS wrnid_dcf_inst_cd + ,IF(ci.form_inst_name_kanji IS NULL,'bi0402000002', NULL) AS wrnid_inst_name_form + ,IF(ci.prefc_cd IS NULL,'bi0402000003', NULL) AS wrnid_pref_cd + ,IF(cp.prefc_name IS NULL,'bi0402000004', NULL) AS wrnid_pref_name + ,IF(cc.city_name IS NULL,'bi0402000005', NULL) AS wrnid_city_name + ,IF(ci.inst_addr IS NULL,'bi0402000006', NULL) AS wrnid_address + ,sysdate() + FROM src05.com_inst ci + LEFT JOIN src05.mst_prefc cp + ON ci.prefc_cd = cp.prefc_cd + LEFT JOIN src05.mst_city cc + ON ci.prefc_cd = cc.prefc_cd + AND ci.city_cd = cc.city_cd + LEFT OUTER JOIN src05.com_inst_div cd + ON ci.inst_div_cd = cd.inst_div_cd + WHERE ci.dcf_dsf_inst_cd NOT LIKE '%9999999%' + AND( ci.dcf_dsf_inst_cd IS NULL + OR ci.form_inst_name_kanji IS NULL + OR ci.prefc_cd IS NULL + OR cp.prefc_name IS NULL + OR cc.city_name IS NULL + OR ci.inst_addr IS NULL) + ORDER BY ci.dcf_dsf_inst_cd + """ + + db.execute(sql) + return + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def abnormal_count(db): + # 異常系データの件数を取得 + try: + # 異常系データの件数を取得SQL + sql = """\ + SELECT COUNT(*) AS countNum FROM src05.wk_inst_aris_if_wrn + """ + + record_count = db.execute_select(sql) + + return record_count[0]['countNum'] + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def csv_data_select(db): + # CSVファイルの作成用のSQL実行 + try: + # CSVファイルの作成用のSQL + sql = """\ + SELECT dcf_inst_cd, inst_name_form, inst_name, inst_name_kana_form, pref_cd, pref_name, + postal_cd, city_name, address, inst_div_name, phone_no, inst_div_cd, manage_cd, + '', inst_delete_date + FROM src05.wk_inst_aris_if ORDER BY dcf_inst_cd + """ + + return db.execute_select(sql) + except Exception as e: + logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + raise e + + +def make_csv_data(record_csv: list, resLog): + # 一時ファイルとして保存する(CSVファイル) + try: + err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。" + csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。" + + temporary_dir = tempfile.mkdtemp() + csv_file_path = path.join(temporary_dir, aris_create_csv) + + head_str = ['TC_HOSPITAL', 'TJ_HOSPITAL', 'TJ_HOSPITALSHORT', 'TK_HOSPITAL', + 'TC_PREFECTURE', 'TJ_PREFECTURE', 'TJ_ZIPCODE', 'TJ_CITY', 'TJ_ADDRESS', 'TJ_DEPARTMENT', + 'TJ_TELEPHONENUMBER', 'TC_HOSPITALCAT', 'TC_HOSPITALTYPE', 'TS_UPDATE', ' TD_UPDATE'] + + # Shift-JIS、CRLF、価囲いありで書き込む + with open(csv_file_path, mode='w', encoding='cp932') as csv_file: + writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', + quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, + strict=True + ) + # ヘッダ行書き込み + writer.writerow(head_str) + # データ部分書き込み + for record_data in record_csv: + record_value = list(record_data.values()) + csv_data = ['' if n is None else n for n in record_value] + writer.writerow(csv_data) + + except Exception as e: + resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') + resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') + raise e + + return csv_file_path + + +def make_log_data(): + # 一時ファイルとして保存する(ログファイル) + temporary_dir = tempfile.mkdtemp() + log_file_path = path.join(temporary_dir, res_log) + + # ロガーの生成 + resLog = logging.getLogger('resLog') + # 出力レベルの設定 + resLog.setLevel(logging.INFO) + # ハンドラの生成 + resLog_handler = logging.FileHandler(log_file_path) + # ロガーにハンドラを登録 + resLog.addHandler(resLog_handler) + # フォーマッタの生成 + fmt = logging.Formatter('%(message)s') + # ハンドラにフォーマッタを登録 + resLog_handler.setFormatter(fmt) + + return resLog, log_file_path + + +def s3_csv_upload_data(csv_file_path, resLog): + # s3にCSVファイルをUPする + Bucket = os.environ['ARISJ_DATA_BUCKET'] + folder = os.environ['ARISJ_DATA_FOLDER'] + csv_file_name = f'{folder}/{aris_create_csv}' + s3_client = S3Client() + + try: + s3_client.upload_file(csv_file_path, Bucket, csv_file_name) + except Exception as e: + resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') + raise e + + return + + +def s3_log_upload_data(log_file_path): + # s3にログファイルをUPする + Bucket = os.environ['ARISJ_DATA_BUCKET'] + folder = os.environ['ARISJ_DATA_FOLDER'] + log_file_name = f'{folder}/{res_log}' + s3_client = S3Client() + + try: + s3_client.upload_file(log_file_path, Bucket, log_file_name) + except Exception as e: + logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') + raise e + + return diff --git a/ecs/jskult-batch-monthly/src/batch/parallel_processes.py b/ecs/jskult-batch-monthly/src/batch/parallel_processes.py deleted file mode 100644 index 0fb2d715..00000000 --- a/ecs/jskult-batch-monthly/src/batch/parallel_processes.py +++ /dev/null @@ -1,32 +0,0 @@ -"""並列処理""" - -import concurrent.futures - -from src.batch.bio_sales import create_bio_sales_lot -from src.batch.laundering import sales_laundering -from src.error.exceptions import BatchOperationException - - -def exec(): - # 並列処理を開始 - with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: - - # 実績更新 - future_sales_laundering = executor.submit(sales_laundering.exec) - # 生物由来ロット分解 - future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec) - - # 両方の処理が完了するまで待つ - concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot]) - - # エラーがあれば呼び出し元でキャッチする - sales_laundering_exc = future_sales_laundering.exception() - create_bio_sales_lot_exc = future_create_bio_sales_lot.exception() - - # いずれかにエラーが発生していれば、1つのエラーとして返す。 - if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None: - sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else '' - create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else '' - raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}') - - return diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py index fdb7d0c1..dba5fac4 100644 --- a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -1,15 +1,13 @@ """実消化&アルトマーク 月次バッチ処理""" from src.aws.s3 import ConfigBucket -from src.batch.batch_functions import ( - get_batch_statuses, update_batch_process_complete, - update_batch_processing_flag_in_processing) +from src.batch.batch_functions import get_batch_statuses from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants -from src.batch import jskult_batch_monthly +from src.batch import output_arisj_file_process logger = get_logger('月次処理コントロール') @@ -22,64 +20,42 @@ def exec(): logger.info('月次バッチ:開始') try: # 月次バッチ処置中フラグ、dump処理状態区分、処理日を取得 - batch_processing_flag, dump_status_kbn, syor_date = get_batch_statuses() + batch_processing_flag, syor_date = get_batch_statuses() except BatchOperationException as e: logger.exception(f'日付テーブル取得(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 月次バッチ処理中の場合、後続の処理は行わない + # 日次バッチ処理中の場合、後続の処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: - logger.error('バッチ処理中のため、月次バッチ処理を終了します。') - return constants.BATCH_EXIT_CODE_SUCCESS - - # dump取得が正常終了していない場合、後続の処理は行わない - if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE: - logger.error('dump取得が正常終了していないため、月次バッチ処理を終了します。') + logger.error('日次バッチ処理中のため、月次バッチ処理を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS logger.info(f'処理日={syor_date}') - # バッチ共通設定に処理日を追加 - batch_context.syor_date = syor_date # 稼働日かかどうかを、実消化&アルトマーク月次バッチ稼働日ファイルをダウンロードして判定 try: arisj_output_day_list_file_path = ConfigBucket().download_arisj_output_day_list() arisj_output_day_calendar = CalendarFile(arisj_output_day_list_file_path) - batch_context.is_not_business_monthly = arisj_output_day_calendar.compare_date(syor_date) + batch_context.is_arisj_output_day = arisj_output_day_calendar.compare_date(syor_date) except Exception as e: logger.exception(f'実消化&アルトマーク月次バッチ稼働日ファイルの読み込みに失敗しました。{e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 調査目的でV実消化稼働日かどうかをログ出力 - logger.debug(f'本日は{"実消化&アルトマーク月次バッチ稼働日です。" if batch_context.is_not_business_monthly else "実消化&アルトマーク月次バッチ非稼働日です。"}') - - # バッチ処理中に更新 - try: - update_batch_processing_flag_in_processing() - except BatchOperationException as e: - logger.exception(f'処理フラグ更新(未処理→処理中) エラー(異常終了){e}') + # 調査目的で実消化&アルトマーク月次バッチ稼働日かどうかをログ出力 + if batch_context.is_arisj_output_day: + logger.info('本日は実消化&アルトマーク月次バッチ稼働日です。') + else: + logger.info('月次バッチは行われませんでした。') return constants.BATCH_EXIT_CODE_SUCCESS try: logger.info('月次バッチ:起動') - jskult_batch_monthly.exec() + output_arisj_file_process.exec() logger.info('月次バッチ:終了') except BatchOperationException as e: logger.exception(f'月次バッチ処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 調査目的で月次バッチが行われたかどうかをログ出力 - logger.debug(f'{"月次バッチが行われました。" if batch_context.is_not_business_monthly else "月次バッチが行われませんでした。"}') - - # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 - logger.info('業務日付更新・バッチステータスリフレッシュ:起動') - try: - update_batch_process_complete() - except BatchOperationException as e: - logger.exception(f'業務日付更新・バッチステータスリフレッシュ エラー(異常終了){e}') - return constants.BATCH_EXIT_CODE_SUCCESS - logger.info('業務日付更新・バッチステータスリフレッシュ:終了') - # 正常終了を保守ユーザーに通知 logger.info('[NOTICE]月次バッチ:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-batch-monthly/src/system_var/constants.py b/ecs/jskult-batch-monthly/src/system_var/constants.py index 8a0ccbb3..aaa8a3c0 100644 --- a/ecs/jskult-batch-monthly/src/system_var/constants.py +++ b/ecs/jskult-batch-monthly/src/system_var/constants.py @@ -1,17 +1,8 @@ # バッチ正常終了コード BATCH_EXIT_CODE_SUCCESS = 0 -# バッチ処理中フラグ:未処理 -BATCH_ACTF_BATCH_UNPROCESSED = '0' # バッチ処理中フラグ:処理中 BATCH_ACTF_BATCH_IN_PROCESSING = '1' -# dump取得状態区分:未処理 -DUMP_STATUS_KBN_UNPROCESSED = '0' -# dump取得状態区分:dump取得正常終了 -DUMP_STATUS_KBN_COMPLETE = '2' # カレンダーファイルのコメントシンボル CALENDAR_COMMENT_SYMBOL = '#' - -# 月曜日(datetime.weekday()で月曜日を表す数字) -WEEKDAY_MONDAY = 0 diff --git a/ecs/jskult-batch-monthly/src/system_var/environment.py b/ecs/jskult-batch-monthly/src/system_var/environment.py index 25afc294..c98503dd 100644 --- a/ecs/jskult-batch-monthly/src/system_var/environment.py +++ b/ecs/jskult-batch-monthly/src/system_var/environment.py @@ -8,14 +8,14 @@ DB_PASSWORD = os.environ['DB_PASSWORD'] DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS -ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET'] -ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER'] +ARISJ_DATA_BUCKET = os.environ['ARISJ_DATA_BUCKET'] JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] -ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] +ARISJ_DATA_FOLDER = os.environ['ARISJ_DATA_FOLDER'] +ARISJ_BACKUP_FOLDER = os.environ['ARISJ_BACKUP_FOLDER'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] -JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME'] +ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 2d56d8242013621b95dc6f86484e313bf42370a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 29 Jun 2023 10:53:04 +0900 Subject: [PATCH 409/962] =?UTF-8?q?feat:=20=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=81=E5=BC=95=E6=95=B0=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=81=E4=BE=8B=E5=A4=96=E5=87=A6=E7=90=86?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stored_procedure/src05/hco_to_mdb_laundering.sql | 4 ++-- .../stored_procedure/src05/inst_merge_laundering.sql | 4 ++-- rds_mysql/stored_procedure/src05/sales_lau_delete.sql | 8 +++++--- rds_mysql/stored_procedure/src05/sales_lau_upsert.sql | 9 +++++---- .../stored_procedure/src05/v_inst_merge_laundering.sql | 6 ++---- rds_mysql/stored_procedure/src05/whs_org_laundering.sql | 4 ++-- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql index 8201f3bc..eacd56e9 100644 --- a/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql +++ b/rds_mysql/stored_procedure/src05/hco_to_mdb_laundering.sql @@ -7,7 +7,7 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'hco_to_mdb_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); -- 例外処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -18,7 +18,7 @@ BEGIN 'hco_to_mdb_launderingでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); diff --git a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql index 05908ca1..39f6e431 100644 --- a/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/inst_merge_laundering.sql @@ -7,7 +7,7 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'inst_merge_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); -- 例外処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -18,7 +18,7 @@ BEGIN 'inst_merge_launderingでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); diff --git a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql index 8b312d6f..39e8f065 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_delete.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_delete.sql @@ -7,7 +7,8 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_delete'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table, + 'laundering_period_year', laundering_period_year); -- 例外処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -18,7 +19,7 @@ BEGIN 'sales_lau_deleteでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); @@ -39,7 +40,8 @@ BEGIN "; SET @delete_data = REPLACE(@delete_data, "$$target_table$$", target_table); PREPARE delete_data_stmt from @delete_data; - EXECUTE delete_data_stmt USING @laundering_period_year; + 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年以前のデータ削除① 終了'); diff --git a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql index 72a86310..56758f18 100644 --- a/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql +++ b/rds_mysql/stored_procedure/src05/sales_lau_upsert.sql @@ -1,6 +1,6 @@ -- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -CREATE PROCEDURE src05.sales_lau_upsert(target_table VARCHAR(255), extract_from_date date, - extract_to_date date) +CREATE PROCEDURE src05.sales_lau_upsert(target_table VARCHAR(255), extract_from_date DATE, + extract_to_date DATE) SQL SECURITY INVOKER BEGIN -- スキーマ名 @@ -8,7 +8,8 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'sales_lau_upsert'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + 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 @@ -19,7 +20,7 @@ BEGIN 'sales_lau_upsertでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); diff --git a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql index 06af3867..db50980a 100644 --- a/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql +++ b/rds_mysql/stored_procedure/src05/v_inst_merge_laundering.sql @@ -7,7 +7,7 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'v_inst_merge_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); -- 例外処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -18,7 +18,7 @@ BEGIN 'v_inst_merge_launderingでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); @@ -43,8 +43,6 @@ BEGIN prft_cd FROM internal05.v_inst_merge_t - WHERE - (fcl_type IN ('A1', 'A0')) OR fcl_type BETWEEN '20' AND '29' ) AS vimt, $$target_table$$ AS tt SET diff --git a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql index e183d0c8..aad11100 100644 --- a/rds_mysql/stored_procedure/src05/whs_org_laundering.sql +++ b/rds_mysql/stored_procedure/src05/whs_org_laundering.sql @@ -7,7 +7,7 @@ BEGIN -- プロシージャ名 DECLARE procedure_name VARCHAR(100) DEFAULT 'whs_org_laundering'; -- プロシージャの引数 - DECLARE procedure_args JSON DEFAULT JSON_OBJECT(); + DECLARE procedure_args JSON DEFAULT JSON_OBJECT('target_table', target_table); -- 例外処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -18,7 +18,7 @@ BEGIN 'whs_org_launderingでエラーが発生', @error_state, @error_msg); SET @error_msg = ( CASE - WHEN LENGTH(@error_msg) > 127 THEN CONCAT(SUBSTRING(@error_msg, 1, 124), '...') + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') ELSE @error_msg END ); From 901e6e9cd9d238675da904e7fc069e20da0ae4f9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 14:56:40 +0900 Subject: [PATCH 410/962] =?UTF-8?q?feat:=20=E3=83=A1=E3=83=8B=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E7=94=BB=E9=9D=A2=E3=81=AEdump=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E7=8A=B6=E6=85=8B=E5=8C=BA=E5=88=86=E3=81=AB=E3=82=88=E3=82=8B?= =?UTF-8?q?=E5=88=B6=E5=BE=A1=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/menu.py | 2 ++ ecs/jskult-webapp/src/model/db/hdke_tbl.py | 1 + ecs/jskult-webapp/src/model/view/menu_view_model.py | 7 ++++++- ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py | 2 +- ecs/jskult-webapp/src/static/css/menuStyle.css | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 3 +++ ecs/jskult-webapp/src/templates/menu.html | 8 +++++--- 7 files changed, 19 insertions(+), 6 deletions(-) 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/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/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/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/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/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 899c19e5..b7ffa0e2 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -1,5 +1,8 @@ import os.path as path +BATCH_STATUS_PROCESSING = '1' +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') diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index b8026593..bbfca152 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -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 From dbe7b3e007f4f89ff962e2e9871029cdd61fab0a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 15:34:33 +0900 Subject: [PATCH 411/962] =?UTF-8?q?feat:=20=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=86=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 60 +++++++++++++++++++ ecs/jskult-webapp/src/main.py | 4 +- .../view/master_mainte_menu_view_model.py | 5 ++ .../src/services/batch_status_service.py | 16 ++++- ecs/jskult-webapp/src/system_var/constants.py | 4 ++ .../src/templates/masterMainteMenu.html | 25 ++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 7 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-webapp/src/controller/master_mainte.py create mode 100644 ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py create mode 100644 ecs/jskult-webapp/src/templates/masterMainteMenu.html 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..ad5eb3e1 --- /dev/null +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -0,0 +1,60 @@ +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.master_mainte_menu_view_model import \ + MasterMainteMenuViewModel +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 diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index 2aca351c..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, ultmarc) + 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 @@ -31,6 +31,8 @@ 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/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..c8ff644a --- /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/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/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index b7ffa0e2..604acfe5 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -1,6 +1,8 @@ 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') @@ -115,6 +117,7 @@ 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' @@ -125,6 +128,7 @@ LOGOUT_REASON_MESSAGE_MAP = { 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するか、
管理者にお問い合わせください。', diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html new file mode 100644 index 00000000..147ab2da --- /dev/null +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -0,0 +1,25 @@ + + + + {% with subtitle = menu.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index bbfca152..59eb8a74 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -29,7 +29,7 @@ {% elif menu.is_backup_processing() %}
バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテメニューは利用できません
{% else %} - マスターメンテメニュー

+ マスターメンテメニュー

{% endif %} {% endif %}

Logout From af13fa66553ac49d53448a8176b03a7ccbf3e223 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:13:04 +0900 Subject: [PATCH 412/962] =?UTF-8?q?fix:=20=E3=83=A1=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E9=80=9A=E7=9F=A5=E3=81=8C=E5=87=BA=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?SSO=E3=81=AF=E9=80=9A=E7=9F=A5=E3=81=95=E3=81=9B=E3=82=8B?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 09032af5..6d867645 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,10 +69,10 @@ 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() @@ -126,7 +126,7 @@ 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を取得 From cb1db32d2dfc05e8cf1fb57865018a250a38468d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:39:12 +0900 Subject: [PATCH 413/962] =?UTF-8?q?fix:=20=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=AB=E3=83=AC=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 6d867645..00e5cb75 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -79,6 +79,10 @@ def login( # 普通の認証だと、`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}') @@ -132,6 +136,11 @@ def sso_authorize( # トークンからユーザー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}') From ccd4ff79a9eb8033abd0aefe59dda2b727a1f9ed Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:13:04 +0900 Subject: [PATCH 414/962] =?UTF-8?q?fix:=20=E3=83=A1=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E9=80=9A=E7=9F=A5=E3=81=8C=E5=87=BA=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?SSO=E3=81=AF=E9=80=9A=E7=9F=A5=E3=81=95=E3=81=9B=E3=82=8B?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 09032af5..6d867645 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,10 +69,10 @@ 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() @@ -126,7 +126,7 @@ 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を取得 From d76b8d1c9332550239effe6e0c6d5c88b0aed986 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:39:12 +0900 Subject: [PATCH 415/962] =?UTF-8?q?fix:=20=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=AB=E3=83=AC=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 6d867645..00e5cb75 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -79,6 +79,10 @@ def login( # 普通の認証だと、`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}') @@ -132,6 +136,11 @@ def sso_authorize( # トークンからユーザー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}') From d18b12a0f62f87dcfafaf2c397b00f6f8a986e97 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 17:13:35 +0900 Subject: [PATCH 416/962] =?UTF-8?q?Revert=20"fix:=20=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=86=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E9=80=9A=E7=9F=A5=E3=81=8C=E5=87=BA=E3=81=A6?= =?UTF-8?q?=E3=81=97=E3=81=BE=E3=81=86=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82SSO=E3=81=AF=E9=80=9A=E7=9F=A5=E3=81=95=E3=81=9B?= =?UTF-8?q?=E3=82=8B=E3=80=82"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit af13fa66553ac49d53448a8176b03a7ccbf3e223. --- ecs/jskult-webapp/src/controller/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 00e5cb75..d8e7d569 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,10 +69,10 @@ def login( try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: - logger.info(f'ログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: - logger.info(f'ログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) verified_token = jwt_token.verify_token() @@ -130,7 +130,7 @@ def sso_authorize( # トークン検証 verified_token = jwt_token.verify_token() except JWTTokenVerifyException as e: - logger.exception(f'SSOログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) # トークンからユーザーIDを取得 From 4c3339fc24c68c707e4539efd60b0ec56eb811f8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 17:13:41 +0900 Subject: [PATCH 417/962] =?UTF-8?q?Revert=20"fix:=20=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=AB=E3=83=AC=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit cb1db32d2dfc05e8cf1fb57865018a250a38468d. --- ecs/jskult-webapp/src/controller/login.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index d8e7d569..09032af5 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -79,10 +79,6 @@ def login( # 普通の認証だと、`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}') @@ -136,11 +132,6 @@ def sso_authorize( # トークンからユーザー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}') From c5d66c6d25e99463ba7f01a2a1259557cbb2d2ab Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 10:44:00 +0900 Subject: [PATCH 418/962] =?UTF-8?q?fix:=20=E7=94=BB=E9=9D=A2=E5=88=A9?= =?UTF-8?q?=E7=94=A8=E5=8F=AF=E5=90=A6=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AF?= =?UTF-8?q?NULL=E3=81=8C=E8=A8=B1=E5=AE=B9=E3=81=95=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=80=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/user_view_model.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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): From 646dd4f7d9b1f606b5c423dd0e5aef9a9bc1dba3 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 14:57:34 +0900 Subject: [PATCH 419/962] =?UTF-8?q?fix:=20=E6=96=87=E8=A8=80=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/view/master_mainte_menu_view_model.py | 2 +- ecs/jskult-webapp/src/templates/masterMainteMenu.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 index c8ff644a..2b1629b1 100644 --- 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 @@ -2,4 +2,4 @@ from pydantic import BaseModel class MasterMainteMenuViewModel(BaseModel): - subtitle: str = 'MeDaCA 機能メニュー' + subtitle: str = 'MeDaCA マスターメンテメニュー' diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 147ab2da..987615bf 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -7,7 +7,7 @@
-

MeDaCA
マスタメンテメニュー

+

MeDaCA
マスターメンテメニュー



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

From 535ae8fa482d601da6d7e6154edecc2aeda37d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 30 Jun 2023 15:15:55 +0900 Subject: [PATCH 420/962] =?UTF-8?q?feat:=20=E4=BB=95=E6=A7=98=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index ab4d107a..816a0545 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -55,12 +55,14 @@ def _set_disabled_dct_inst_merge(db: Database): _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') -def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: - # 納入先処方元マスタから、DCF施設コードに対応した領域コードの取得 +def _select_ult_ident_presc_dcf_inst_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 納入先処方元マスタから、DCF施設コードに対応したレコードの取得 try: sql = """ SELECT - ta_cd + ta_cd, + ult_ident_cd, + ratio FROM src05.ult_ident_presc WHERE @@ -70,9 +72,9 @@ def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: params = {'dcf_inst_cd': dcf_inst_cd} ult_ident_presc_ta_cd_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('納入先処方元マスタから領域コードの取得に成功') + logger.info('納入先処方元マスタからDCF施設コードに対応したレコードの取得に成功') except Exception as e: - logger.debug('納入先処方元マスタから領域コードの取得に失敗') + logger.debug('納入先処方元マスタからDCF施設コードに対応したレコードの取得に失敗') raise e return ult_ident_presc_ta_cd_records @@ -83,11 +85,12 @@ 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_ta_cd_records = _select_ult_ident_presc_ta_cd(db, enabled_merge_record['dcf_inst_cd']) - for ult_ident_presc_ta_cd_record in ult_ident_presc_ta_cd_records: - ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], + 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_ta_cd_record['ta_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}レコード目処理 開始') # 処方元コード=重複時相手先コードが発生した場合 @@ -554,7 +557,8 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: return emp_chg_inst_records -def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: +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 = """ @@ -572,6 +576,8 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_ 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 @@ -580,7 +586,13 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_ 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': ta_cd} + 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('納入先処方元マスタの取得 成功') From ae6aa29994fa8f5b14f6e272c8c4c56c81760231 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 15:26:24 +0900 Subject: [PATCH 421/962] =?UTF-8?q?feat:=20=E5=90=84=E3=83=9E=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=A1=E3=83=B3=E3=83=86=E7=94=BB=E9=9D=A2=E3=81=AE?= =?UTF-8?q?=E5=81=B4=E3=81=A0=E3=81=91=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 125 ++++++++++++++++++ .../view/inst_emp_csv_download_view_model.py | 5 + .../view/inst_emp_csv_upload_view_model.py | 5 + .../model/view/table_override_view_model.py | 5 + .../src/templates/instEmpCsvDL.html | 13 ++ .../src/templates/instEmpCsvUL.html | 13 ++ .../src/templates/masterMainteMenu.html | 2 +- .../src/templates/tableOverride.html | 13 ++ 8 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/table_override_view_model.py create mode 100644 ecs/jskult-webapp/src/templates/instEmpCsvDL.html create mode 100644 ecs/jskult-webapp/src/templates/instEmpCsvUL.html create mode 100644 ecs/jskult-webapp/src/templates/tableOverride.html diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index ad5eb3e1..b8b8e087 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -4,8 +4,13 @@ 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 @@ -58,3 +63,123 @@ def menu_view( 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 new_inst_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/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/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/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html new file mode 100644 index 00000000..07712d73 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -0,0 +1,13 @@ + + + + {% 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..bdd305d8 --- /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/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 987615bf..957279fa 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -10,7 +10,7 @@

MeDaCA
マスターメンテメニュー



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

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

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

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

テーブル上書きコピー

+ + From ef6a079467681146d777700ff88f7630593c2c9b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 16:34:56 +0900 Subject: [PATCH 422/962] =?UTF-8?q?fix:=20=E3=83=A1=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=8A=E3=83=B3=E3=82=B9=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B0=E3=82=A4=E3=83=B3=E6=99=82=E3=80=81?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=81=8C=E8=A6=8B=E3=81=A4?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=81=AA=E3=81=84=E3=81=A8=E3=81=8D=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=A2=E3=82=A6=E3=83=88=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=83=A1=E3=83=B3=E3=83=86=E3=83=8A=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E7=94=BB=E9=9D=A2=E3=81=AB=E6=88=BB=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/logout.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 79de281c..4f30d802 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -22,11 +22,15 @@ def logout_view( reason: Optional[str] = None, session: Union[UserSession, None] = Depends(verify_session) ): + # どういうルートでログインしたかを判断するため、refererを取得 + referer = request.headers.get('referer', '') + redirect_to = '/login/userlogin' link_text = 'MeDaCA機能メニューへ' - if session is not None and session.user_flg == '1': + if (session is not None and session.user_flg == '1') or referer.endswith('maintlogin'): redirect_to = '/login/maintlogin' link_text = 'Login画面に戻る' + logout = LogoutViewModel() logout.redirect_to = redirect_to logout.reason = constants.LOGOUT_REASON_MESSAGE_MAP.get(reason, '') From 7ba0ec99422fe137b8a51dc356695285df355976 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 16:36:10 +0900 Subject: [PATCH 423/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/logout.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 4f30d802..c841e48c 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -27,6 +27,7 @@ def logout_view( redirect_to = '/login/userlogin' link_text = 'MeDaCA機能メニューへ' + # セッションが切れておらず、メンテユーザである、またはメンテログイン画面から遷移した場合、メンテログイン画面に戻す if (session is not None and session.user_flg == '1') or referer.endswith('maintlogin'): redirect_to = '/login/maintlogin' link_text = 'Login画面に戻る' From 3bf951c632da508bbfdf8435bf5cf71c2cc6e137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 30 Jun 2023 16:55:31 +0900 Subject: [PATCH 424/962] =?UTF-8?q?feat:=20=E4=BE=8B=E5=A4=96=E5=87=A6?= =?UTF-8?q?=E7=90=86=E4=BF=AE=E6=AD=A3=E3=81=AE=E6=A8=AA=E5=B1=95=E9=96=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src05/inst_merge_t_create.sql | 118 ++++++++-------- .../src05/v_inst_merge_t_create.sql | 130 +++++++++--------- 2 files changed, 130 insertions(+), 118 deletions(-) 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/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 From b77eab5e7c82fbc0b2a4f8d9e9439aa703059724 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 18:27:11 +0900 Subject: [PATCH 425/962] =?UTF-8?q?NEWDWH2021-1130=20LOAD=E6=96=87?= =?UTF-8?q?=E3=81=AEWarning=E3=81=AF=E3=82=82=E3=81=86=E8=A6=8B=E3=81=AA?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index fa82805d..b345b0d8 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -23,6 +23,7 @@ class VjskDataLoadManager: try: db.connect() + db.execute("SET SESSION sql_mode = 'TRADITIONAL';") # orgをtruncate db.execute(f"TRUNCATE TABLE {table_name_org};") @@ -37,18 +38,6 @@ class VjskDataLoadManager: """ db.begin() result = db.execute(sql, {"src_file_name": src_file_name}) - logger.debug(sql) - result_w = db.execute("SHOW WARNINGS;") - has_mysql_warnings = False - for row in result_w.fetchall(): - # 例外スロー対象から除外 : Warning(1261) Row {ROW NUMBER} doesn't contain data for all columns - if len(row) >= 2 and row[0] == "Warning" and row[1] == 1261: - logger.info(f"SHOW WARNINGS (SKIP) : {row}") - continue - has_mysql_warnings = True - logger.info(f"SHOW WARNINGS : {row}") - if has_mysql_warnings: - raise Exception("LOAD文実行時にWARNINGが発生しました。") logger.info(f'{data_name}tsvファイルを{table_name_org}にLOAD : 件数({result.rowcount})') db.commit() From 9e6403dea521cfc95ced01e5ef3f6231d6ed6630 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 19:23:42 +0900 Subject: [PATCH 426/962] =?UTF-8?q?NEWDWH2021-1130=20tsv=E3=83=88=E3=83=81?= =?UTF-8?q?=E5=88=87=E3=82=8C=E5=88=A4=E5=AE=9A=E3=82=92LOAD=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E5=89=8D=E3=81=AB=E8=A6=8B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 27 +++++++++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 19 +++++++++++++ 2 files changed, 46 insertions(+) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index b345b0d8..3ef87186 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -60,6 +60,26 @@ class VjskDataLoadManager: logger.debug("_import_to_db done") return + def _get_tsv_last_row_tab_count(src_file_name: str) -> int: + # memo: tsvファイルが数百MBに及ぶことを想定して、末尾から1行分を参照する + # memo: 前提1 行区切りは LF('\n') + buf_count = 0 + + # バイナリモードでファイルオープン + with open(src_file_name, 'rb') as file: + # ファイルの末尾から2バイト手前に移動 + file.seek(-2, 2) + # 改行文字を見つけるまで逆方向に読み進める + while file.read(1) != b'\n': + # 1バイト戻って再度読み込み + file.seek(-2, 1) + # 末尾行を抽出 + last_line = file.readline().decode().rstrip('\n') + # 末尾行に含まれるタブ文字の数を抽出 + buf_count = last_line.count('\t') + + return buf_count + @classmethod def load(self, target: dict): logger.debug(f'load start target:{target}') @@ -67,6 +87,13 @@ class VjskDataLoadManager: # S3からローカルストレージにdownloadした登録対象のtsvファイルパスを取得 local_file_name = target["src_file_path"] + # tsvファイル末尾行のTABの数が総定数と一致しない場合は例外をスロー + tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) + expect_tabs = mapper.get_file_column_separators(target["condkey"]) + if tsv_tabs != expect_tabs: + msg = f"受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした local_file_name: {local_file_name}" + raise BatchOperationException(msg) + # データベース登録 self._import_to_db(local_file_name, target["condkey"]) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 352e2f91..19f70067 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -21,6 +21,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME = "data_name" _KEY_FILE_PREFIX = "file_prefix" _KEY_FILE_SUFFIX = "file_suffix" + _KEY_FILE_COLUMN_SEPARATORS = "file_column_separators" _KEY_ORG_TABLE = "org_table" _KEY_SRC_TABLE = "src_table" _KEY_UPSERT_SQL = "upsert_sql" @@ -30,6 +31,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "販売実績データ", _KEY_FILE_PREFIX: "slip_data_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "82", _KEY_ORG_TABLE: "org05.sales", _KEY_SRC_TABLE: "src05.sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -299,6 +301,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V卸ホールディングスマスタ", _KEY_FILE_PREFIX: "hld_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "10", _KEY_ORG_TABLE: "org05.hld_mst_v", _KEY_SRC_TABLE: "src05.hld_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -352,6 +355,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V卸マスタ", _KEY_FILE_PREFIX: "whs_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "15", _KEY_ORG_TABLE: "org05.whs_mst_v", _KEY_SRC_TABLE: "src05.whs_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -420,6 +424,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "Vメーカー卸組織展開表", _KEY_FILE_PREFIX: "mkr_org_horizon_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "45", _KEY_ORG_TABLE: "org05.mkr_org_horizon_v", _KEY_SRC_TABLE: "src05.mkr_org_horizon_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -578,6 +583,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V卸組織変換マスタ", _KEY_FILE_PREFIX: "org_cnv_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "10", _KEY_ORG_TABLE: "org05.org_cnv_mst_v", _KEY_SRC_TABLE: "src05.org_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -631,6 +637,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V取引区分マスタ", _KEY_FILE_PREFIX: "tran_kbn_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "8", _KEY_ORG_TABLE: "org05.tran_kbn_mst_v", _KEY_SRC_TABLE: "src05.tran_kbn_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -678,6 +685,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V施設マスタ", _KEY_FILE_PREFIX: "fcl_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "23", _KEY_ORG_TABLE: "org05.fcl_mst_v", _KEY_SRC_TABLE: "src05.fcl_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -770,6 +778,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V製品マスタ", _KEY_FILE_PREFIX: "phm_prd_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "27", _KEY_ORG_TABLE: "org05.phm_prd_mst_v", _KEY_SRC_TABLE: "src05.phm_prd_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -874,6 +883,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V製品価格マスタ", _KEY_FILE_PREFIX: "phm_price_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "9", _KEY_ORG_TABLE: "org05.phm_price_mst_v", _KEY_SRC_TABLE: "src05.phm_price_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -924,6 +934,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V施設統合マスタ", _KEY_FILE_PREFIX: "vop_hco_merge_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "3", _KEY_ORG_TABLE: "org05.vop_hco_merge_v", _KEY_SRC_TABLE: "src05.vop_hco_merge_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -956,6 +967,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "V卸得意先情報マスタ", _KEY_FILE_PREFIX: "whs_customer_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "16", _KEY_ORG_TABLE: "org05.whs_customer_mst_v", _KEY_SRC_TABLE: "src05.whs_customer_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1027,6 +1039,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "MDBコード変換表", _KEY_FILE_PREFIX: "mdb_conv_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "7", _KEY_ORG_TABLE: "org05.mdb_cnv_mst_v", _KEY_SRC_TABLE: "src05.mdb_cnv_mst_v", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1071,6 +1084,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "卸在庫データ", _KEY_FILE_PREFIX: "stock_slip_data_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "28", _KEY_ORG_TABLE: "org05.whole_stock", _KEY_SRC_TABLE: "src05.whole_stock", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1178,6 +1192,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "生物由来データ", _KEY_FILE_PREFIX: "bio_slip_data_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "77", _KEY_ORG_TABLE: "org05.bio_sales", _KEY_SRC_TABLE: "src05.bio_sales", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1432,6 +1447,7 @@ class VjskReceiveFileMapper: _KEY_DATA_NAME: "ロットマスタデータ", _KEY_FILE_PREFIX: "lot_num_mst_", _KEY_FILE_SUFFIX: ".gz", + _KEY_FILE_COLUMN_SEPARATORS: "5", _KEY_ORG_TABLE: "org05.lot_num_mst", _KEY_SRC_TABLE: "src05.lot_num_mst", _KEY_UPSERT_SQL: textwrap.dedent("""\ @@ -1481,6 +1497,9 @@ class VjskReceiveFileMapper: def get_file_suffix(self, condkey: str) -> str: return self._get_interface_property(condkey, self._KEY_FILE_SUFFIX) + def get_file_column_separators(self, condkey: str) -> int: + return int(self._get_interface_property(condkey, self._KEY_FILE_COLUMN_SEPARATORS)) + def get_org_table(self, condkey: str) -> str: return self._get_interface_property(condkey, self._KEY_ORG_TABLE) From 788e13f1da8d60dbfeefffadaed2f758e96ed785 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 10:31:14 +0900 Subject: [PATCH 427/962] =?UTF-8?q?refactor:=20=E9=96=A2=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index b8b8e087..ea972ad6 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -106,7 +106,7 @@ def inst_emp_csv_upload_view( @router.get('/instEmpCsvDL', response_class=HTMLResponse) -def new_inst_view( +def inst_emp_csv_download_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): From 3573bf08618362c6e2e5192424a9180a6c7e06e3 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 10:54:06 +0900 Subject: [PATCH 428/962] =?UTF-8?q?style:=20CSS=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/css/masterMainte.css | 164 ++++++++++++++++++ .../src/templates/instEmpCsvDL.html | 3 +- .../src/templates/instEmpCsvUL.html | 2 +- .../src/templates/tableOverride.html | 3 +- 4 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 ecs/jskult-webapp/src/static/css/masterMainte.css 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/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 07712d73..7e84fd4c 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -4,8 +4,7 @@ {% 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 index bdd305d8..9ec84207 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -5,7 +5,7 @@ {% include '_header.html' %} {% endwith %} - +

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

diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 272cd0cd..e473b469 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -4,8 +4,7 @@ {% with subtitle = view.subtitle %} {% include '_header.html' %} {% endwith %} - - +

テーブル上書きコピー

From 2e6937eb71275d43c66172cd696efdce1a212410 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 11:11:06 +0900 Subject: [PATCH 429/962] =?UTF-8?q?fix:=20=E3=82=BB=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E5=88=87=E3=82=8C=E3=81=AE=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E6=99=82=E3=80=81=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E7=94=BB=E9=9D=A2=E3=81=AB=E4=BD=95?= =?UTF-8?q?=E3=82=82=E5=87=BA=E3=81=95=E3=81=AA=E3=81=84=E7=94=A8=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 4 ++-- ecs/jskult-webapp/src/router/session_router.py | 3 +-- ecs/jskult-webapp/src/system_var/constants.py | 2 -- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 09032af5..412ba068 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -73,7 +73,7 @@ def login( raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: logger.exception(e) - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) verified_token = jwt_token.verify_token() # 普通の認証だと、`cognito:username`に入る。 @@ -127,7 +127,7 @@ def sso_authorize( verified_token = jwt_token.verify_token() except JWTTokenVerifyException as e: logger.exception(e) - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) # トークンからユーザーIDを取得 user_id = verified_token.user_id diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 90f3a5c9..324c777f 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -90,8 +90,7 @@ class BeforeCheckSessionRoute(MeDaCaRoute): verified_session = verify_session(checked_session) # セッションが有効でない場合、エラーにする if verified_session is None: - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, - detail=constants.LOGOUT_REASON_SESSION_EXPIRED) + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) scope = request.scope scope['session'] = verified_session session_request = Request(receive=request.receive, scope=scope) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 899c19e5..2ea9454f 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -113,7 +113,6 @@ LOGOUT_REASON_LOGIN_ERROR = 'login_error' LOGOUT_REASON_BATCH_PROCESSING = 'batch_processing' LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE = 'batch_processing_ult' LOGOUT_REASON_NOT_LOGIN = 'not_login' -LOGOUT_REASON_SESSION_EXPIRED = 'session_expired' LOGOUT_REASON_DB_ERROR = 'db_error' LOGOUT_REASON_UNEXPECTED = 'unexpected' @@ -123,7 +122,6 @@ LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、
生物由来データ参照は使用出来ません。', LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、
マスタ-メンテは使用出来ません。', LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。', - LOGOUT_REASON_SESSION_EXPIRED: 'セッションが切れています。
再度Loginしてください。', LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。', LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。' } From b326bf65a9a1c44b9ea1bdd57f045671a1df2492 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 11:38:18 +0900 Subject: [PATCH 430/962] =?UTF-8?q?style:=20=E3=83=86=E3=83=BC=E3=83=96?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=83=95=E3=82=A9=E3=83=B3=E3=83=88=E3=82=B5?= =?UTF-8?q?=E3=82=A4=E3=82=BA=E8=AA=BF=E6=95=B4=208pt=E2=86=9212pt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/ultStyle.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 8d018b01..382ef4fd 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -633,14 +633,14 @@ table{ table.tablesorter { font-family:arial; background-color: #CDCDCD; - font-size: 8pt; + font-size: 12pt; text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { background-color: #e6EEEE; border: 0.1px solid silver; - font-size: 8pt; + font-size: 12pt; padding: 4px; padding-right: 20px; } From 46304d5b2c47d45aa260922b1effef88c359c0d6 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 11:41:32 +0900 Subject: [PATCH 431/962] =?UTF-8?q?style:=20=E4=BB=A5=E4=B8=8B=E3=82=92?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=20=E3=83=BB=E3=80=8CPrev=E3=80=8D=E3=80=8CNe?= =?UTF-8?q?xt=E3=80=8D=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=8C=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E3=81=AE=E9=A0=85=E7=9B=AE=E5=90=8D=E3=81=A8=E9=87=8D?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=82=8B=20=E3=83=BB?= =?UTF-8?q?=E4=B8=80=E8=A6=A7=E3=82=92=E3=82=B9=E3=82=AF=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=99=E3=82=8B=E3=81=A8=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=83=9C=E3=83=83=E3=82=AF=E3=82=B9=E3=81=AE=E5=B9=85?= =?UTF-8?q?=E3=81=8C=E5=A4=89=E3=82=8F=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/bioStyle.css | 9 +++++++-- ecs/jskult-webapp/src/static/css/ultStyle.css | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 8bc72999..c0ab2ca5 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -1,3 +1,9 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +*, ::after, ::before { + box-sizing: initial; +} + body { white-space: nowrap; background-color: LightCyan; @@ -75,7 +81,7 @@ table{ .bioScroll_div { overflow: auto; - padding-top: 10px; + margin-top: 1%; height: 250px; width: 1132px; } @@ -215,7 +221,6 @@ table{ .result_tr{ overflow-y: scroll; overflow-x: scroll; - } .result_data{ diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 382ef4fd..e39fa143 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -1,3 +1,9 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +*, ::after, ::before { + box-sizing: initial; +} + body { background-color: LightCyan; font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; @@ -39,8 +45,8 @@ table{ .scroll_table{ overflow: auto; white-space: nowrap; - margin-bottom: 2%; - /*スクロール時カラムが動く問題の修正 width: 100%;をコメントアウト*/ + margin-top: 1%; + margin-bottom: 1%; width: 100%; height: 250px; } From 0250080bc6831b804983b121e49ec2606dc3d146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 3 Jul 2023 13:47:19 +0900 Subject: [PATCH 432/962] =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E7=84=A1=E3=81=97=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/.env.example | 1 - ecs/jskult-batch-monthly/src/aws/s3.py | 29 ++- .../src/batch/common/batch_context.py | 9 + .../src/batch/output_arisj_file_process.py | 168 ++++++------------ .../src/jobctrl_monthly.py | 33 ++-- .../src/system_var/environment.py | 1 - .../calendar/jskult_arisj_output_day_list.txt | 106 +---------- 7 files changed, 120 insertions(+), 227 deletions(-) diff --git a/ecs/jskult-batch-monthly/.env.example b/ecs/jskult-batch-monthly/.env.example index 6bda1a69..d1f67281 100644 --- a/ecs/jskult-batch-monthly/.env.example +++ b/ecs/jskult-batch-monthly/.env.example @@ -7,7 +7,6 @@ DB_SCHEMA=src05 ARISJ_DATA_BUCKET=mbj-newdwh2021-staging-jskult-arisj JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult JSKULT_CONFIG_BUCKET=mbj-newdwh2021-staging-config -ULTMARC_BACKUP_FOLDER=************ LOG_LEVEL=INFO ARISJ_DATA_FOLDER=DATA diff --git a/ecs/jskult-batch-monthly/src/aws/s3.py b/ecs/jskult-batch-monthly/src/aws/s3.py index ed337407..8804bba9 100644 --- a/ecs/jskult-batch-monthly/src/aws/s3.py +++ b/ecs/jskult-batch-monthly/src/aws/s3.py @@ -65,9 +65,34 @@ class ConfigBucket(S3Bucket): return temporary_file_path +class ArisjBucket(S3Bucket): + _bucket_name = environment.ARISJ_DATA_BUCKET + _folder = environment.ARISJ_BACKUP_FOLDER + + def list_dat_file(self): + return self._s3_client.list_objects(self._bucket_name, self._folder) + + def s3_arisj_csv_upload(self, arisj_create_csv: str, csv_file_path: str): + # s3にCSVファイルをUPする + Bucket = environment.ARISJ_DATA_BUCKET + folder = environment.ARISJ_DATA_FOLDER + csv_file_name = f'{folder}/{arisj_create_csv}' + s3_client = S3Client() + s3_client.upload_file(csv_file_path, Bucket, csv_file_name) + return + + def backup_dat_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + arisj_backup_bucket = ArisjBackupBucket() + folder = environment.ARISJ_DATA_FOLDER + dat_file_key = f'{folder}/{dat_file_key}' + backup_key = f'{arisj_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_file_key, arisj_backup_bucket._bucket_name, backup_key) + + class JskUltBackupBucket(S3Bucket): _bucket_name = environment.JSKULT_BACKUP_BUCKET -class UltmarcBackupBucket(JskUltBackupBucket): - _folder = environment.ULTMARC_BACKUP_FOLDER +class ArisjBackupBucket(JskUltBackupBucket): + _folder = environment.ARISJ_BACKUP_FOLDER diff --git a/ecs/jskult-batch-monthly/src/batch/common/batch_context.py b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py index 6a05a423..8c8c12fb 100644 --- a/ecs/jskult-batch-monthly/src/batch/common/batch_context.py +++ b/ecs/jskult-batch-monthly/src/batch/common/batch_context.py @@ -1,5 +1,6 @@ class BatchContext: __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) __is_arisj_output_day: bool # 月次バッチ起動日フラグ def __init__(self) -> None: @@ -11,6 +12,14 @@ class BatchContext: cls.__instance = cls() return cls.__instance + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + @property def is_arisj_output_day(self): return self.__is_arisj_output_day diff --git a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py index 0deec661..b8645039 100644 --- a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py +++ b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py @@ -3,87 +3,88 @@ from datetime import datetime from src.db.database import Database from src.error.exceptions import BatchOperationException -from src.aws.s3 import S3Client from src.logging.get_logger import get_logger +from src.aws.s3 import ArisjBucket +from src.batch.common.batch_context import BatchContext import tempfile -import os import os.path as path -import logging import csv -logger = get_logger('実消化&アルトマーク月次バッチ') +logger = get_logger('ARIS-J連携データ出力') -create_date_format = datetime.now().strftime('%Y-%m-%d %H:%M:%S') -prg_id = 'PrgId:BI0402' create_date = datetime.now().strftime('%Y%m%d%H%M%S') -aris_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' -res_log = f'D0004{create_date}.log' -sql_err_msg = "MsgID:999999000002 Message:SQL実行エラーです。" -move_err_msg = "MsgID:BI0000000041 Message:S3バケットARISへのCSVデータ、実行ログ移動できませんでした。" +arisj_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' +sql_err_msg = "SQL実行エラーです。" def exec(): """ 実消化&アルトマーク月次バッチ """ try: + logger.info('バッチ処理を開始しました。') - start_msg = "MsgID:BI0000000001 Message:バッチ処理を開始しました。" - cnt_msg = "MsgID: Message: LogText:" + try: + db = Database.get_instance() + # DB接続 + db.connect() + except Exception as e: + logger.info('DB接続エラーです') + raise e - # 実行ログに書き込む - resLog, log_file_path = make_log_data() - resLog.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') - logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {start_msg}') - - db = Database.get_instance() - # DB接続 - db.connect() # トランザクションの開始 db.begin() # 正常系データの反映 # 過去分は不要のため、デリート - physical_normal_delete(db) + physical_wk_inst_aris_if_delete(db) # 正常系データを取得しWKテーブルに保存する。 - normal_insert_into(db) + wk_inst_aris_if_insert_into(db) # 正常系データの件数を取得 - suc_count = normal_count(db) + suc_count = wk_inst_aris_if_count(db) # 警告系データの反映 # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 - physical_abnormal_delete(db) + physical_wk_inst_aris_if_wrn_delete(db) # 異常系データを取得しWKテーブルに保存する。 - abnormal_insert_into(db) + wk_inst_aris_if_wrn_insert_into(db) # 異常系データの件数を取得 - wrn_count = abnormal_count(db) + wrn_count = wk_inst_aris_if_wrn_count(db) # CSVファイルの作成用のSQL実行 record_csv = csv_data_select(db) # CSVファイル作成 - csv_file_path = make_csv_data(record_csv, resLog) + csv_file_path = make_csv_data(record_csv) # トランザクションの終了 db.commit() - # 実行ログファイルの追記 - # 実行ログに処理件数を書き込む。 + # ログに処理件数を出力 sum_count = suc_count + wrn_count - resLog.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') - logger.info(f'{create_date_format}[DWH][3][INFO]{prg_id} {cnt_msg}(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') + logger.info(f'(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') # CSVファイル移動処理 - s3_csv_upload_data(csv_file_path, resLog) + try: + ArisjBucket().s3_arisj_csv_upload(arisj_create_csv, csv_file_path) + except Exception as e: + logger.info('S3バケットArisjへのCSVデータ、移動できませんでした。') + raise e - # logファイル移動処理 - s3_log_upload_data(log_file_path) + # 処理後ファイルをバックアップ + try: + arisj_bucket = ArisjBucket() + batch_context = BatchContext.get_instance() + arisj_bucket.backup_dat_file(arisj_create_csv, batch_context.syor_date) + except Exception as e: + logger.info('S3バケットArisjバックアップへCSVデータ、コピーできませんでした。') + raise e + + logger.info('バッチ処理を終了しました。') - logger.info('実消化&アルトマーク月次バッチ処理: 終了') except Exception as e: - logger.info(f'{create_date_format}[DWH][5][INFO]') raise BatchOperationException(e) finally: @@ -92,7 +93,7 @@ def exec(): db.disconnect() -def physical_normal_delete(db): +def physical_wk_inst_aris_if_delete(db): # 過去分は不要のため、デリート try: # WKテーブルの過去分削除SQL @@ -102,11 +103,11 @@ def physical_normal_delete(db): db.execute(sql) return except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def normal_insert_into(db): +def wk_inst_aris_if_insert_into(db): # 正常系データを取得しWKテーブルに保存する。 try: # 正常系データを取得しWKテーブルに保存SQL @@ -150,11 +151,11 @@ def normal_insert_into(db): db.execute(sql) return except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def normal_count(db): +def wk_inst_aris_if_count(db): # 正常系データの件数を取得 try: # 正常系データの件数を取得SQL @@ -164,11 +165,11 @@ def normal_count(db): record_count = db.execute_select(sql) return record_count[0]['countNum'] except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def physical_abnormal_delete(db): +def physical_wk_inst_aris_if_wrn_delete(db): # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 try: # 異常系WKテーブルの過去分削除SQL @@ -179,11 +180,11 @@ def physical_abnormal_delete(db): db.execute(sql) return except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def abnormal_insert_into(db): +def wk_inst_aris_if_wrn_insert_into(db): # 異常系データを取得しWKテーブルに保存する。 try: # 異常系データを取得しWKテーブルに保存SQL @@ -233,11 +234,11 @@ def abnormal_insert_into(db): db.execute(sql) return except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def abnormal_count(db): +def wk_inst_aris_if_wrn_count(db): # 異常系データの件数を取得 try: # 異常系データの件数を取得SQL @@ -249,7 +250,7 @@ def abnormal_count(db): return record_count[0]['countNum'] except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e @@ -266,22 +267,19 @@ def csv_data_select(db): return db.execute_select(sql) except Exception as e: - logger.debug(f'{create_date_format}:{prg_id} {sql_err_msg}') + logger.debug(f'{sql_err_msg}') raise e -def make_csv_data(record_csv: list, resLog): +def make_csv_data(record_csv: list): # 一時ファイルとして保存する(CSVファイル) try: - err_end_msg = "MsgID:BI0000009998 Message:バッチ処理を異常終了しました。" - csv_err_msg = "MsgID:BI0000000040 Message:ワークデータの作成に失敗しました。" - temporary_dir = tempfile.mkdtemp() - csv_file_path = path.join(temporary_dir, aris_create_csv) + csv_file_path = path.join(temporary_dir, arisj_create_csv) head_str = ['TC_HOSPITAL', 'TJ_HOSPITAL', 'TJ_HOSPITALSHORT', 'TK_HOSPITAL', 'TC_PREFECTURE', 'TJ_PREFECTURE', 'TJ_ZIPCODE', 'TJ_CITY', 'TJ_ADDRESS', 'TJ_DEPARTMENT', - 'TJ_TELEPHONENUMBER', 'TC_HOSPITALCAT', 'TC_HOSPITALTYPE', 'TS_UPDATE', ' TD_UPDATE'] + 'TJ_TELEPHONENUMBER', 'TC_HOSPITALCAT', 'TC_HOSPITALTYPE', 'TS_UPDATE', 'TD_UPDATE'] # Shift-JIS、CRLF、価囲いありで書き込む with open(csv_file_path, mode='w', encoding='cp932') as csv_file: @@ -298,64 +296,8 @@ def make_csv_data(record_csv: list, resLog): writer.writerow(csv_data) except Exception as e: - resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') - resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {csv_err_msg}') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {err_end_msg}') + logger.info('ワークデータの作成に失敗しました。') + logger.info('バッチ処理を異常終了しました。') raise e return csv_file_path - - -def make_log_data(): - # 一時ファイルとして保存する(ログファイル) - temporary_dir = tempfile.mkdtemp() - log_file_path = path.join(temporary_dir, res_log) - - # ロガーの生成 - resLog = logging.getLogger('resLog') - # 出力レベルの設定 - resLog.setLevel(logging.INFO) - # ハンドラの生成 - resLog_handler = logging.FileHandler(log_file_path) - # ロガーにハンドラを登録 - resLog.addHandler(resLog_handler) - # フォーマッタの生成 - fmt = logging.Formatter('%(message)s') - # ハンドラにフォーマッタを登録 - resLog_handler.setFormatter(fmt) - - return resLog, log_file_path - - -def s3_csv_upload_data(csv_file_path, resLog): - # s3にCSVファイルをUPする - Bucket = os.environ['ARISJ_DATA_BUCKET'] - folder = os.environ['ARISJ_DATA_FOLDER'] - csv_file_name = f'{folder}/{aris_create_csv}' - s3_client = S3Client() - - try: - s3_client.upload_file(csv_file_path, Bucket, csv_file_name) - except Exception as e: - resLog.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') - raise e - - return - - -def s3_log_upload_data(log_file_path): - # s3にログファイルをUPする - Bucket = os.environ['ARISJ_DATA_BUCKET'] - folder = os.environ['ARISJ_DATA_FOLDER'] - log_file_name = f'{folder}/{res_log}' - s3_client = S3Client() - - try: - s3_client.upload_file(log_file_path, Bucket, log_file_name) - except Exception as e: - logger.info(f'{create_date_format}[DWH][5][INFO]{prg_id} {move_err_msg}') - raise e - - return diff --git a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py index dba5fac4..0534808d 100644 --- a/ecs/jskult-batch-monthly/src/jobctrl_monthly.py +++ b/ecs/jskult-batch-monthly/src/jobctrl_monthly.py @@ -1,6 +1,7 @@ """実消化&アルトマーク 月次バッチ処理""" from src.aws.s3 import ConfigBucket +from src.aws.s3 import ArisjBackupBucket from src.batch.batch_functions import get_batch_statuses from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile @@ -9,28 +10,34 @@ from src.logging.get_logger import get_logger from src.system_var import constants from src.batch import output_arisj_file_process -logger = get_logger('月次処理コントロール') +logger = get_logger('月次処理コントロール(ARIS-J)') # バッチ共通設定を取得 batch_context = BatchContext.get_instance() +arisj_bucket = ArisjBackupBucket() def exec(): try: logger.info('月次バッチ:開始') try: - # 月次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + logger.info('処理日取得') + # 月次バッチ処置中フラグ、処理日を取得 batch_processing_flag, syor_date = get_batch_statuses() except BatchOperationException as e: - logger.exception(f'日付テーブル取得(異常終了){e}') + logger.exception(f'日次ジョブ取得エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS # 日次バッチ処理中の場合、後続の処理は行わない + logger.info('日次ジョブ処理中判定') if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: - logger.error('日次バッチ処理中のため、月次バッチ処理を終了します。') + logger.error('日次ジョブ処理中エラー(異常終了)') return constants.BATCH_EXIT_CODE_SUCCESS - logger.info(f'処理日={syor_date}') + # バッチ共通設定に処理日を追加 + batch_context.syor_date = syor_date + + logger.info(f'処理日取得={syor_date}') # 稼働日かかどうかを、実消化&アルトマーク月次バッチ稼働日ファイルをダウンロードして判定 try: @@ -38,22 +45,22 @@ def exec(): arisj_output_day_calendar = CalendarFile(arisj_output_day_list_file_path) batch_context.is_arisj_output_day = arisj_output_day_calendar.compare_date(syor_date) except Exception as e: - logger.exception(f'実消化&アルトマーク月次バッチ稼働日ファイルの読み込みに失敗しました。{e}') + logger.exception(f'処理日取得エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS # 調査目的で実消化&アルトマーク月次バッチ稼働日かどうかをログ出力 - if batch_context.is_arisj_output_day: - logger.info('本日は実消化&アルトマーク月次バッチ稼働日です。') - else: - logger.info('月次バッチは行われませんでした。') + if not batch_context.is_arisj_output_day: + logger.info('ARIS-J連携データ出力日でない為、処理終了') return constants.BATCH_EXIT_CODE_SUCCESS + logger.info('ARIS-J連携データ出力日です') + try: - logger.info('月次バッチ:起動') + logger.info('ARIS-J連携データ出力:起動') output_arisj_file_process.exec() - logger.info('月次バッチ:終了') + logger.info('ARIS-J連携データ出力:終了') except BatchOperationException as e: - logger.exception(f'月次バッチ処理エラー(異常終了){e}') + logger.exception(f'ARIS-J連携データ出力(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS # 正常終了を保守ユーザーに通知 diff --git a/ecs/jskult-batch-monthly/src/system_var/environment.py b/ecs/jskult-batch-monthly/src/system_var/environment.py index c98503dd..08d6cd16 100644 --- a/ecs/jskult-batch-monthly/src/system_var/environment.py +++ b/ecs/jskult-batch-monthly/src/system_var/environment.py @@ -15,7 +15,6 @@ ARISJ_DATA_FOLDER = os.environ['ARISJ_DATA_FOLDER'] ARISJ_BACKUP_FOLDER = os.environ['ARISJ_BACKUP_FOLDER'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME'] -ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt b/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt index 2d5f42c0..fe095c8a 100644 --- a/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt +++ b/s3/config/jskult/calendar/jskult_arisj_output_day_list.txt @@ -1,100 +1,12 @@ -2023/06/23 -2023/06/24 -2023/06/25 -2023/06/26 -2023/06/27 -2023/06/28 -2023/06/29 -2023/06/30 -2023/07/01 -2023/07/02 +2023/01/05 +2023/02/01 +2023/03/01 +2023/04/03 +2023/05/01 +2023/06/01 2023/07/03 -2023/07/04 -2023/07/05 -2023/07/06 -2023/07/07 -2023/07/08 -2023/07/09 -2023/07/10 -2023/07/11 -2023/07/12 -2023/07/13 -2023/07/14 -2023/07/15 -2023/07/16 -2023/07/17 -2023/07/18 -2023/07/19 -2023/07/20 -2023/07/21 -2023/07/22 -2023/07/23 -2023/07/24 -2023/07/25 -2023/07/26 -2023/07/27 -2023/07/28 -2023/07/29 -2023/07/30 -2023/07/31 2023/08/01 -2023/08/02 -2023/08/03 -2023/08/04 -2023/08/05 -2023/08/06 -2023/08/07 -2023/08/08 -2023/08/09 -2023/08/10 -2023/08/11 -2023/08/12 -2023/08/13 -2023/08/14 -2023/08/15 -2023/08/16 -2023/08/17 -2023/08/18 -2023/08/19 -2023/08/20 -2023/08/21 -2023/08/22 -2023/08/23 -2023/08/24 -2023/08/25 -2023/08/26 -2023/08/27 -2023/08/28 -2023/08/29 -2023/08/30 -2023/08/31 2023/09/01 -2023/09/02 -2023/09/03 -2023/09/04 -2023/09/05 -2023/09/06 -2023/09/07 -2023/09/08 -2023/09/09 -2023/09/10 -2023/09/11 -2023/09/12 -2023/09/13 -2023/09/14 -2023/09/15 -2023/09/16 -2023/09/17 -2023/09/18 -2023/09/19 -2023/09/20 -2023/09/21 -2023/09/22 -2023/09/23 -2023/09/24 -2023/09/25 -2023/09/26 -2023/09/27 -2023/09/28 -2023/09/29 -2023/09/30 +2023/10/02 +2023/11/01 +2023/12/01 \ No newline at end of file From cca854be178336cc13422e4562ec3f38db130d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 4 Jul 2023 15:24:05 +0900 Subject: [PATCH 433/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 3 + ecs/jskult-batch-daily/src/aws/s3.py | 26 ++ .../batch/ultmarc/export_vjsk_csv_process.py | 270 ++++++++++++++++++ .../src/batch/ultmarc/ultmarc_process.py | 13 +- ecs/jskult-batch-daily/src/jobctrl_daily.py | 8 +- .../src/system_var/environment.py | 3 + 6 files changed, 318 insertions(+), 5 deletions(-) create mode 100644 ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 95aef7fe..4a0eefbe 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -11,3 +11,6 @@ ULTMARC_BACKUP_FOLDER=ultmarc JSKULT_CONFIG_BUCKET=********************** 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 diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 68ed0a7c..fab7e222 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -76,6 +76,28 @@ class UltmarcBucket(S3Bucket): self._s3_client.delete_file(self._bucket_name, dat_file_key) +class VjskBucket(S3Bucket): + _bucket_name = environment.VJSK_DATA_BUCKET + _folder = environment.VJSK_DATA_SEND_FOLDER + + def list_dat_file(self): + return self._s3_client.list_objects(self._bucket_name, self._folder) + + def upload_dat_file(self, vjsk_create_csv: str, csv_file_path: str): + # S3バケットにファイルを移動 + csv_file_name = f'{self._folder}/{vjsk_create_csv}' + s3_client = S3Client() + s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name) + return + + def backup_dat_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + vjsk_backup_bucket = VjskBackupBucket() + dat_key = f'{self._folder}/{dat_file_key}' + backup_key = f'{vjsk_backup_bucket._folder}/{self._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_key, vjsk_backup_bucket._bucket_name, backup_key) + + class ConfigBucket(S3Bucket): _bucket_name = environment.JSKULT_CONFIG_BUCKET @@ -96,3 +118,7 @@ class JskUltBackupBucket(S3Bucket): class UltmarcBackupBucket(JskUltBackupBucket): _folder = environment.ULTMARC_BACKUP_FOLDER + + +class VjskBackupBucket(JskUltBackupBucket): + _folder = environment.VJSK_BACKUP_FOLDER diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py new file mode 100644 index 00000000..27243e4a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py @@ -0,0 +1,270 @@ +"""アルトマークデータ処理""" + +from src.aws.s3 import UltmarcBucket, VjskBucket +from src.batch.common.batch_context import BatchContext + +from src.db.database import Database +from src.logging.get_logger import get_logger +import tempfile +import os.path as path +import csv + +logger = get_logger('V実用消化施設データ作成処理') +ultmarc_bucket = UltmarcBucket() +batch_context = BatchContext.get_instance() + +sql_err_msg = "SQL実行エラーです。" +vjsk_csv_file_name = 'ComInst.csv' + + +def exec(): + db = Database.get_instance() + try: + logger.info('バッチ処理を開始しました。') + + try: + # DB接続 + db.connect() + # ファイル単位でトランザクションを行う + db.begin() + except Exception as e: + logger.info('DB接続エラーです。') + raise e + + # CSVファイルの作成用のSQL実行(施設) + record_inst_csv = csv_data_inst_select(db) + # CSVファイルの作成用のSQL実行(薬局) + record_pharm_csv = csv_data_pharm_select(db) + # CSVファイル作成 + csv_file_path = make_csv_data(record_inst_csv, record_pharm_csv) + + vjsk_bucket = VjskBucket() + try: + # s3へデータ移動 + vjsk_bucket.upload_dat_file(vjsk_csv_file_name, csv_file_path) + except Exception as e: + logger.info('S3バケットDWHへCSVデータを作成できませんでした。') + raise e + + try: + # 処理後ファイルをバックアップ + batch_context = BatchContext.get_instance() + vjsk_bucket.backup_dat_file(vjsk_csv_file_name, batch_context.syor_date) + except Exception as e: + logger.info('バックアップバケットへCSVデータをコピーできませんでした。') + raise e + + csv_count = len(record_inst_csv) + len(record_pharm_csv) + logger.info(f'CSV出力件数: {csv_count}。') + logger.info('バッチ処理を正常に終了しました。') + except Exception as e: + raise e + finally: + # 終了時に必ずコミットする + db.commit() + db.disconnect() + return + + +def csv_data_inst_select(db): + # CSVファイルの作成用のSQL実行(施設) + try: + # 施設テーブル検索SQL + sql = """\ + SELECT dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + rltd_univ_prnt_cd, + bed_num, + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + ward_abolish_flg, + inst_repre_cd, + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + hp_assrt_cd, + dup_opp_cd, + insp_item_micrb, + insp_item_serum, + insp_item_blood, + insp_item_patho, + insp_item_paras, + insp_item_biochem, + insp_item_ri, + re_exam_cd, + prmit_bed_num_other, + prmit_bed_num_mental, + prmit_bed_num_tuber, + prmit_bed_num_infection, + prmit_bed_num_sum, + prmit_bed_num_gen, + prmit_bed_num_rcup, + prmit_bed_maint_ymd, + inst_pharm_div, + abolish_ymd, + delete_flg, + filler_1, + filler_2, + filler_3, + filler_4, + filler_5, + regist_date, + create_user, + update_date, + update_user, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + FROM src05.com_inst ORDER BY dcf_dsf_inst_cd + """ + return db.execute_select(sql) + except Exception as e: + logger.debug(f'{sql_err_msg}') + raise e + + +def csv_data_pharm_select(db): + # CSVファイルの作成用のSQL実行(薬局) + try: + # 薬局テーブル検索SQL + sql = """\ + SELECT dcf_dsf_inst_cd, + inst_div_cd, + addr_unknown_reason_cd, + form_inst_name_kana, + inst_name_kana, + form_inst_name_kanji, + inst_name_kanji, + '', + '', + close_flg, + estab_sche_flg, + close_start_ym, + estab_sche_ym, + '', + '', + inst_repre_kana, + inst_repre, + phone_number_non_flg, + unconf_flg, + inst_phone_number, + inst_addr_kana, + inst_addr, + postal_number, + village_cd, + prefc_cd, + city_cd, + addr_display_number, + addr_cnt_kana, + addr_cnt, + manage_cd, + delete_sche_reason_cd, + '', + dup_opp_cd, + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + inst_pharm_div, + abolish_ymd, + delete_flg, + filler_1, + filler_2, + filler_3, + filler_4, + filler_5, + regist_date, + create_user, + update_date, + update_user, + sys_regist_date, + regist_prgm_id, + sys_update_date, + update_prgm_id + FROM src05.com_pharm ORDER BY dcf_dsf_inst_cd + """ + return db.execute_select(sql) + except Exception as e: + logger.debug(f'{sql_err_msg}') + raise e + + +def make_csv_data(record_inst_csv: list, record_pharm_cs: list): + # 一時ファイルとして保存する(CSVファイル) + try: + + temporary_dir = tempfile.mkdtemp() + csv_file_path = path.join(temporary_dir, vjsk_csv_file_name) + + head_str = ['DCF_DSF_INST_CD', 'INST_DIV_CD', 'ADDR_UNKNOWN_REASON_CD', 'FORM_INST_NAME_KANA', 'INST_NAME_KANA', + 'FORM_INST_NAME_KANJI', 'INST_NAME_KANJI', 'RLTD_UNIV_PRNT_CD', 'BED_NUM', 'CLOSE_FLG', 'ESTAB_SCHE_FLG', + 'CLOSE_START_YM', 'ESTAB_SCHE_YM', 'WARD_ABOLISH_FLG', 'INST_REPRE_CD', 'INST_REPRE_KANA', 'INST_REPRE', + 'PHONE_NUMBER_NON_FLG', 'UNCONF_FLG', 'INST_PHONE_NUMBER', 'INST_ADDR_KANA', 'INST_ADDR', 'POSTAL_NUMBER', + 'VILLAGE_CD', 'PREFC_CD', 'CITY_CD', 'ADDR_DISPLAY_NUMBER', 'ADDR_CNT_KANA', 'ADDR_CNT', 'MANAGE_CD', + 'DELETE_SCHE_REASON_CD', 'HP_ASSRT_CD', 'DUP_OPP_CD', 'INSP_ITEM_MICRB', 'INSP_ITEM_SERUM', 'INSP_ITEM_BLOOD', + 'INSP_ITEM_PATHO', 'INSP_ITEM_PARAS', 'INSP_ITEM_BIOCHEM', 'INSP_ITEM_RI', 'RE_EXAM_CD', 'PRMIT_BED_NUM_OTHER', + 'PRMIT_BED_NUM_MENTAL', 'PRMIT_BED_NUM_TUBER', 'PRMIT_BED_NUM_INFECTION', 'PRMIT_BED_NUM_SUM', 'PRMIT_BED_NUM_GEN', + 'PRMIT_BED_NUM_RCUP', 'PRMIT_BED_MAINT_YMD', 'INST_PHARM_DIV', 'ABOLISH_YMD', 'DELETE_FLG', 'FILLER_1', 'FILLER_2', + 'FILLER_3', 'FILLER_4', 'FILLER_5', 'REGIST_DATE', 'CREATE_USER', 'UPDATE_DATE', 'UPDATE_USER', 'SYS_REGIST_DATE', + 'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID'] + + # Shift-JIS、CRLF、価囲いありで書き込む + with open(csv_file_path, mode='w', encoding='cp932') as csv_file: + writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', + quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, + strict=True + ) + # ヘッダ行書き込み + writer.writerow(head_str) + + # データ部分書き込み(施設) + for record_inst_data in record_inst_csv: + record_inst_value = list(record_inst_data.values()) + csv_data = ['' if n is None else n for n in record_inst_value] + writer.writerow(csv_data) + + # データ部分書き込み(薬局) + for record_pharm_data in record_pharm_cs: + record_pharm_value = list(record_pharm_data.values()) + csv_data = ['' if n is None else n for n in record_pharm_value] + writer.writerow(csv_data) + + except Exception as e: + logger.info('ワークデータの作成に失敗しました。') + logger.info('バッチ処理を異常終了しました。') + raise e + + return csv_file_path diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index b511a9c8..e0e6ba22 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -5,6 +5,7 @@ from datetime import datetime from src.aws.s3 import UltmarcBucket from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.datfile import DatFile +from src.batch.ultmarc import export_vjsk_csv_process from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database @@ -61,11 +62,19 @@ def exec_import(): def exec_export(): - """V実消化用施設・薬局薬店データ作成処理""" + """V実消化用施設データ作成処理""" if not batch_context.is_ultmarc_imported: - logger.info('アルトマーク取込が行われていないため、V実消化用施設・薬局薬店データ作成処理をスキップします。') + logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') return + try: + logger.info('V実用消化施設データ作成処理: 開始') + export_vjsk_csv_process.exec() + logger.info('V実用消化施設データ作成処理: 終了') + except Exception as e: + raise BatchOperationException(e) + return + def _import_to_ultmarc_table(dat_file: DatFile): db = Database.get_instance() diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index a98c0d16..d77216ff 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -75,11 +75,13 @@ def exec(): logger.debug(f'{"アルトマーク取込が行われました。" if batch_context.is_ultmarc_imported else "アルトマーク取込が行われませんでした。"}') try: - logger.info('V実消化用施設・薬局薬店データ作成処理:起動') + logger.info('V実消化用施設データ作成処理:起動') +# ***********************実行させるためにtrueにしておく(後で消す)*********************** + batch_context.is_ultmarc_imported = True ultmarc_process.exec_export() - logger.info('V実消化用施設・薬局薬店データ作成処理:終了') + logger.info('V実消化用施設データ作成処理:終了') except BatchOperationException as e: - logger.exception(f'V実消化用施設・薬局薬店データ作成処理エラー(異常終了){e}') + logger.exception(f'V実消化用施設データ作成処理エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS logger.info('日次処理(V実消化)') diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index b1730224..4144319f 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -15,6 +15,9 @@ ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER'] JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] +VJSK_BACKUP_FOLDER = os.environ['VJSK_BACKUP_FOLDER'] +VJSK_DATA_SEND_FOLDER = os.environ['VJSK_DATA_SEND_FOLDER'] +VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 92c14d2fa0f2fb499dcdd91b40e0c4d061a549a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 4 Jul 2023 15:25:21 +0900 Subject: [PATCH 434/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index d77216ff..45e297e9 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -76,8 +76,6 @@ def exec(): try: logger.info('V実消化用施設データ作成処理:起動') -# ***********************実行させるためにtrueにしておく(後で消す)*********************** - batch_context.is_ultmarc_imported = True ultmarc_process.exec_export() logger.info('V実消化用施設データ作成処理:終了') except BatchOperationException as e: From b9a2a0c2f7f2545dc7ad3683ce35644e06437615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 09:05:50 +0900 Subject: [PATCH 435/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/output_arisj_file_process.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py index b8645039..197db381 100644 --- a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py +++ b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py @@ -283,12 +283,12 @@ def make_csv_data(record_csv: list): # Shift-JIS、CRLF、価囲いありで書き込む with open(csv_file_path, mode='w', encoding='cp932') as csv_file: + # ヘッダ行書き込み + csv_file.write(f"{','.join(head_str)}\n") writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, strict=True ) - # ヘッダ行書き込み - writer.writerow(head_str) # データ部分書き込み for record_data in record_csv: record_value = list(record_data.values()) From f5de058284bdaea1d842435f217500ee5a9e9b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 09:45:58 +0900 Subject: [PATCH 436/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90=EF=BC=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/ultmarc/export_vjsk_csv_process.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py index 27243e4a..a1b2ff23 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py @@ -243,12 +243,12 @@ def make_csv_data(record_inst_csv: list, record_pharm_cs: list): # Shift-JIS、CRLF、価囲いありで書き込む with open(csv_file_path, mode='w', encoding='cp932') as csv_file: + # ヘッダ行書き込み + csv_file.write(f"{','.join(head_str)}\n") writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, strict=True ) - # ヘッダ行書き込み - writer.writerow(head_str) # データ部分書き込み(施設) for record_inst_data in record_inst_csv: From 0c2b3d22f4cf7e2542c137989e66231c7a7bfd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 10:45:31 +0900 Subject: [PATCH 437/962] =?UTF-8?q?pip=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/Pipfile.lock | 235 ++++++-------------------- 1 file changed, 55 insertions(+), 180 deletions(-) diff --git a/ecs/jskult-batch-monthly/Pipfile.lock b/ecs/jskult-batch-monthly/Pipfile.lock index 3e58b727..10d05022 100644 --- a/ecs/jskult-batch-monthly/Pipfile.lock +++ b/ecs/jskult-batch-monthly/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0b1dbc40a5069476aa66f172175ae24ffae385c335ff8e4794c1b25a111b9e43" + "sha256": "a2be870e254760b62220c10400b05fa66d24b2cc1bcd6f21044735e320a62e53" }, "pipfile-spec": 6, "requires": { @@ -18,19 +18,19 @@ "default": { "boto3": { "hashes": [ - "sha256:7694df61bd6d253d6d9db34adbcd218b8efbe7f894a4a51611f7e0587ae33218", - "sha256:fe49f91e057b241b23a58c74c2f22654216788052ce95b73439fdb18bfd0e155" + "sha256:908f9c277325d68963dfcfce963a05336f0eb19505fc239c0ab9d01f4cba0296", + "sha256:e1e535e9fb23977252f13652ed2fa9b4f2d59a53b04a5f2fad3ee415b6a3b2b0" ], "index": "pypi", - "version": "==1.26.159" + "version": "==1.27.0" }, "botocore": { "hashes": [ - "sha256:86fe4641fd32dc6a5be4a289e00dc180448fc7bc37abac21bd624656985eef62", - "sha256:da1c61757d466b82cc89f379a50662064bcb0beb67cc6efa1fbfc9a341bd08b0" + "sha256:b9cb5b78a289f0615a48d85066f01869029aa41b95993f2c0c55003df037c23f", + "sha256:cac1333f41ec98e6f75bbba3f2c74b9e76aa3847469ecea6e7773a0af0049bee" ], "markers": "python_version >= '3.7'", - "version": "==1.29.159" + "version": "==1.30.0" }, "greenlet": { "hashes": [ @@ -107,11 +107,11 @@ }, "pymysql": { "hashes": [ - "sha256:766b72e4370aba94e6266a4dbd62c51fbc6a894c38de25a41a8a01f0461a2387", - "sha256:aade29b861e81a3c68a9e90d43f3db257940c0208983a0128b82f1a4cef639aa" + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", - "version": "==1.1.0rc2" + "version": "==1.1.0" }, "python-dateutil": { "hashes": [ @@ -139,50 +139,50 @@ }, "sqlalchemy": { "hashes": [ - "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" + "sha256:04383f1e3452f6739084184e427e9d5cb4e68ddc765d52157bf5ef30d5eca14f", + "sha256:125f9f7e62ddf8b590c069729080ffe18b68a20d9882eb0947f72e06274601d7", + "sha256:1822620c89779b85f7c23d535c8e04b79c517739ae07aaed48c81e591ed5498e", + "sha256:21583808d37f126a647652c90332ac1d3a102edf3c94bcc3319edcc0ea2300cc", + "sha256:218fb20c01e95004f50a3062bf4c447dcb360cab8274232f31947e254f118298", + "sha256:2269b1f9b8be47e52b70936069a25a3771eff53367aa5cc59bb94f28a6412e13", + "sha256:234678ed6576531b8e4be255b980f20368bf07241a2e67b84e6b0fe679edb9c4", + "sha256:28da17059ecde53e2d10ba813d38db942b9f6344360b2958b25872d5cb729d35", + "sha256:2c6ff5767d954f6091113fedcaaf49cdec2197ae4c5301fe83d5ae4393c82f33", + "sha256:36a87e26fe8fa8c466fae461a8fcb780d0a1cbf8206900759fc6fe874475a3ce", + "sha256:394ac3adf3676fad76d4b8fcecddf747627f17f0738dc94bac15f303d05b03d4", + "sha256:40a3dc52b2b16f08b5c16b9ee7646329e4b3411e9280e5e8d57b19eaa51cbef4", + "sha256:48111d56afea5699bab72c38ec95561796b81befff9e13d1dd5ce251ab25f51d", + "sha256:48b40dc2895841ea89d89df9eb3ac69e2950a659db20a369acf4259f68e6dc1f", + "sha256:513411d73503a6fc5804f01fae3b3d44f267c1b3a06cfeac02e9286a7330e857", + "sha256:51736cfb607cf4e8fafb693906f9bc4e5ee55be0b096d44bd7f20cd8489b8571", + "sha256:5f40e3a7d0a464f1c8593f2991e5520b2f5b26da24e88000bbd4423f86103d4f", + "sha256:6150560fcffc6aee5ec9a97419ac768c7a9f56baf7a7eb59cb4b1b6a4d463ad9", + "sha256:724355973297bbe547f3eb98b46ade65a67a3d5a6303f17ab59a2dc6fb938943", + "sha256:74ddcafb6488f382854a7da851c404c394be3729bb3d91b02ad86c5458140eff", + "sha256:7830e01b02d440c27f2a5be68296e74ccb55e6a5b5962ffafd360b98930b2e5e", + "sha256:7f31d4e7ca1dd8ca5a27fd5eaa0f9e2732fe769ff7dd35bf7bba179597e4df07", + "sha256:8741d3d401383e54b2aada37cbd10f55c5d444b360eae3a82f74a2be568a7710", + "sha256:910d45bf3673f0e4ef13858674bd23cfdafdc8368b45b948bf511797dbbb401d", + "sha256:aa995b21f853864996e4056d9fde479bcecf8b7bff4beb3555eebbbba815f35d", + "sha256:af7e2ba75bf84b64adb331918188dda634689a2abb151bc1a583e488363fd2f8", + "sha256:b0eaf82cc844f6b46defe15ad243ea00d1e39ed3859df61130c263dc7204da6e", + "sha256:b114a16bc03dfe20b625062e456affd7b9938286e05a3f904a025b9aacc29dd4", + "sha256:b47be4c6281a86670ea5cfbbbe6c3a65366a8742f5bc8b986f790533c60b5ddb", + "sha256:ba03518e64d86f000dc24ab3d3a1aa876bcbaa8aa15662ac2df5e81537fa3394", + "sha256:cc9c2630c423ac4973492821b2969f5fe99d9736f3025da670095668fbfcd4d5", + "sha256:cf07ff9920cb3ca9d73525dfd4f36ddf9e1a83734ea8b4f724edfd9a2c6e82d9", + "sha256:cf175d26f6787cce30fe6c04303ca0aeeb0ad40eeb22e3391f24b32ec432a1e1", + "sha256:d0aeb3afaa19f187a70fa592fbe3c20a056b57662691fd3abf60f016aa5c1848", + "sha256:e186e9e95fb5d993b075c33fe4f38a22105f7ce11cecb5c17b5618181e356702", + "sha256:e2d5c3596254cf1a96474b98e7ce20041c74c008b0f101c1cb4f8261cb77c6d3", + "sha256:e3189432db2f5753b4fde1aa90a61c69976f4e7e31d1cf4611bfe3514ed07478", + "sha256:e3a6b2788f193756076061626679c5c5a6d600ddf8324f986bc72004c3e9d92e", + "sha256:ead58cae2a089eee1b0569060999cb5f2b2462109498a0937cc230a7556945a1", + "sha256:f2f389f77c68dc22cb51f026619291c4a38aeb4b7ecb5f998fd145b2d81ca513", + "sha256:f593170fc09c5abb1205a738290b39532f7380094dc151805009a07ae0e85330" ], "index": "pypi", - "version": "==2.0.16" + "version": "==2.0.17" }, "tenacity": { "hashes": [ @@ -194,11 +194,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:16224afa8cc2b3679dd9e9a1efe719dd2e20a03f0cc2e4cc4c97870ae9622532", - "sha256:3c2c2cd887648efa0ea8f8ba4260a1213058e8e4a25a6a6f4e084740b2c858e2" + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" ], "markers": "python_version >= '3.7'", - "version": "==4.7.0rc1" + "version": "==4.7.1" }, "urllib3": { "hashes": [ @@ -218,91 +218,6 @@ "index": "pypi", "version": "==2.0.2" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "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.7" - }, - "exceptiongroup": { - "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" - ], - "markers": "python_version < '3.11'", - "version": "==1.1.1" - }, "flake8": { "hashes": [ "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", @@ -311,14 +226,6 @@ "index": "pypi", "version": "==6.0.0" }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, "mccabe": { "hashes": [ "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", @@ -327,22 +234,6 @@ "markers": "python_version >= '3.6'", "version": "==0.7.0" }, - "packaging": { - "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1" - }, - "pluggy": { - "hashes": [ - "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", - "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" - ], - "markers": "python_version >= '3.7'", - "version": "==1.2.0" - }, "pycodestyle": { "hashes": [ "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", @@ -359,22 +250,6 @@ "markers": "python_version >= '3.6'", "version": "==3.0.1" }, - "pytest": { - "hashes": [ - "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295", - "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b" - ], - "index": "pypi", - "version": "==7.3.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", - "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" - ], - "index": "pypi", - "version": "==4.1.0" - }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", From 3fa372b5da8c56adc2a7f785374aad8c6f63d42a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 11:24:53 +0900 Subject: [PATCH 438/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/output_arisj_file_process.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py index 197db381..9d7d5587 100644 --- a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py +++ b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py @@ -281,10 +281,11 @@ def make_csv_data(record_csv: list): 'TC_PREFECTURE', 'TJ_PREFECTURE', 'TJ_ZIPCODE', 'TJ_CITY', 'TJ_ADDRESS', 'TJ_DEPARTMENT', 'TJ_TELEPHONENUMBER', 'TC_HOSPITALCAT', 'TC_HOSPITALTYPE', 'TS_UPDATE', 'TD_UPDATE'] - # Shift-JIS、CRLF、価囲いありで書き込む with open(csv_file_path, mode='w', encoding='cp932') as csv_file: - # ヘッダ行書き込み + # ヘッダ行書き込み(くくり文字をつけない為にwriteしています) csv_file.write(f"{','.join(head_str)}\n") + + # Shift-JIS、CRLF、価囲いありで書き込む writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, strict=True From 6df0c43e78a68ff53184b17c841ef8b52105e34c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 11:45:29 +0900 Subject: [PATCH 439/962] =?UTF-8?q?ultmarc=5Fprocess=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E3=82=8F=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/ultmarc/export_vjsk_csv_process.py | 5 +++-- .../src/batch/ultmarc/ultmarc_process.py | 17 +---------------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 6 +++++- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py index a1b2ff23..ddd2a0ae 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py @@ -241,10 +241,11 @@ def make_csv_data(record_inst_csv: list, record_pharm_cs: list): 'FILLER_3', 'FILLER_4', 'FILLER_5', 'REGIST_DATE', 'CREATE_USER', 'UPDATE_DATE', 'UPDATE_USER', 'SYS_REGIST_DATE', 'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID'] - # Shift-JIS、CRLF、価囲いありで書き込む with open(csv_file_path, mode='w', encoding='cp932') as csv_file: - # ヘッダ行書き込み + # ヘッダ行書き込み(くくり文字を加えない為にwriteで出力する) csv_file.write(f"{','.join(head_str)}\n") + + # Shift-JIS、CRLF、価囲いありで書き込む writer = csv.writer(csv_file, delimiter=',', lineterminator='\n', quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, strict=True diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py index e0e6ba22..0e2ffe6a 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/ultmarc_process.py @@ -5,7 +5,7 @@ from datetime import datetime from src.aws.s3 import UltmarcBucket from src.batch.common.batch_context import BatchContext from src.batch.ultmarc.datfile import DatFile -from src.batch.ultmarc import export_vjsk_csv_process + from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \ UltmarcTableMapperFactory from src.db.database import Database @@ -61,21 +61,6 @@ def exec_import(): raise BatchOperationException(e) -def exec_export(): - """V実消化用施設データ作成処理""" - if not batch_context.is_ultmarc_imported: - logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') - return - - try: - logger.info('V実用消化施設データ作成処理: 開始') - export_vjsk_csv_process.exec() - logger.info('V実用消化施設データ作成処理: 終了') - except Exception as e: - raise BatchOperationException(e) - return - - def _import_to_ultmarc_table(dat_file: DatFile): db = Database.get_instance() try: diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 45e297e9..3b314b26 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -13,6 +13,7 @@ from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants +from src.batch.ultmarc import export_vjsk_csv_process logger = get_logger('日次処理コントロール') @@ -75,8 +76,11 @@ def exec(): logger.debug(f'{"アルトマーク取込が行われました。" if batch_context.is_ultmarc_imported else "アルトマーク取込が行われませんでした。"}') try: + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') + return logger.info('V実消化用施設データ作成処理:起動') - ultmarc_process.exec_export() + export_vjsk_csv_process.exec() logger.info('V実消化用施設データ作成処理:終了') except BatchOperationException as e: logger.exception(f'V実消化用施設データ作成処理エラー(異常終了){e}') From 819c1543f8c01b4d784b3da2548a7924f34e6a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 13:54:11 +0900 Subject: [PATCH 440/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-monthly/src/aws/s3.py | 7 +-- .../src/batch/output_arisj_file_process.py | 51 ++++++++++--------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/ecs/jskult-batch-monthly/src/aws/s3.py b/ecs/jskult-batch-monthly/src/aws/s3.py index 8804bba9..17ed0fe9 100644 --- a/ecs/jskult-batch-monthly/src/aws/s3.py +++ b/ecs/jskult-batch-monthly/src/aws/s3.py @@ -69,10 +69,7 @@ class ArisjBucket(S3Bucket): _bucket_name = environment.ARISJ_DATA_BUCKET _folder = environment.ARISJ_BACKUP_FOLDER - def list_dat_file(self): - return self._s3_client.list_objects(self._bucket_name, self._folder) - - def s3_arisj_csv_upload(self, arisj_create_csv: str, csv_file_path: str): + def upload_arisj_csv_file(self, arisj_create_csv: str, csv_file_path: str): # s3にCSVファイルをUPする Bucket = environment.ARISJ_DATA_BUCKET folder = environment.ARISJ_DATA_FOLDER @@ -81,7 +78,7 @@ class ArisjBucket(S3Bucket): s3_client.upload_file(csv_file_path, Bucket, csv_file_name) return - def backup_dat_file(self, dat_file_key: str, datetime_key: str): + def backup_arisj_csv_file(self, dat_file_key: str, datetime_key: str): # バックアップバケットにコピー arisj_backup_bucket = ArisjBackupBucket() folder = environment.ARISJ_DATA_FOLDER diff --git a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py index 9d7d5587..d3f81597 100644 --- a/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py +++ b/ecs/jskult-batch-monthly/src/batch/output_arisj_file_process.py @@ -12,13 +12,14 @@ import csv logger = get_logger('ARIS-J連携データ出力') -create_date = datetime.now().strftime('%Y%m%d%H%M%S') -arisj_create_csv = f'D0004_ARIS_M_DCF_{create_date}.csv' sql_err_msg = "SQL実行エラーです。" def exec(): """ 実消化&アルトマーク月次バッチ """ + create_date = datetime.now().strftime('%Y%m%d%H%M%S') + arisj_csv_file_name = f'D0004_ARIS_M_DCF_{create_date}.csv' + try: logger.info('バッチ処理を開始しました。') @@ -34,30 +35,30 @@ def exec(): db.begin() # 正常系データの反映 - # 過去分は不要のため、デリート - physical_wk_inst_aris_if_delete(db) + # 前回保管した施設IFワークを削除する + delete_previous_wk_inst_aris_if_record(db) # 正常系データを取得しWKテーブルに保存する。 - wk_inst_aris_if_insert_into(db) + insert_normal_record_into_wk_inst_aris_if(db) # 正常系データの件数を取得 - suc_count = wk_inst_aris_if_count(db) + suc_count = count_wk_inst_aris_if_record(db) # 警告系データの反映 - # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 - physical_wk_inst_aris_if_wrn_delete(db) + # 前回保管した施設IF警告ワークを削除する + delete_previous_wk_inst_aris_if_wrn_record(db) # 異常系データを取得しWKテーブルに保存する。 - wk_inst_aris_if_wrn_insert_into(db) + insert_abnormal_record_into_wk_inst_aris_if_wrn(db) # 異常系データの件数を取得 - wrn_count = wk_inst_aris_if_wrn_count(db) + wrn_count = count_wk_inst_aris_if_wrn_record(db) # CSVファイルの作成用のSQL実行 record_csv = csv_data_select(db) # CSVファイル作成 - csv_file_path = make_csv_data(record_csv) + csv_file_path = make_csv_data(record_csv, arisj_csv_file_name) # トランザクションの終了 db.commit() @@ -66,18 +67,18 @@ def exec(): sum_count = suc_count + wrn_count logger.info(f'(対象件数:{sum_count}/正常件数:{suc_count}/警告件数:{wrn_count})') + arisj_bucket = ArisjBucket() # CSVファイル移動処理 try: - ArisjBucket().s3_arisj_csv_upload(arisj_create_csv, csv_file_path) + arisj_bucket.upload_arisj_csv_file(arisj_csv_file_name, csv_file_path) except Exception as e: logger.info('S3バケットArisjへのCSVデータ、移動できませんでした。') raise e # 処理後ファイルをバックアップ try: - arisj_bucket = ArisjBucket() batch_context = BatchContext.get_instance() - arisj_bucket.backup_dat_file(arisj_create_csv, batch_context.syor_date) + arisj_bucket.backup_arisj_csv_file(arisj_csv_file_name, batch_context.syor_date) except Exception as e: logger.info('S3バケットArisjバックアップへCSVデータ、コピーできませんでした。') raise e @@ -93,8 +94,8 @@ def exec(): db.disconnect() -def physical_wk_inst_aris_if_delete(db): - # 過去分は不要のため、デリート +def delete_previous_wk_inst_aris_if_record(db): + # 前回保管した施設IFワークを削除する try: # WKテーブルの過去分削除SQL sql = """\ @@ -107,7 +108,7 @@ def physical_wk_inst_aris_if_delete(db): raise e -def wk_inst_aris_if_insert_into(db): +def insert_normal_record_into_wk_inst_aris_if(db): # 正常系データを取得しWKテーブルに保存する。 try: # 正常系データを取得しWKテーブルに保存SQL @@ -155,7 +156,7 @@ def wk_inst_aris_if_insert_into(db): raise e -def wk_inst_aris_if_count(db): +def count_wk_inst_aris_if_record(db): # 正常系データの件数を取得 try: # 正常系データの件数を取得SQL @@ -169,8 +170,8 @@ def wk_inst_aris_if_count(db): raise e -def physical_wk_inst_aris_if_wrn_delete(db): - # 過去分は不要のため、DWH.WK_INST_ARIS_IF_WRNをデリートする。 +def delete_previous_wk_inst_aris_if_wrn_record(db): + # 前回保管した施設IF警告ワークを削除する try: # 異常系WKテーブルの過去分削除SQL sql = """\ @@ -184,7 +185,7 @@ def physical_wk_inst_aris_if_wrn_delete(db): raise e -def wk_inst_aris_if_wrn_insert_into(db): +def insert_abnormal_record_into_wk_inst_aris_if_wrn(db): # 異常系データを取得しWKテーブルに保存する。 try: # 異常系データを取得しWKテーブルに保存SQL @@ -238,7 +239,7 @@ def wk_inst_aris_if_wrn_insert_into(db): raise e -def wk_inst_aris_if_wrn_count(db): +def count_wk_inst_aris_if_wrn_record(db): # 異常系データの件数を取得 try: # 異常系データの件数を取得SQL @@ -271,18 +272,18 @@ def csv_data_select(db): raise e -def make_csv_data(record_csv: list): +def make_csv_data(record_csv: list, arisj_csv_file_name: str): # 一時ファイルとして保存する(CSVファイル) try: temporary_dir = tempfile.mkdtemp() - csv_file_path = path.join(temporary_dir, arisj_create_csv) + csv_file_path = path.join(temporary_dir, arisj_csv_file_name) head_str = ['TC_HOSPITAL', 'TJ_HOSPITAL', 'TJ_HOSPITALSHORT', 'TK_HOSPITAL', 'TC_PREFECTURE', 'TJ_PREFECTURE', 'TJ_ZIPCODE', 'TJ_CITY', 'TJ_ADDRESS', 'TJ_DEPARTMENT', 'TJ_TELEPHONENUMBER', 'TC_HOSPITALCAT', 'TC_HOSPITALTYPE', 'TS_UPDATE', 'TD_UPDATE'] with open(csv_file_path, mode='w', encoding='cp932') as csv_file: - # ヘッダ行書き込み(くくり文字をつけない為にwriteしています) + # ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています) csv_file.write(f"{','.join(head_str)}\n") # Shift-JIS、CRLF、価囲いありで書き込む From 552f2475e3d96846d5973bf834a2cb6e08798270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 14:10:41 +0900 Subject: [PATCH 441/962] =?UTF-8?q?=E3=83=8D=E3=83=BC=E3=83=9F=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rt_vjsk_csv_process.py => vjsk_process.py} | 31 +++++++++---------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 4 +-- 2 files changed, 17 insertions(+), 18 deletions(-) rename ecs/jskult-batch-daily/src/batch/ultmarc/{export_vjsk_csv_process.py => vjsk_process.py} (91%) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py similarity index 91% rename from ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py index ddd2a0ae..9c0b83a1 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/export_vjsk_csv_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py @@ -1,6 +1,6 @@ """アルトマークデータ処理""" -from src.aws.s3 import UltmarcBucket, VjskBucket +from src.aws.s3 import VjskBucket from src.batch.common.batch_context import BatchContext from src.db.database import Database @@ -10,14 +10,13 @@ import os.path as path import csv logger = get_logger('V実用消化施設データ作成処理') -ultmarc_bucket = UltmarcBucket() -batch_context = BatchContext.get_instance() sql_err_msg = "SQL実行エラーです。" -vjsk_csv_file_name = 'ComInst.csv' def exec(): + vjsk_csv_file_name = 'ComInst.csv' + db = Database.get_instance() try: logger.info('バッチ処理を開始しました。') @@ -32,11 +31,11 @@ def exec(): raise e # CSVファイルの作成用のSQL実行(施設) - record_inst_csv = csv_data_inst_select(db) + record_inst = select_inst_record(db) # CSVファイルの作成用のSQL実行(薬局) - record_pharm_csv = csv_data_pharm_select(db) + record_pharm = select_pharm_record(db) # CSVファイル作成 - csv_file_path = make_csv_data(record_inst_csv, record_pharm_csv) + csv_file_path = make_csv_data(record_inst, record_pharm, vjsk_csv_file_name) vjsk_bucket = VjskBucket() try: @@ -54,7 +53,7 @@ def exec(): logger.info('バックアップバケットへCSVデータをコピーできませんでした。') raise e - csv_count = len(record_inst_csv) + len(record_pharm_csv) + csv_count = len(record_inst) + len(record_pharm) logger.info(f'CSV出力件数: {csv_count}。') logger.info('バッチ処理を正常に終了しました。') except Exception as e: @@ -66,8 +65,8 @@ def exec(): return -def csv_data_inst_select(db): - # CSVファイルの作成用のSQL実行(施設) +def select_inst_record(db): + # CSVファイル作成用のSQL実行(施設) try: # 施設テーブル検索SQL sql = """\ @@ -144,8 +143,8 @@ def csv_data_inst_select(db): raise e -def csv_data_pharm_select(db): - # CSVファイルの作成用のSQL実行(薬局) +def select_pharm_record(db): + # CSVファイル作成用のSQL実行(薬局) try: # 薬局テーブル検索SQL sql = """\ @@ -222,7 +221,7 @@ def csv_data_pharm_select(db): raise e -def make_csv_data(record_inst_csv: list, record_pharm_cs: list): +def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str): # 一時ファイルとして保存する(CSVファイル) try: @@ -242,7 +241,7 @@ def make_csv_data(record_inst_csv: list, record_pharm_cs: list): 'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID'] with open(csv_file_path, mode='w', encoding='cp932') as csv_file: - # ヘッダ行書き込み(くくり文字を加えない為にwriteで出力する) + # ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています) csv_file.write(f"{','.join(head_str)}\n") # Shift-JIS、CRLF、価囲いありで書き込む @@ -252,13 +251,13 @@ def make_csv_data(record_inst_csv: list, record_pharm_cs: list): ) # データ部分書き込み(施設) - for record_inst_data in record_inst_csv: + for record_inst_data in record_inst: record_inst_value = list(record_inst_data.values()) csv_data = ['' if n is None else n for n in record_inst_value] writer.writerow(csv_data) # データ部分書き込み(薬局) - for record_pharm_data in record_pharm_cs: + for record_pharm_data in record_pharm: record_pharm_value = list(record_pharm_data.values()) csv_data = ['' if n is None else n for n in record_pharm_value] writer.writerow(csv_data) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 3b314b26..0e92bd1b 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -13,7 +13,7 @@ from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants -from src.batch.ultmarc import export_vjsk_csv_process +from src.batch.ultmarc import vjsk_process logger = get_logger('日次処理コントロール') @@ -80,7 +80,7 @@ def exec(): logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') return logger.info('V実消化用施設データ作成処理:起動') - export_vjsk_csv_process.exec() + vjsk_process.exec() logger.info('V実消化用施設データ作成処理:終了') except BatchOperationException as e: logger.exception(f'V実消化用施設データ作成処理エラー(異常終了){e}') From c1a0f9a11e0cafa9ffe75886e633d1c11a933bef Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 16:29:04 +0900 Subject: [PATCH 442/962] =?UTF-8?q?=E4=BB=96=E3=82=BF=E3=82=B9=E3=82=AF?= =?UTF-8?q?=E3=81=AB=E5=BD=B1=E9=9F=BF=E3=81=8C=E3=81=82=E3=82=8B=E3=81=AE?= =?UTF-8?q?=E3=81=A7develop=E3=83=9E=E3=83=BC=E3=82=B8=E3=82=92=E5=84=AA?= =?UTF-8?q?=E5=85=88=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81=E3=80=81=E6=9C=AA?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE=E3=83=AD=E3=82=B8=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E4=B8=80=E6=97=A6=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=A2=E3=82=A6=E3=83=88=E3=81=97=E3=81=A6=E5=8B=95?= =?UTF-8?q?=E4=BD=9C=E3=81=AB=E5=BD=B1=E9=9F=BF=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 3ef87186..cef4e1ec 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -88,11 +88,13 @@ class VjskDataLoadManager: local_file_name = target["src_file_path"] # tsvファイル末尾行のTABの数が総定数と一致しない場合は例外をスロー - tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) - expect_tabs = mapper.get_file_column_separators(target["condkey"]) - if tsv_tabs != expect_tabs: - msg = f"受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした local_file_name: {local_file_name}" - raise BatchOperationException(msg) + # TODO: ↓↓↓developへのマージを優先させたいので、未テストのロジックはコメントアウトする + # tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) + # expect_tabs = mapper.get_file_column_separators(target["condkey"]) + # if tsv_tabs != expect_tabs: + # msg = f"受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした local_file_name: {local_file_name}" + # raise BatchOperationException(msg) + # TODO: ↑↑↑developへのマージを優先させたいので、未テストのロジックはコメントアウトする # データベース登録 self._import_to_db(local_file_name, target["condkey"]) From 449dedd3a5d5ce3a6caa99df3f0e19484c8b393f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 16:30:35 +0900 Subject: [PATCH 443/962] =?UTF-8?q?fix:=20=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E6=99=82=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AF?= =?UTF-8?q?ERROR=E3=83=AD=E3=82=B0=E3=81=A7=E5=87=BA=E3=81=95=E3=81=AA?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 5659c993..c8a5663c 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -130,7 +130,7 @@ def sso_authorize( # トークン検証 verified_token = jwt_token.verify_token() except JWTTokenVerifyException as e: - logger.exception(f'SSOログイン失敗:{e}') + logger.info(f'SSOログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) # トークンからユーザーIDを取得 From afd5db75e5e2bac621e0925d35869357cf2eb08c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 16:32:49 +0900 Subject: [PATCH 444/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cess.py => output_vjsk_inst_pharm_data.py} | 69 ++++++++++--------- ecs/jskult-batch-daily/src/jobctrl_daily.py | 7 +- 2 files changed, 38 insertions(+), 38 deletions(-) rename ecs/jskult-batch-daily/src/batch/ultmarc/{vjsk_process.py => output_vjsk_inst_pharm_data.py} (84%) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py similarity index 84% rename from ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py rename to ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py index 9c0b83a1..1fb338b7 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/vjsk_process.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py @@ -1,4 +1,4 @@ -"""アルトマークデータ処理""" +"""output_vjsk_inst_pharm_data""" from src.aws.s3 import VjskBucket from src.batch.common.batch_context import BatchContext @@ -9,7 +9,7 @@ import tempfile import os.path as path import csv -logger = get_logger('V実用消化施設データ作成処理') +logger = get_logger('V実消化用施設データ作成処理') sql_err_msg = "SQL実行エラーです。" @@ -17,15 +17,20 @@ sql_err_msg = "SQL実行エラーです。" def exec(): vjsk_csv_file_name = 'ComInst.csv' + # バッチ共通設定を取得 + batch_context = BatchContext.get_instance() + + if not batch_context.is_ultmarc_imported: + logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') + return + db = Database.get_instance() try: - logger.info('バッチ処理を開始しました。') + logger.info('処理開始') try: # DB接続 db.connect() - # ファイル単位でトランザクションを行う - db.begin() except Exception as e: logger.info('DB接続エラーです。') raise e @@ -42,7 +47,7 @@ def exec(): # s3へデータ移動 vjsk_bucket.upload_dat_file(vjsk_csv_file_name, csv_file_path) except Exception as e: - logger.info('S3バケットDWHへCSVデータを作成できませんでした。') + logger.info('S3バケットにCSVデータを作成できませんでした。') raise e try: @@ -54,13 +59,11 @@ def exec(): raise e csv_count = len(record_inst) + len(record_pharm) - logger.info(f'CSV出力件数: {csv_count}。') - logger.info('バッチ処理を正常に終了しました。') + logger.info(f'CSV出力件数: {csv_count}') + logger.info('正常終了') except Exception as e: raise e finally: - # 終了時に必ずコミットする - db.commit() db.disconnect() return @@ -155,14 +158,14 @@ def select_pharm_record(db): inst_name_kana, form_inst_name_kanji, inst_name_kanji, - '', - '', + '' AS rltd_univ_prnt_cd, + '' AS bed_num, close_flg, estab_sche_flg, close_start_ym, estab_sche_ym, - '', - '', + '' AS ward_abolish_flg, + '' AS inst_repre_cd, inst_repre_kana, inst_repre, phone_number_non_flg, @@ -179,24 +182,24 @@ def select_pharm_record(db): addr_cnt, manage_cd, delete_sche_reason_cd, - '', + '' AS hp_assrt_cd, dup_opp_cd, - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', + '' AS insp_item_micrb, + '' AS insp_item_serum, + '' AS insp_item_blood, + '' AS insp_item_patho, + '' AS insp_item_paras, + '' AS insp_item_biochem, + '' AS insp_item_ri, + '' AS re_exam_cd, + '' AS prmit_bed_num_other, + '' AS prmit_bed_num_mental, + '' AS prmit_bed_num_tuber, + '' AS prmit_bed_num_infection, + '' AS prmit_bed_num_sum, + '' AS prmit_bed_num_gen, + '' AS prmit_bed_num_rcup, + '' AS prmit_bed_maint_ymd, inst_pharm_div, abolish_ymd, delete_flg, @@ -240,7 +243,7 @@ def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str 'FILLER_3', 'FILLER_4', 'FILLER_5', 'REGIST_DATE', 'CREATE_USER', 'UPDATE_DATE', 'UPDATE_USER', 'SYS_REGIST_DATE', 'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID'] - with open(csv_file_path, mode='w', encoding='cp932') as csv_file: + with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file: # ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています) csv_file.write(f"{','.join(head_str)}\n") @@ -264,7 +267,7 @@ def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str except Exception as e: logger.info('ワークデータの作成に失敗しました。') - logger.info('バッチ処理を異常終了しました。') + logger.info('CSVデータの作成に失敗しました。') raise e return csv_file_path diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 0e92bd1b..e6751a47 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -13,7 +13,7 @@ from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants -from src.batch.ultmarc import vjsk_process +from src.batch.ultmarc import output_vjsk_inst_pharm_data logger = get_logger('日次処理コントロール') @@ -76,11 +76,8 @@ def exec(): logger.debug(f'{"アルトマーク取込が行われました。" if batch_context.is_ultmarc_imported else "アルトマーク取込が行われませんでした。"}') try: - if not batch_context.is_ultmarc_imported: - logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。') - return logger.info('V実消化用施設データ作成処理:起動') - vjsk_process.exec() + output_vjsk_inst_pharm_data.exec() logger.info('V実消化用施設データ作成処理:終了') except BatchOperationException as e: logger.exception(f'V実消化用施設データ作成処理エラー(異常終了){e}') From ac5ee0e20bc8bc8bfa5567532f7bff5159ba3793 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 17:04:54 +0900 Subject: [PATCH 445/962] =?UTF-8?q?feat:=20=E3=81=82=E3=82=8B=E3=81=A8?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=AF=E3=81=AE=E3=83=89=E3=83=AD=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=80=E3=82=A6=E3=83=B3=E3=81=AE=E9=AB=98=E3=81=95?= =?UTF-8?q?=E3=82=92=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/ultStyle.css | 1 + 1 file changed, 1 insertion(+) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index e39fa143..c31553f1 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -32,6 +32,7 @@ table{ .search_dropdown{ width: 100%; + height: 1.8em; } .search_longtextbox{ From a30577289111705726e673a0b631fff1e527af3d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 18:03:03 +0900 Subject: [PATCH 446/962] =?UTF-8?q?feat:=20=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=8D=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=82=B6=E3=82=A4=E3=83=B3=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/css/pagenation.css | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/pagenation.css b/ecs/jskult-webapp/src/static/css/pagenation.css index 3edbf3b2..72e4aecc 100644 --- a/ecs/jskult-webapp/src/static/css/pagenation.css +++ b/ecs/jskult-webapp/src/static/css/pagenation.css @@ -3,10 +3,6 @@ padding-top: 10px; } -/* .paginationjs { - width: 100%; -} */ - .paginationjs > .paginationjs-nav.J-paginationjs-nav{ position: absolute; right: 0; @@ -19,10 +15,12 @@ div.paginationjs-pages ul { } .paginationjs-pages > ul > li > a { - padding: 6px 18px; + padding: 6px 9px; color: white; - background-color: gainsboro; - border: 1px solid; + background-color: whitesmoke; + border: 1px solid #bbb; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) } .paginationjs-pages > ul > li > a:hover { color: black; @@ -31,27 +29,38 @@ div.paginationjs-pages ul { } .paginationjs-pages > ul > li.active > a { color: white; - background-color: gray; + background-color: #666666; + box-shadow: none; } .paginationjs-pages > ul > li.active > a:hover { color: white; - background-color: gray; + background-color: #666666; cursor: text; } .paginationjs-pages > ul > li.disabled > a { color: white; - background-color: gray; - cursor: text; + background-color: #666666; + box-shadow: none; } .paginationjs-pages > ul > li.disabled > a:hover { color: white; - background-color: gray; + background-color: #666666; cursor: text; } -.paginationjs-page { +.paginationjs-page,.paginationjs-prev,.paginationjs-next { + text-decoration: underline; margin: 0 4px; } + +.paginationjs-page:hover,.paginationjs-prev:hover,.paginationjs-next:hover { + text-decoration: none; +} + +.paginationjs-page.active,.paginationjs-prev.disabled,.paginationjs-next.disabled { + text-decoration: none; +} + .paginationjs-pages > ul { display: flex; align-items: baseline; From 518c84695e59af7fecfdf50f9244b53834809065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 5 Jul 2023 18:05:44 +0900 Subject: [PATCH 447/962] =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 44 +++++++++---------- .../ultmarc/output_vjsk_inst_pharm_data.py | 8 ++-- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 8cf6c3cf..86ffc169 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -1,4 +1,3 @@ -import io import os import os.path as path import tarfile @@ -80,28 +79,6 @@ class UltmarcBucket(S3Bucket): self._s3_client.delete_file(self._bucket_name, dat_file_key) -class VjskBucket(S3Bucket): - _bucket_name = environment.VJSK_DATA_BUCKET - _folder = environment.VJSK_DATA_SEND_FOLDER - - def list_dat_file(self): - return self._s3_client.list_objects(self._bucket_name, self._folder) - - def upload_dat_file(self, vjsk_create_csv: str, csv_file_path: str): - # S3バケットにファイルを移動 - csv_file_name = f'{self._folder}/{vjsk_create_csv}' - s3_client = S3Client() - s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name) - return - - def backup_dat_file(self, dat_file_key: str, datetime_key: str): - # バックアップバケットにコピー - vjsk_backup_bucket = VjskBackupBucket() - dat_key = f'{self._folder}/{dat_file_key}' - backup_key = f'{vjsk_backup_bucket._folder}/{self._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' - self._s3_client.copy(self._bucket_name, dat_key, vjsk_backup_bucket._bucket_name, backup_key) - - class ConfigBucket(S3Bucket): _bucket_name = environment.JSKULT_CONFIG_BUCKET @@ -139,7 +116,7 @@ class VjskBackupBucket(JskUltBackupBucket): class VjskReceiveBucket(S3Bucket): - _bucket_name = environment.JSKULT_DATA_BUCKET + _bucket_name = environment.VJSK_DATA_BUCKET _recv_folder = environment.JSKULT_DATA_FOLDER_RECV _s3_file_list = None @@ -176,3 +153,22 @@ class VjskReceiveBucket(S3Bucket): self._s3_client.copy(self._bucket_name, backup_from_file_path, jskult_backup_bucket._bucket_name, backup_key) self._s3_client.delete_file(self._bucket_name, backup_from_file_path) + + +class VjskSendBucket(S3Bucket): + _bucket_name = environment.VJSK_DATA_BUCKET + _send_folder = environment.VJSK_DATA_SEND_FOLDER + + def upload_vjsk_csv_file(self, vjsk_create_csv: str, csv_file_path: str): + # S3バケットにファイルを移動 + csv_file_name = f'{self._send_folder}/{vjsk_create_csv}' + s3_client = S3Client() + s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name) + return + + def backup_vjsk_csv_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + vjsk_backup_bucket = VjskBackupBucket() + dat_key = f'{self._send_folder}/{dat_file_key}' + backup_key = f'{vjsk_backup_bucket._folder}/{self._send_folder}/{datetime_key}/{dat_file_key.replace(f"{self._send_folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_key, vjsk_backup_bucket._bucket_name, backup_key) diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py index 1fb338b7..f72e8d92 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py @@ -1,6 +1,6 @@ """output_vjsk_inst_pharm_data""" -from src.aws.s3 import VjskBucket +from src.aws.s3 import VjskSendBucket from src.batch.common.batch_context import BatchContext from src.db.database import Database @@ -42,10 +42,10 @@ def exec(): # CSVファイル作成 csv_file_path = make_csv_data(record_inst, record_pharm, vjsk_csv_file_name) - vjsk_bucket = VjskBucket() + vjsk_bucket = VjskSendBucket() try: # s3へデータ移動 - vjsk_bucket.upload_dat_file(vjsk_csv_file_name, csv_file_path) + vjsk_bucket.upload_vjsk_csv_file(vjsk_csv_file_name, csv_file_path) except Exception as e: logger.info('S3バケットにCSVデータを作成できませんでした。') raise e @@ -53,7 +53,7 @@ def exec(): try: # 処理後ファイルをバックアップ batch_context = BatchContext.get_instance() - vjsk_bucket.backup_dat_file(vjsk_csv_file_name, batch_context.syor_date) + vjsk_bucket.backup_vjsk_csv_file(vjsk_csv_file_name, batch_context.syor_date) except Exception as e: logger.info('バックアップバケットへCSVデータをコピーできませんでした。') raise e From 4427e9362e2c80681ff8fdda5e0fb4fb847f5488 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 18:16:08 +0900 Subject: [PATCH 448/962] =?UTF-8?q?fix:=20=E4=B8=8D=E8=A6=81=E3=81=AAJS?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=82=92=E6=95=B4=E7=90=86=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/function/businessLogicScript.js | 72 ------------------- .../src/templates/docSearch.html | 16 +++-- .../src/templates/instSearch.html | 16 +++-- 3 files changed, 22 insertions(+), 82 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 36171aad..f410d5ab 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -128,28 +128,6 @@ function autoModifyDate($this){ $this.value = strFormat; } -// 他のページで共通化しよう -// ページが読み込まれたときにsendクラスのボタンを押せないようにする -// 初期値をdisabledにしときゃいい -$(function(){ - $(".send").prop('disabled',true); -}); - -// 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数 -// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること -// 条件:ボタンにクラス名 send がついていること -function resultBtDisablead(){ - var selected = ".selected" + tableCurrentPage; - var cnt1 = $(selected + ' :checked').length; - selected += " input.checkbox"; - - if(cnt1 == 0) { - $(".send").prop('disabled',true); - } - else { - $(".send").prop('disabled',false); - } -} // 前のスペースを許さない入力チェック function checkSpaceForm($this) @@ -186,13 +164,6 @@ function checkPassForm($this) $this.value=str; } -// 廃止予定 -function DisplayErrorDialog(strMesssage) { - $("#errorTxt").html(strMesssage); - $("#error").dialog("open"); -} - -/* ult.jsから移植 */ // チェックボックス全選択関数 // 条件:チェックボックスのクラス名に"selected"というのがついていること // 条件:ボタンにクラス名 send がついていること @@ -208,46 +179,3 @@ 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/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 365e2745..292dd409 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -12,6 +12,12 @@ FixedMidashi.create(); // ボタン、テキストボックス初期化 formBtDisabled(); + // Enter押下時にsubmitさせなくする + $(function() { + $(document).on("keypress", "input:not(.allow_submit)", function(event) { + return event.which !== 13; + }); + }); } @@ -112,8 +118,8 @@
- - + + @@ -231,7 +237,7 @@ return `
-
${td} @@ -241,8 +247,8 @@ }) } - // チェックボックスのチェックされている場合、施設情報ボタンを活性化させる - function resultBtDisablead(){ + // チェックボックスのチェックされている場合、医師情報ボタンを活性化させる + function resultBtDisabled(){ var checkboxes = $('input[name="data"]:checked').length; if(checkboxes == 0) { $(".info_bt").prop('disabled',true); diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 361977ae..8a866777 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -12,6 +12,12 @@ FixedMidashi.create(); // ボタン、テキストボックス初期化 formBtDisabled(); + // Enter押下時にsubmitさせなくする + $(function() { + $(document).on("keypress", "input:not(.allow_submit)", function(event) { + return event.which !== 13; + }); + }); } @@ -112,8 +118,8 @@ - - + + @@ -228,7 +234,7 @@ return `
-
${td} @@ -238,7 +244,7 @@ } // チェックボックスのチェックされている場合、施設情報ボタンを活性化させる - function resultBtDisablead(){ + function resultBtDisabled(){ var checkboxes = $('input[name="data"]:checked').length; if(checkboxes == 0) { $(".info_bt").prop('disabled',true); @@ -248,7 +254,7 @@ } } - // // 検索結果のうち、チェックされている行のデータを非表示項目に詰め込む + // 検索結果のうち、チェックされている行のデータを非表示項目に詰め込む function CheckBoxListProcessing() { let vals = []; // 配列を定義 From 5595717d0c47f2ca951b37deb6efb9f9b98ef59f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 19:06:25 +0900 Subject: [PATCH 449/962] =?UTF-8?q?style:=20=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=8D=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=A8=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AE=E9=96=93=E3=82=92=E9=96=8B=E3=81=91?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/bioStyle.css | 6 ---- ecs/jskult-webapp/src/static/css/ultStyle.css | 29 ------------------- .../src/templates/docSearch.html | 2 +- 3 files changed, 1 insertion(+), 36 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index c0ab2ca5..26bf416e 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -113,12 +113,6 @@ table{ width : 450px; } -.docSearchScroll_div { - overflow: auto; - height: 200px; - width: 1132px; -} - .transition{ text-align: right; margin-right: 60px; diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index c31553f1..af29f38a 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -403,29 +403,6 @@ table{ 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%; } @@ -558,12 +535,6 @@ table{ width : 450px; } -.docSearchScroll_div { - overflow: auto; - height: 200px; - width: 1132px; -} - /*共通:施設詳細、医師詳細*/ .transition{ text-align: right; diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 292dd409..21da4a9c 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -127,7 +127,7 @@ -
+
From 5c6192463bad355de65eebef18af4023c6689cdb Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Wed, 5 Jul 2023 19:12:44 +0900 Subject: [PATCH 450/962] =?UTF-8?q?=E8=A8=AD=E8=A8=88=E6=9B=B8=E9=80=9A?= =?UTF-8?q?=E3=82=8A=E3=81=AB=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 4 ++-- ecs/jskult-batch-daily/src/aws/s3.py | 4 ++-- ecs/jskult-batch-daily/src/system_var/environment.py | 4 ++-- .../tests/batch/vjsk/vjsk_file_check/conftest.py | 4 ++-- ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index d109a997..3eec2a82 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -13,8 +13,8 @@ JSKULT_CONFIG_BUCKET=********************** JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt -JSKULT_DATA_BUCKET=********************** -JSKULT_DATA_FOLDER_RECV=********************** +VJSK_DATA_BUCKET=********************** +VJSK_DATA_RECEIVE_FOLDER=********************** # 連携データ抽出期間 SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 # 洗替対象テーブル名 diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 1e685276..8684053d 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -117,8 +117,8 @@ class VjskBackupBucket(JskUltBackupBucket): class VjskReceiveBucket(S3Bucket): - _bucket_name = environment.JSKULT_DATA_BUCKET - _recv_folder = environment.JSKULT_DATA_FOLDER_RECV + _bucket_name = environment.VJSK_DATA_BUCKET + _recv_folder = environment.VJSK_DATA_RECEIVE_FOLDER _s3_file_list = None diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 7fddde4f..feb8a737 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -17,8 +17,8 @@ JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME'] JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME'] -JSKULT_DATA_BUCKET = os.environ['JSKULT_DATA_BUCKET'] -JSKULT_DATA_FOLDER_RECV = os.environ['JSKULT_DATA_FOLDER_RECV'] +VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] +VJSK_DATA_RECEIVE_FOLDER = os.environ['VJSK_DATA_RECEIVE_FOLDER'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index c315147a..dccdd0df 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -15,12 +15,12 @@ def s3_client(): @pytest.fixture def bucket_name(): - return os.environ["JSKULT_DATA_BUCKET"] + return os.environ["VJSK_DATA_BUCKET"] @pytest.fixture def receive_folder(): - return os.environ["JSKULT_DATA_FOLDER_RECV"] + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] # TODO 共通fixtureにして15個固定でput/delete、各個別fixtureで15個から引き算でdeleteする diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py index ea29eb63..dc77a65f 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py @@ -15,12 +15,12 @@ def s3_client(): @pytest.fixture def bucket_name(): - return os.environ["JSKULT_DATA_BUCKET"] + return os.environ["VJSK_DATA_BUCKET"] @pytest.fixture def receive_folder(): - return os.environ["JSKULT_DATA_FOLDER_RECV"] + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] @pytest.fixture From a114aacf9510e75fce2fd2bf4e21adaaa1d89cf2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Jul 2023 10:41:16 +0900 Subject: [PATCH 451/962] =?UTF-8?q?feat:=20=E3=83=AA=E3=83=9D=E3=82=B8?= =?UTF-8?q?=E3=83=88=E3=83=AA=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=83=AD=E3=82=B0=E5=87=BA=E5=8A=9B=E3=82=92?= =?UTF-8?q?logger=E3=81=AB=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/ultmarc_trt_course.py | 2 +- .../model/view/ultmarc_doctor_info_view_model.py | 4 ++-- .../src/repositories/inst_master_repository.py | 7 ++++--- .../src/repositories/prefc_master_repository.py | 7 ++++--- .../repositories/ultmarc_doctor_repository.py | 16 +++++++++------- .../ultmarc_dr_wrkplace_his_repository.py | 6 ++++-- .../ultmarc_dr_wrkplace_repository.py | 9 +++++---- .../src/repositories/ultmarc_inst_repository.py | 14 ++++++++------ .../ultmarc_inst_trt_course_repository.py | 6 ++++-- .../repositories/ultmarc_sosiety_repository.py | 6 ++++-- .../ultmarc_specialist_license_repository.py | 6 ++++-- .../ultmarc_trt_course_repository.py | 14 ++++++++------ .../src/services/ultmarc_view_service.py | 6 +++--- 13 files changed, 60 insertions(+), 43 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py index 788d9748..12ced11c 100644 --- a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py +++ b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py @@ -5,5 +5,5 @@ from src.util.sanitize import sanitize @sanitize -class UltmarcTrtCourseDBModel(BaseDBModel): +class UltmarcDrTrtCourseDBModel(BaseDBModel): trt_course_name: Optional[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 index 5de18e11..f517e4a3 100644 --- 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 @@ -10,7 +10,7 @@ from src.model.db.ultmarc_doctor_wrkplace_his import \ 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.model.db.ultmarc_trt_course import UltmarcDrTrtCourseDBModel from src.system_var import environment @@ -18,7 +18,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): subtitle: str = '医師情報' is_batch_processing: Optional[bool] doctor_info_data: Optional[UltmarcDoctorInfoDBModel] - trt_coursed_data: Optional[list[UltmarcTrtCourseDBModel]] + trt_coursed_data: Optional[list[UltmarcDrTrtCourseDBModel]] sosiety_data: Optional[list[UltmarcSosietyDBModel]] specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] diff --git a/ecs/jskult-webapp/src/repositories/inst_master_repository.py b/ecs/jskult-webapp/src/repositories/inst_master_repository.py index d4b18505..4de6b732 100644 --- a/ecs/jskult-webapp/src/repositories/inst_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/inst_master_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.inst_div_master import InstDivMasterModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_施設区分取得') + class InstDivMasterRepository(BaseRepository): @@ -21,9 +24,7 @@ class InstDivMasterRepository(BaseRepository): 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}") + logger.exception(f"DB Error : Exception={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 index c304f59f..e83e5d78 100644 --- a/ecs/jskult-webapp/src/repositories/prefc_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.prefc_master import PrefcMasterModel from src.repositories.base_repository import BaseRepository +logger = get_logger('都道府県マスタ取得') + class PrefcMasterRepository(BaseRepository): @@ -23,9 +26,7 @@ class PrefcMasterRepository(BaseRepository): 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}") + logger.exception(f"DB Error : Exception={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 index 901078ab..03ee8271 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -1,11 +1,15 @@ +import mojimoji + from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition +from src.logging.get_logger import get_logger from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty -import mojimoji + +logger = get_logger('COM_医師取得') class UltmarcDoctorRepository(BaseRepository): @@ -56,8 +60,7 @@ class UltmarcDoctorRepository(BaseRepository): return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() @@ -79,7 +82,7 @@ class UltmarcDoctorRepository(BaseRepository): 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) + 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) @@ -101,7 +104,7 @@ class UltmarcDoctorRepository(BaseRepository): 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) + 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) @@ -178,8 +181,7 @@ class UltmarcDoctorRepository(BaseRepository): return None return models[0] except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index 1fab4d45..daa82533 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -1,7 +1,10 @@ +from src.logging.get_logger import get_logger from src.model.db.ultmarc_doctor_wrkplace_his import \ UltmarcDoctorWrkplaceHisDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_医師勤務先履歴取得') + class UltmarcDoctorWrkplaceHisRepository(BaseRepository): @@ -35,8 +38,7 @@ class UltmarcDoctorWrkplaceHisRepository(BaseRepository): return None return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index b05ce6fd..4798c467 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -1,8 +1,11 @@ +from src.logging.get_logger import get_logger from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel from src.model.db.ultmarc_doctor_wrkplace_count import \ UltmarcDoctorWrkplaceCountDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_医師勤務先取得') + class UltmarcDoctorWrkplaceRepository(BaseRepository): @@ -34,8 +37,7 @@ class UltmarcDoctorWrkplaceRepository(BaseRepository): return None return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() @@ -56,8 +58,7 @@ class UltmarcDoctorWrkplaceRepository(BaseRepository): return 0 return models[0].count except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index 2522006f..ef1cab76 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -1,11 +1,15 @@ +import mojimoji + from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition +from src.logging.get_logger import get_logger from src.model.db.ultmarc_inst import UltmarcInstDBModel from src.model.db.ultmarc_inst_info import UltmarcInstInfoDBModel from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty -import mojimoji + +logger = get_logger('COM_施設取得') class UltmarcInstRepository(BaseRepository): @@ -43,8 +47,7 @@ class UltmarcInstRepository(BaseRepository): return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() @@ -72,7 +75,7 @@ class UltmarcInstRepository(BaseRepository): 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) + 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) @@ -187,8 +190,7 @@ class UltmarcInstRepository(BaseRepository): return None return models[0] except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index eaee391a..4b3c0385 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_施設診療科目取得') + class UltmarcInstTrtCourseRepository(BaseRepository): @@ -24,8 +27,7 @@ class UltmarcInstTrtCourseRepository(BaseRepository): return None return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index e3c9ac13..0cd55e8c 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py @@ -1,6 +1,9 @@ +from src.logging.get_logger import get_logger from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_学会取得') + class UltmarcSosietyRepository(BaseRepository): @@ -23,8 +26,7 @@ class UltmarcSosietyRepository(BaseRepository): return None return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index a4927b44..7024b616 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py @@ -1,7 +1,10 @@ +from src.logging.get_logger import get_logger from src.model.db.ultmarc_specialist_license import \ UltmarcSpecialistLicenseDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_専門医資格取得') + class UltmarcSpecialistLicenseRepository(BaseRepository): @@ -25,8 +28,7 @@ class UltmarcSpecialistLicenseRepository(BaseRepository): return None return models except Exception as e: - # TODO: ファイルへの書き出しはloggerでやる - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"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 index c76032a3..a5a1c9f4 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -1,8 +1,11 @@ -from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel +from src.logging.get_logger import get_logger +from src.model.db.ultmarc_trt_course import UltmarcDrTrtCourseDBModel from src.repositories.base_repository import BaseRepository +logger = get_logger('COM_医師診療科目取得') -class UltmarcTrtCourseRepository(BaseRepository): + +class UltmarcDrTrtCourseRepository(BaseRepository): FETCH_SQL = """\ SELECT trt_course_name @@ -13,19 +16,18 @@ class UltmarcTrtCourseRepository(BaseRepository): ORDER BY com_trt_course.trt_course_cd """ - def fetch_many(self, id) -> list[UltmarcTrtCourseDBModel]: + def fetch_many(self, id) -> list[UltmarcDrTrtCourseDBModel]: try: self._database.connect() query = self.FETCH_SQL result = self._database.execute_select(query, {'id': id}) - models = [UltmarcTrtCourseDBModel(**r) for r in result] + models = [UltmarcDrTrtCourseDBModel(**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}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 5c441421..24cf1d75 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -23,7 +23,7 @@ from src.repositories.ultmarc_sosiety_repository import \ from src.repositories.ultmarc_specialist_license_repository import \ UltmarcSpecialistLicenseRepository from src.repositories.ultmarc_trt_course_repository import \ - UltmarcTrtCourseRepository + UltmarcDrTrtCourseRepository from src.services.base_service import BaseService @@ -33,7 +33,7 @@ class UltmarcViewService(BaseService): 'prefc_repository': PrefcMasterRepository, 'inst_div_repository': InstDivMasterRepository, 'ultmarc_inst_repository': UltmarcInstRepository, - 'ultmarc_trt_course_repository': UltmarcTrtCourseRepository, + 'ultmarc_trt_course_repository': UltmarcDrTrtCourseRepository, 'ultmarc_inst_trt_course_repository': UltmarcInstTrtCourseRepository, 'ultmarc_sosiety_repository': UltmarcSosietyRepository, 'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository, @@ -45,7 +45,7 @@ class UltmarcViewService(BaseService): prefc_repository: PrefcMasterRepository inst_div_repository: InstDivMasterRepository ultmarc_inst_repository: UltmarcInstRepository - ultmarc_trt_course_repository: UltmarcTrtCourseRepository + ultmarc_trt_course_repository: UltmarcDrTrtCourseRepository ultmarc_inst_trt_course_repository: UltmarcInstTrtCourseRepository ultmarc_sosiety_repository: UltmarcSosietyRepository ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository From 7fa640a4c1dd61dfef37c1dda977c6ebe6929053 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 6 Jul 2023 11:42:20 +0900 Subject: [PATCH 452/962] =?UTF-8?q?style:=20=E3=82=BF=E3=83=96=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=87=E3=83=B3=E3=83=88=E2=86=92=E3=82=B9=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultmarc_trt_course_repository.py | 2 +- ecs/jskult-webapp/src/static/css/bioStyle.css | 244 ++++----- .../src/static/css/masterMainte.css | 146 ++--- .../src/static/css/menuStyle.css | 44 +- ecs/jskult-webapp/src/static/css/ultStyle.css | 484 ++++++++-------- .../static/function/businessLogicScript.js | 20 +- ecs/jskult-webapp/src/templates/docInfo.html | 422 +++++++------- .../src/templates/docSearch.html | 424 +++++++------- ecs/jskult-webapp/src/templates/instInfo.html | 518 +++++++++--------- .../src/templates/instSearch.html | 388 ++++++------- 10 files changed, 1346 insertions(+), 1346 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py index a5a1c9f4..a88ffbbe 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -11,7 +11,7 @@ class UltmarcDrTrtCourseRepository(BaseRepository): 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 + 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 """ diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 26bf416e..7ecde3c5 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -5,99 +5,99 @@ } body { - white-space: nowrap; - background-color: LightCyan; - font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; + white-space: nowrap; + background-color: LightCyan; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; } h1 { - font-size: 155%; - margin-left: 2%; - margin-top: 0%; - margin-bottom: 0%; + font-size: 155%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; } .title { - width: 800px; + width: 800px; } table{ - border-collapse : collapse; + border-collapse : collapse; } .search_table { - margin-bottom: 30px; - padding-bottom: 15px; - border-bottom: solid 1px gray; - width: 1132px; + margin-bottom: 30px; + padding-bottom: 15px; + border-bottom: solid 1px gray; + width: 1132px; } ._form { - width: 1132px; - margin-left: 10px; - margin-right: 20px; + width: 1132px; + margin-left: 10px; + margin-right: 20px; } .back_bt { - padding-bottom: 10px; + padding-bottom: 10px; } ._form input[type=text] { - width: 193px; - height: 25px; + width: 193px; + height: 25px; } ._form input[type=checkbox] { - width: 13px; - height: 13px; + width: 13px; + height: 13px; } ._form select { - width: 193px; - height: 25px; + width: 193px; + height: 25px; } .result_info { - text-align: right; + text-align: right; } .search_tb { - padding-right: 25px; + padding-right: 25px; } .search_bt { - /* width: 60px; */ - margin-left: 10px; + /* width: 60px; */ + margin-left: 10px; } .clear_bt{ - margin-left: 120px; - /* width: 60px */ + margin-left: 120px; + /* width: 60px */ } .search_dropdown { - width: 175px; + width: 175px; } .bioScroll_div { - overflow: auto; - margin-top: 1%; - height: 250px; - width: 1132px; + overflow: auto; + margin-top: 1%; + height: 250px; + width: 1132px; } .noLine{ - text-decoration: none; + text-decoration: none; } .resultAreaMsg { - margin-top: 5%; - text-align: center; - font-size: 150%; + margin-top: 5%; + text-align: center; + font-size: 150%; } .search_btTd { - text-align: right; + text-align: right; } .selection { @@ -109,70 +109,70 @@ table{ } .search_middleTd { - padding-right: 25px; - width : 450px; + padding-right: 25px; + width : 450px; } .transition{ - text-align: right; - margin-right: 60px; + text-align: right; + margin-right: 60px; } .transition_bt{ - width: 110px; - height: 40px; - margin-left: 15px; - margin-right: 15px; + width: 110px; + height: 40px; + margin-left: 15px; + margin-right: 15px; } .instutionInfo_table{ - width: 1132px; - margin-bottom: 50px; + width: 1132px; + margin-bottom: 50px; } .institution_column { - width : 160px; - background : rgb(225, 233, 250); - border : solid 1px; + width : 160px; + background : rgb(225, 233, 250); + border : solid 1px; } .institution_data { - background : rgb(244, 244, 244); - border : solid 1px; - padding-left : 0.5em; - padding-right : 0.5em; + background : rgb(244, 244, 244); + border : solid 1px; + padding-left : 0.5em; + padding-right : 0.5em; } .data_width_long { - width : 500px; + width : 500px; } .data_width_middle { - width : 300px; + width : 300px; } .data_width_short { - width : 100px; + width : 100px; } .checkbox_margin { - margin-left : 20px; + margin-left : 20px; } .border_top_none { - border-top-style:none; + border-top-style:none; } .border_bottom_none { - border-bottom-style:none; + border-bottom-style:none; } .textbox_margin { - margin-left : 20px; + margin-left : 20px; } .textbox_margin_short { - margin-left : 5px; + margin-left : 5px; } .label_margin { @@ -181,110 +181,110 @@ table{ } .trt_course{ - width: 70px; + width: 70px; } .small_tb{ - width: 100px; + width: 100px; } .docBelongScroll_div { - overflow: auto; - height: 100px; - width: 500px; - margin: 0px 30px 0px 30px; + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; } .rightPadding_table{ - padding-right: 50px; + padding-right: 50px; } .verticalBar_td{ - width: 1px; - height: 150px; - background-color: gray; + width: 1px; + height: 150px; + background-color: gray; } .docPlaceScroll_div { - overflow: auto; - height: 150px; - width: 700px; - margin: 0px 30px 0px 30px; + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; } .result_tr{ - overflow-y: scroll; - overflow-x: scroll; + overflow-y: scroll; + overflow-x: scroll; } .result_data{ - overflow-y: scroll; - overflow-x: scroll; - width: 50px; + overflow-y: scroll; + overflow-x: scroll; + width: 50px; } /* tablesoter */ table.tablesorter { - font-family:arial; - background-color: #CDCDCD; - font-size: 12pt; - text-align: left; + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { - background-color: #e6EEEE; - border: 0.1px solid silver; - font-size: 12pt; - padding: 4px; - padding-right: 20px; + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 12pt; + padding: 4px; + padding-right: 20px; } table.tablesorter thead tr .header { - background-image: url(bg.gif); - background-repeat: no-repeat; - background-position: center right; - cursor: pointer; + 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; + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; } table.tablesorter tbody td div{ - float: right; + float: right; } table.tablesorter tbody tr.odd td { - background-color:#F0F0F6; + background-color:#F0F0F6; } table.tablesorter thead tr .headerSortUp { - background-image: url(asc.gif); + background-image: url(asc.gif); } table.tablesorter thead tr .headerSortDown { - background-image: url(desc.gif); + background-image: url(desc.gif); } table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { - background-color: #8dbdd8; + background-color: #8dbdd8; } #loading { - z-index: 10000; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: #FFF; - overflow-x: hidden; - overflow-y: auto; - outline: 0; - text-align: center; - display: none; - opacity: 0.7; + z-index: 10000; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #FFF; + overflow-x: hidden; + overflow-y: auto; + outline: 0; + text-align: center; + display: none; + opacity: 0.7; } #loading_content { - position: absolute; - top: 50%; - left: 50%; + position: absolute; + top: 50%; + left: 50%; } \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index a59c1681..3c15e03d 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -1,153 +1,153 @@ body{ - background-color: LightCyan; - font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; + background-color: LightCyan; + font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; } h1{ - margin-left : 1%; + margin-left : 1%; } /*ヘッダー*/ .headerTable{ - width: 100%; + width: 100%; } .headerTdLeft{ - width: 80%; + width: 80%; } .headerTdRight{ - text-align: right; - padding-right: 2%; - width: 20%; + text-align: right; + padding-right: 2%; + width: 20%; } .buttonSize{ - width: 85px; + width: 85px; } /*////////////////////////*/ /*施設担当者データCSVダウンロード*/ /*////////////////////////*/ .searchColumnTd{ - width: 14%; + width: 14%; } .searchTextboxTd{ - width: 18%; + width: 18%; } .searchTable{ - margin-left: 3%; - margin-right: 3%; - margin-bottom: 1%; - padding-bottom: 1%; - border-bottom: solid 1px gray; - width: 94%; + 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%; + text-align: right; + width: 10%; } .searchInputTd{ - width: 19%; + width: 19%; } .searchTextbox{ - width: 90%; - margin-left: 2.5%; - margin-right: 2.5%; - margin-top: 0.8%; - margin-bottom: 0.8%; + 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%; + 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%; + text-align: right; + padding-top: 1%; } .csvOutputMessage{ - margin-left: 3%; + margin-left: 3%; } .errorColor{ - color: red; + color: red; } /*//////////////////////////*/ /*施設担当者データExcelアップロード*/ /*//////////////////////////*/ .inputTable{ - margin-left: 3%; - margin-right: 3%; - margin-bottom: 1%; - padding-bottom: 1%; - border-bottom: solid 1px gray; - width: 94%; + margin-left: 3%; + margin-right: 3%; + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 94%; } .inputLabelTd{ - width: 10%; + width: 10%; } .inputTd{ - width:20%; + width:20%; } .inputButtonTd{ - width: 50%; - text-align: right; + width: 50%; + text-align: right; } .dataCntDisp{ - text-align: right; - margin-right: 3%; + 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%; + 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; + 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; + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; } .footerMsg{ - margin-left: 3%; + margin-left: 3%; } @@ -155,10 +155,10 @@ table.inputData tbody td { /*データ上書きコピー */ /*//////////////////////////*/ .tableOverRide{ - margin-right: 3%; - margin-left: 3%; - margin-bottom: 2%; - border-bottom: solid 1px gray; - width: 94%; + 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 3a07d9fc..cabd5197 100644 --- a/ecs/jskult-webapp/src/static/css/menuStyle.css +++ b/ecs/jskult-webapp/src/static/css/menuStyle.css @@ -1,49 +1,49 @@ body{ - background-color: LightCyan; - background-size: 220%,220%; - font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; + background-color: LightCyan; + background-size: 220%,220%; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; } .background{ - margin-top: 5%; - padding: 2%; - background-color: white; - width: 40%; - border-radius: 25px; - box-shadow:5px 5px rgba(0,0,0,0.4);; + margin-top: 5%; + padding: 2%; + background-color: white; + width: 40%; + border-radius: 25px; + box-shadow:5px 5px rgba(0,0,0,0.4);; } .btn_width { - width: 80%; + width: 80%; } .form_login{ - width: 80%; - font-size: 180%; - margin: 1%; + width: 80%; + font-size: 180%; + margin: 1%; } .form_login::-webkit-input-placeholder{ - color: gray; + color: gray; } .form_login:-ms-input-placeholder{ - color: gray; + color: gray; } .form_login::-moz-placeholder{ - color: gray; + color: gray; } .logout_p{ - font-size: 160%; + font-size: 160%; } .notUseBioMsg,.notUseMainteMsg{ - font-size: 143%; - color: red; + font-size: 143%; + color: red; } .batchMsg{ - color: red; - font-size: 120%; - text-align: center; + color: red; + font-size: 120%; + text-align: center; } \ No newline at end of file diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index af29f38a..f5eea0e0 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -5,480 +5,480 @@ } body { - background-color: LightCyan; - font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; + 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%; + font-size: 150%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; } table{ - border-collapse : collapse; + border-collapse : collapse; } .header_bt{ - width: 8%; - margin-bottom: 0.8%; - margin-left: 78.5%; + width: 8%; + margin-bottom: 0.8%; + margin-left: 78.5%; } .search_textbox{ - width: 100%; + width: 100%; } .search_dropdown{ - width: 100%; - height: 1.8em; + width: 100%; + height: 1.8em; } .search_longtextbox{ - width: 100% + width: 100% } .instSearchResult { - width: 100%; + width: 100%; } .scroll_table{ - overflow: auto; - white-space: nowrap; - margin-top: 1%; - margin-bottom: 1%; - width: 100%; - height: 250px; + overflow: auto; + white-space: nowrap; + margin-top: 1%; + margin-bottom: 1%; + width: 100%; + height: 250px; } .scroll_table::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll_table::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll_table::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .ult_bt { - width: 20%; - height: 80%; + width: 20%; + height: 80%; } .info_bt{ - width: 10% + width: 10% } .search_bt{ - margin-left: 3%; - margin-top: 0.8%; - margin-bottom: 0.8%; + margin-left: 3%; + margin-top: 0.8%; + margin-bottom: 0.8%; } .notFind{ - margin-top: 5%; - text-align: center; - font-size: 150%; + margin-top: 5%; + text-align: center; + font-size: 150%; } .search_table { - margin-bottom: 1%; - padding-bottom: 1%; - border-bottom: solid 1px gray; - width: 100%; + 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%; + padding-right: 2%; + padding-top: 0.2%; + padding-bottom: 0.2%; } .leftSearch_tb{ - width: 35%; + width: 35%; } .batchMsg{ - color: red; - font-size: 120%; - text-align: center; + color: red; + font-size: 120%; + text-align: center; } ._form { - width: 95%; - margin-left: 3%; + width: 95%; + margin-left: 3%; } .result_info { - text-align: right; + text-align: right; } /*施設検索一覧ヘッダー*/ .instSearchHeaderTable{ - width: 100%; + width: 100%; } .instSearchHeaderTd{ - width: 24%; + width: 24%; } .instSearchHeaderTdCenter{ - text-align: center; - width: 50%; + text-align: center; + width: 50%; } .instSearchHeaderTdRight{ - text-align: right; - padding-right: 2%; + text-align: right; + padding-right: 2%; } .instSearchButchMsg{ - /* font-size: 80%; */ - color: red; + /* font-size: 80%; */ + color: red; } .instSearchHeader_bt{ - width: 40%; + width: 40%; } /*施設詳細*/ .instInfoTable{ - margin-top: 1%; - margin-left: 5%; - margin-right: 2%; - margin-bottom: 2%; - width: 93%; + 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%; + 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%; + 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; + 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%; + 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修正前 width: 51%;*/ + width: 20%; } /*NO5にて追加 START*/ .instDataLarge{ - width: 85%; + width: 85%; } .instDataLeft{ - width: 20%; + width: 20%; } .instDataCenter{ - width: 7%; + width: 7%; } .instDataRight{ - width: 25%; + width: 25%; } /*NO5にて追加 END*/ .instDataSmallTextbox{ - width: 45%; + width: 45%; } /*NO5にて追加 START*/ .instDataCenterTextbox{ - width: 80%; + width: 80%; } /*NO5にて追加 END*/ .instInfoTextbox{ - width: 98%; - padding-right: 1%; - padding-left: 1%; + width: 98%; + padding-right: 1%; + padding-left: 1%; } .instCdTextbox{ - /*NO5修正前 width: 13%;*/ - width: 35%; - margin-left: 0.5%; - margin-right: 2%; + /*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%; + /*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%; + /*NO5修正前 width: 43%;*/ + width: 88%; + margin-left: 0.5%; + margin-right: 2%; } .manageTextbox{ - width: 40%; + width: 40%; } .textboxMargin { - margin-left : 0.1%; + margin-left : 0.1%; } .transitionBt{ - width: 98%; - height: 30px; + width: 98%; + height: 30px; } .instHeaderTable{ - margin-left: 40%; + margin-left: 40%; } .instHeaderTd{ - width: 10%; - font-size: 140%; - text-align: center; - padding-right: 2%; + width: 10%; + font-size: 140%; + text-align: center; + padding-right: 2%; } .trtCourseTextbox{ - width: 6%; + width: 6%; } .bedTd{ - width: 46%; + width: 46%; } .bedTextbox{ - width: 70%; + width: 70%; } .xSmallTd{ - width: 9%; + width: 9%; } .xSmallTextbox{ - width: 75%; + width: 75%; } .reExamTd{ - width: 13%; + width: 13%; } .repreTd{ - width: 50%; + width: 50%; } .repreTextbox{ - width: 95%; + width: 95%; } .trtTextbox{ - width: 5%; - margin-right: 1.2%; + width: 5%; + margin-right: 1.2%; } .parentCdTextBox{ - width: 15%; + width: 15%; } .parentNameTextBox{ - width: 75%; + width: 75%; } .hpInfoColumn{ - width : 12%; - height: 40px; - background : rgb(225, 233, 250); - border : solid 1px; + width : 12%; + height: 40px; + background : rgb(225, 233, 250); + border : solid 1px; } .hpAssrtTd{ - width: 12%; + width: 12%; } .hpAssrtTextbox{ - width: 85%; + width: 85%; } .border_bottom_none { - border-bottom-style:none; + border-bottom-style:none; } .numberBox{ - text-align: right; + text-align: right; } /*医師検索*/ /*ヘッダー*/ .docHeaderTable{ - width: 100%; + width: 100%; } .docHeaderTd{ - width: 24%; + width: 24%; } .docHeaderTdCenter{ - text-align: center; - width: 50%; + text-align: center; + width: 50%; } .docHeaderTdRight{ - text-align: right; - padding-right: 2%; + text-align: right; + padding-right: 2%; } .docButchMsg{ - /* font-size: 80%; */ - color: red; + /* font-size: 80%; */ + color: red; } .docHeader_bt{ - width: 40%; + width: 40%; } /* アルトマーク課題管理表No.2の修正 8% → 10% */ /* アルトマーク課題管理表No.8の修正 10% → 14% */ .docSearchColumnTd{ - width: 14%; + width: 14%; } .docSearchTextboxTd{ - width: 18%; + width: 18%; } .docSearchTextbox_td{ - width: 94%; + width: 94%; } .docSearchTextbox{ - width: 90%; - margin-right: 5%; - margin-top: 0.8%; - margin-bottom: 0.8%; + width: 90%; + margin-right: 5%; + margin-top: 0.8%; + margin-bottom: 0.8%; } .docSearchTableDivOne{ - width: 100%; + width: 100%; } .docSearchTableDivTwo{ - margin-bottom: 1%; - padding-bottom: 1%; - border-bottom: solid 1px gray; - width: 100%; + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 100%; } .allOnOffButton{ - width: 6%; + width: 6%; } /*医師情報*/ .docInfoTable{ - margin-top: 1%; - margin-left: 5%; - margin-right: 2%; - margin-bottom: 1%; - width: 93%; - border-bottom: solid 1px gray; + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 1%; + width: 93%; + border-bottom: solid 1px gray; } .docInfoTd{ - padding-bottom: 0.5%; + padding-bottom: 0.5%; } .docInfoTextBox{ - margin-left: 0.5%; - margin-right: 2%; - width: 8%; + margin-left: 0.5%; + margin-right: 2%; + width: 8%; } .docInfoTrtTextBox{ - margin-left: 0.5%; + margin-left: 0.5%; } .docBelongTable{ - margin-left: 1%; - width: 98%; - border-bottom: solid 1px gray; + margin-left: 1%; + width: 98%; + border-bottom: solid 1px gray; } .docBelongTd{ - width: 49%; - height: 150px; + width: 49%; + height: 150px; } .docSocietyTable{ - width: 100%; + width: 100%; } .scroll{ - overflow: auto; - height: 120px; - width: 90%; - margin-left: 7%; - margin-bottom: 4%; + overflow: auto; + height: 120px; + width: 90%; + margin-left: 7%; + margin-bottom: 4%; } .scroll::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .rightBoderLine{ - border-right: solid 1px gray; + border-right: solid 1px gray; } .wrkplaceH1{ - margin-top: 0.3%; + margin-top: 0.3%; } .wrkplaceTable{ - width: 100%; + width: 100%; } @@ -492,17 +492,17 @@ table{ .clear_bt{ - margin-left: 120px; - width: 60px + margin-left: 120px; + width: 60px } .back_bt{ - margin-left: 1042px; - width: 80px + margin-left: 1042px; + width: 80px } .noLine{ - text-decoration: none; + text-decoration: none; } @@ -511,13 +511,13 @@ table{ /*共通:アルトマーク施設検索,医師検索,施設詳細*/ .maxWidth_tb { - width: 100%; + width: 100%; } /*アルトマーク施設検索,医師検索共通*/ .search_btTd { - text-align: right; + text-align: right; } .selection { @@ -531,14 +531,14 @@ table{ /*医師検索*/ .search_middleTd { - padding-right: 25px; - width : 450px; + padding-right: 25px; + width : 450px; } /*共通:施設詳細、医師詳細*/ .transition{ - text-align: right; - margin-right: 60px; + text-align: right; + margin-right: 60px; } @@ -546,18 +546,18 @@ table{ .data_width_middle { - width : 300px; + width : 300px; } .border_top_none { - border-top-style:none; + border-top-style:none; } .textbox_margin_short { - margin-left : 5px; + margin-left : 5px; } .label_margin { @@ -568,82 +568,82 @@ table{ /*医師詳細*/ .docInfo_table{ - margin-bottom: 30px; - border-bottom: solid 1px gray; - width: 1132px; + margin-bottom: 30px; + border-bottom: solid 1px gray; + width: 1132px; } .small_tb{ - width: 100px; + width: 100px; } .docBelongScroll_div { - overflow: auto; - height: 100px; - width: 500px; - margin: 0px 30px 0px 30px; + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; } .rightPadding_table{ - padding-right: 50px; + padding-right: 50px; } .docPlaceScroll_div { - overflow: auto; - height: 150px; - width: 700px; - margin: 0px 30px 0px 30px; + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; } .result_tr{ - overflow-y: scroll; - overflow-x: scroll; + overflow-y: scroll; + overflow-x: scroll; } .result_data{ - overflow-y: scroll; - overflow-x: scroll; - width: 50px; + overflow-y: scroll; + overflow-x: scroll; + width: 50px; } /* tablesoter */ table.tablesorter { - font-family:arial; - background-color: #CDCDCD; - font-size: 12pt; - text-align: left; + font-family:arial; + background-color: #CDCDCD; + font-size: 12pt; + text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { - background-color: #e6EEEE; - border: 0.1px solid silver; - font-size: 12pt; - padding: 4px; - padding-right: 20px; + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 12pt; + padding: 4px; + padding-right: 20px; } table.tablesorter thead tr .header { - background-image: url(bg.gif); - background-repeat: no-repeat; - background-position: center right; - cursor: pointer; + 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; + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; } table.tablesorter tbody tr.odd td { - background-color:#F0F0F6; + background-color:#F0F0F6; } table.tablesorter thead tr .headerSortUp { - background-image: url(asc.gif); + background-image: url(asc.gif); } table.tablesorter thead tr .headerSortDown { - background-image: url(desc.gif); + background-image: url(desc.gif); } table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { - background-color: #8dbdd8; + background-color: #8dbdd8; } diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index f410d5ab..7ce3b9ba 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -96,7 +96,7 @@ function enableDatePicker() { // 日付入力チェック // 引数:チェックするテキストボックスNo function autoModifyDate($this){ - // 日付フォーマットチェック + // 日付フォーマットチェック if($this.value === "" || (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) @@ -110,22 +110,22 @@ function autoModifyDate($this){ // yyyyMMddの場合→yyyy/MM/dd const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); if (datePatternMatches){ - strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; + strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; } // yyyy/00/00~yyyy/00/00の場合→yyyy/01/01~yyyy/12/31 // yyyy/MM/00~yyyy/MM/01の場合→yyyy/MM/01~yyyy/MM/末日 - // 開始日の場合 - if ($this.name.includes('from')){ + // 開始日の場合 + if ($this.name.includes('from')){ strFormat = strFormat.replace("00/00", "01/01"); strFormat = strFormat.replace("00", "01"); } // 終了日の場合 - else if ($this.name.includes('to')){ + else if ($this.name.includes('to')){ strFormat = strFormat.replace("00/00", "12/31"); const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); strFormat = strFormat.replace("00", date.toString()); } - $this.value = strFormat; + $this.value = strFormat; } @@ -168,14 +168,14 @@ function checkPassForm($this) // 条件:チェックボックスのクラス名に"selected"というのがついていること // 条件:ボタンにクラス名 send がついていること function allOn(){ - $(".selected").prop("checked", true); - $(".send").prop('disabled',false); + $(".selected").prop("checked", true); + $(".send").prop('disabled',false); } // チェックボックス全解除関数 // 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること // 条件:ボタンにクラス名 send がついていること function allOff(){ - $(".selected").prop("checked", false); - $(".send").prop('disabled',true); + $(".selected").prop("checked", false); + $(".send").prop('disabled',true); } diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 8f9beb21..71b82b75 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -4,228 +4,228 @@ {% with subtitle = ultmarc.subtitle %} {% include '_header.html' %} {% endwith %} - 医師情報 - - - + } + + -
- - - - - -

{{ultmarc.subtitle}}

- {% if ultmarc.is_batch_processing %} -
日次バッチ処理中のため、データが正しく表示されない可能性があります
- {% endif %} -
+ + + + + + +

{{ultmarc.subtitle}}

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

所属学会

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

所属学会専門医

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

勤務先履歴

-
- - - - - - - - - - - - - - - {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} - {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} - - - - - - - - - - {% endif %} - {% endfor %} - {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} - {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} - - - - - - - - - - {% endif %} - {% endfor %} - -
ULT施設コード勤務先略名所属部科名役職名職位開始年月日終了年月日
- {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_data.inst_name_kanji or ''}}{{doctor_wrkplace_data.blng_sec_name or ''}}{{doctor_wrkplace_data.univ_post_name or ''}}{{doctor_wrkplace_data.post_name or ''}}{{ultmarc.is_input_aply_start_ymd_format(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
- {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_his_data.inst_name_kanji or ''}}{{doctor_wrkplace_his_data.blng_sec_name or ''}}{{doctor_wrkplace_his_data.univ_post_name or ''}}{{doctor_wrkplace_his_data.post_name or ''}}{{ultmarc.is_input_his_aply_start_ymd_format(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_his_aply_end_ymd_format(doctor_wrkplace_his_data.aply_end_ymd)}}
-
+ + + 診療科目: + {% for trt_coursed_data in ultmarc.trt_coursed_data %} + + {% endfor %} + {% for i in range(5-ultmarc.is_input_trt_course_data_size())%} + + {% endfor %} + + + + + + + + + + + + +
+

所属学会

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

所属学会専門医

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

勤務先履歴

+
+ + + + + + + + + + + + + + + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} + {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} + + + + + + + + + + {% endif %} + {% endfor %} + {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} + {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} + + + + + + + + + + {% endif %} + {% endfor %} + +
ULT施設コード勤務先略名所属部科名役職名職位開始年月日終了年月日
+ {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_data.inst_name_kanji or ''}}{{doctor_wrkplace_data.blng_sec_name or ''}}{{doctor_wrkplace_data.univ_post_name or ''}}{{doctor_wrkplace_data.post_name or ''}}{{ultmarc.is_input_aply_start_ymd_format(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
+ {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_his_data.inst_name_kanji or ''}}{{doctor_wrkplace_his_data.blng_sec_name or ''}}{{doctor_wrkplace_his_data.univ_post_name or ''}}{{doctor_wrkplace_his_data.post_name or ''}}{{ultmarc.is_input_his_aply_start_ymd_format(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_his_aply_end_ymd_format(doctor_wrkplace_his_data.aply_end_ymd)}}
+
\ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 21da4a9c..7f6cc551 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -6,191 +6,191 @@ {% endwith %} - + // Enter押下時にsubmitさせなくする + $(function() { + $(document).on("keypress", "input:not(.allow_submit)", function(event) { + return event.which !== 13; + }); + }); + } + - - - - - - -

{{ultmarc.subtitle}}

- {% if ultmarc.is_batch_processing %} -
日次バッチ処理中のため、データが正しく表示されない可能性があります
- {% endif %} -
-
+ + + - \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html index d93b619c..00f8e9ab 100644 --- a/ecs/jskult-webapp/src/templates/instInfo.html +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -6,282 +6,282 @@ {% endwith %} - - + } + + -

+

{{ultmarc.subtitle}}

- {% if ultmarc.is_batch_processing %} -
日次バッチ処理中のため、データが正しく表示されない可能性があります
- {% endif %} + {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} - - - - - - - - - - - - - - - + - - - - -
- - -
- - - {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} - - -
- -
+ + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
施設コード - - 未確認 - 施設コード変換先 - - 休院店開始年月 - - 休院店 -
削除予定理由 - - 削除日 - - 開業予定年月 - - 開業 -
正式施設名(カナ)
正式施設名(漢字)
略式施設名(カナ)施設区分名
略式施設名(漢字)経営体 - - -
郵便番号 - - 住所不明 - 施設電話番号 - - 電話なし -
住所(カナ)
住所(漢字)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
施設コード + + 未確認 + 施設コード変換先 + + 休院店開始年月 + + 休院店 +
削除予定理由 + + 削除日 + + 開業予定年月 + + 開業 +
正式施設名(カナ)
正式施設名(漢字)
略式施設名(カナ)施設区分名
略式施設名(漢字)経営体 + + +
郵便番号 + + 住所不明 + 施設電話番号 + + 電話なし +
住所(カナ)
住所(漢字)

- - - - - - - - - - - - + + + + + + +
病院種別再審査区分関連大学親名 - - -
診療科目 - {% if ultmarc.inst_trt_coursed_data != None %} - {% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %} - - {% endfor %} - {% endif %} - {% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %} - - {% endfor %} + + + + + + + + + + + + - - - - - - -
病院種別再審査区分関連大学親名 + + +
診療科目 + {% if ultmarc.inst_trt_coursed_data != None %} + {% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %} + + {% endfor %} + {% endif %} + {% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %} + + {% endfor %} -
検査工程 - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
特務医務室許可病床数 - - - - - - - - - - - - - - - - - - - - - -
一般療養精神感染症結核その他合計
-
病棟閉鎖  一部病棟閉鎖
病床数(定員)メンテ年月日
- - - - - - - - - - - - - - - - - - - - -
代表者個人コード
施設代表者(カナ)
施設代表者(漢字)
修正年月日
+
検査工程 + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
特務医務室許可病床数 + + + + + + + + + + + + + + + + + + + + + +
一般療養精神感染症結核その他合計
+
病棟閉鎖  一部病棟閉鎖
病床数(定員)メンテ年月日
+ + + + + + + + + + + + + + + + + + + + +
代表者個人コード
施設代表者(カナ)
施設代表者(漢字)
修正年月日
\ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 8a866777..93018a91 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -6,189 +6,189 @@ {% endwith %} - + // Enter押下時にsubmitさせなくする + $(function() { + $(document).on("keypress", "input:not(.allow_submit)", function(event) { + return event.which !== 13; + }); + }); + } + - - - - - + + + +

{{ultmarc.subtitle}}

+ + + + + - - -

{{ultmarc.subtitle}}

{% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
{% endif %} -
- - +
+ + +
+ - -
- - - - + + + + + + - - - - -
- - - - - - - - - - - - - - - - -
ULT施設コード削除ULT施設名(漢字)ULT施設住所(漢字)郵便番号施設電話番号施設区分名病院種別都道府県
- {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} -
- 検索件数が500件を超えています 検索項目を見直してください -
- {% endif %} - {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} -
- 対象のデータが存在しません -
- {% endif %} -
+ + + + +
+ + + + + + + + + + + + + + + + +
ULT施設コード削除ULT施設名(漢字)ULT施設住所(漢字)郵便番号施設電話番号施設区分名病院種別都道府県
+ {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} +
+ 検索件数が500件を超えています 検索項目を見直してください +
+ {% endif %} + {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} +
+ 対象のデータが存在しません +
+ {% endif %} +
- - -
+ + + - + \ No newline at end of file From a8de16a3bd5492ac1a5538fa77079486e3b3f394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 6 Jul 2023 13:03:58 +0900 Subject: [PATCH 453/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/aws/s3.py | 4 ++-- .../src/batch/ultmarc/output_vjsk_inst_pharm_data.py | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 86ffc169..764b600c 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -159,14 +159,14 @@ class VjskSendBucket(S3Bucket): _bucket_name = environment.VJSK_DATA_BUCKET _send_folder = environment.VJSK_DATA_SEND_FOLDER - def upload_vjsk_csv_file(self, vjsk_create_csv: str, csv_file_path: str): + def upload_inst_pharm_csv_file(self, vjsk_create_csv: str, csv_file_path: str): # S3バケットにファイルを移動 csv_file_name = f'{self._send_folder}/{vjsk_create_csv}' s3_client = S3Client() s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name) return - def backup_vjsk_csv_file(self, dat_file_key: str, datetime_key: str): + def backup_inst_pharm_csv_file(self, dat_file_key: str, datetime_key: str): # バックアップバケットにコピー vjsk_backup_bucket = VjskBackupBucket() dat_key = f'{self._send_folder}/{dat_file_key}' diff --git a/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py index f72e8d92..838dae34 100644 --- a/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py +++ b/ecs/jskult-batch-daily/src/batch/ultmarc/output_vjsk_inst_pharm_data.py @@ -45,15 +45,14 @@ def exec(): vjsk_bucket = VjskSendBucket() try: # s3へデータ移動 - vjsk_bucket.upload_vjsk_csv_file(vjsk_csv_file_name, csv_file_path) + vjsk_bucket.upload_inst_pharm_csv_file(vjsk_csv_file_name, csv_file_path) except Exception as e: logger.info('S3バケットにCSVデータを作成できませんでした。') raise e try: # 処理後ファイルをバックアップ - batch_context = BatchContext.get_instance() - vjsk_bucket.backup_vjsk_csv_file(vjsk_csv_file_name, batch_context.syor_date) + vjsk_bucket.backup_inst_pharm_csv_file(vjsk_csv_file_name, batch_context.syor_date) except Exception as e: logger.info('バックアップバケットへCSVデータをコピーできませんでした。') raise e @@ -142,7 +141,7 @@ def select_inst_record(db): """ return db.execute_select(sql) except Exception as e: - logger.debug(f'{sql_err_msg}') + logger.debug(sql_err_msg) raise e @@ -220,7 +219,7 @@ def select_pharm_record(db): """ return db.execute_select(sql) except Exception as e: - logger.debug(f'{sql_err_msg}') + logger.debug(sql_err_msg) raise e @@ -266,7 +265,6 @@ def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str writer.writerow(csv_data) except Exception as e: - logger.info('ワークデータの作成に失敗しました。') logger.info('CSVデータの作成に失敗しました。') raise e From f5b4628f71dfb15af8af78e59944f9bf9a2e654b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 10 Jul 2023 09:53:58 +0900 Subject: [PATCH 454/962] =?UTF-8?q?feat:=20=E3=80=90=E9=96=8B=E7=99=BA?= =?UTF-8?q?=E3=80=91=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=A1=E3=83=B3=E3=83=86?= =?UTF-8?q?=20=E3=82=A2=E3=83=83=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89?= =?UTF-8?q?=E7=94=BB=E9=9D=A2(=E4=BB=AE=E4=BD=9C=E3=82=8A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 105 +++- .../src/model/db/master_mente_count.py | 9 + .../src/model/internal/master_mainte_csv.py | 477 ++++++++++++++++++ .../internal/master_mainte_insert_emp_chg.py | 161 ++++++ .../src/model/request/master_mainte_csvup.py | 31 ++ .../view/inst_emp_csv_upload_view_model.py | 57 +++ .../src/model/view/mainte_csv_error_model.py | 30 ++ .../src/model/view/mainte_csv_upload_model.py | 7 + .../mente_exist_bu_cd_repository.py | 29 ++ .../mente_exist_dummy_data_repository.py | 34 ++ .../mente_exist_emp_cd_repository.py | 32 ++ .../mente_exist_emp_chg_inst_repository.py | 32 ++ .../mente_exist_inst_cd_repository.py | 29 ++ .../mente_exist_real_data_repository.py | 34 ++ .../mente_write_emp_chg_inst_repository.py | 124 +++++ .../src/services/master_mainte_service.py | 142 ++++++ .../static/function/businessLogicScript.js | 67 ++- ecs/jskult-webapp/src/system_var/constants.py | 107 ++++ .../src/templates/instEmpCsvDL.html | 167 +++++- .../src/templates/instEmpCsvUL.html | 323 +++++++++++- .../src/templates/tableOverride.html | 60 +++ 21 files changed, 2050 insertions(+), 7 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/master_mente_count.py create mode 100644 ecs/jskult-webapp/src/model/internal/master_mainte_csv.py create mode 100644 ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py create mode 100644 ecs/jskult-webapp/src/model/request/master_mainte_csvup.py create mode 100644 ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py create mode 100644 ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py create mode 100644 ecs/jskult-webapp/src/services/master_mainte_service.py diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index ea972ad6..beb17f53 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -1,3 +1,4 @@ +from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse from starlette import status @@ -13,9 +14,13 @@ from src.model.view.master_mainte_menu_view_model import \ 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.master_mainte_service import MasterMainteService from src.services.session_service import set_session from src.system_var import constants from src.templates import templates +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from fastapi import APIRouter, File, Form, Request +from io import TextIOWrapper, BytesIO router = APIRouter() router.route_class = AuthenticatedRoute @@ -85,7 +90,14 @@ def inst_emp_csv_upload_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - view_model = InstEmpCsvUploadViewModel() + mainte_csv_up = InstEmpCsvUploadViewModel( + # is_verified=False, + # select_function="", + # select_table="", + # new_inst_emp="", + # dialog_msg="", + # error_list=[] + ) # セッション書き換え session.update( actions=[ @@ -98,14 +110,101 @@ def inst_emp_csv_upload_view( 'instEmpCsvUL.html', { 'request': request, - 'view': view_model + 'mainte_csv_up': mainte_csv_up }, headers={'session_key': session.session_key} ) return templates_response -@router.get('/instEmpCsvDL', response_class=HTMLResponse) +@router.post('/instEmpCsvUL', response_class=HTMLResponse) +async def inst_emp_csv_upload( + request: Request, + csv_upload_form: Optional[MasterMainteCsvUpModel] = Depends(MasterMainteCsvUpModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + 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) + + # 画面表示用のモデル + mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( + TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read())), + csv_upload_form.csv_file.filename, + csv_upload_form) + # セッション書き換え + 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, + 'mainte_csv_up': mainte_csv_up + }, + headers={'session_key': session.session_key} + ) + return templates_response + + +@router.post('/newInst', response_class=HTMLResponse) +def new_inst_result_view( + request: Request, + csv_upload_form: Optional[MasterMainteCsvUpModel] = Depends(MasterMainteCsvUpModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + 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) + + # 画面表示用のモデル + mainte_csv_up = master_mainte_service.prepare_mainte_new_inst_view(session.user_id, csv_upload_form) + # セッション書き換え + 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, + 'mainte_csv_up': mainte_csv_up + }, + 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)) diff --git a/ecs/jskult-webapp/src/model/db/master_mente_count.py b/ecs/jskult-webapp/src/model/db/master_mente_count.py new file mode 100644 index 00000000..a3837819 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/master_mente_count.py @@ -0,0 +1,9 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class MasterMenteCountModel(BaseDBModel): + count: Optional[int] diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py new file mode 100644 index 00000000..0edf92c8 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -0,0 +1,477 @@ +import csv +from io import TextIOWrapper +from abc import ABCMeta, abstractmethod +from src.system_var import constants +from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository +from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository +from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository +from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository +from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository +from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel + + +class MasterMainteCSVItem(metaclass=ABCMeta): + + select_table: str + line_num: str + csv_row: list[str] # dictで持つかどうかは要検討 + inst_cd: str + ta_cd: str + emp_cd: str + inst_cd_repository: MenteExistInstCdRepository + emp_cd_repository: MenteExistEmpCdRepository + bu_cd_repository: MenteExistBuCdRepository + dummy_data_repository: MenteExistDummyDataRepository + real_data_repository: MenteExistRealDataRepository + emp_chg_inst_repository: MenteExistEmpChgInstRepository + + def __init__( + self, + csv_row: list[str], + select_table: str, + line_num: str, + inst_cd_repository: MenteExistInstCdRepository, + emp_cd_repository: MenteExistEmpCdRepository, + bu_cd_repository: MenteExistBuCdRepository, + dummy_data_repository: MenteExistDummyDataRepository, + real_data_repository: MenteExistRealDataRepository, + emp_chg_inst_repository: MenteExistEmpChgInstRepository + ): + self.select_table = select_table # ダミー or 本番 + self.csv_row = csv_row # CSVの1行 + self.line_num = line_num # CSVの行数 + self.inst_cd_repository = inst_cd_repository + self.emp_cd_repository = emp_cd_repository + self.bu_cd_repository = bu_cd_repository + self.dummy_data_repository = dummy_data_repository + self.real_data_repository = real_data_repository + self.emp_chg_inst_repository = emp_chg_inst_repository + + def validate(self) -> list[list[str]]: + """ + 項目のバリデーションを行うテンプレートメソッド\n + 各チェックロジックはサブクラスで実装する + エラーが有る場合、[行数、項目名: エラー内容]のリストを返す + """ + error_list = [] + # 必須チェック 及び コメントエラーチェック + error_list.extend(self.check_require()) + # 施設コード存在チェック + error_list.extend(self.check_inst_cd_exists()) + # MUID存在チェック + error_list.extend(self.check_emp_cd_exists()) + # BuCd存在チェック + error_list.extend(self.check_bu_cd_exists()) + # 適用開始日 < 適用終了日、実在日チェック + # error_list.extend(self.check_existing_date()) + # 項目数チェック + error_list.extend(self.check_item_count()) + # データ存在チェック + error_list.extend(self.check_data_exists()) + + # エラーのないリストを省いて返す + error_list = [error for error in error_list if len(error) != 0] + return error_list + + # protected? + def check_csv_item_count(self, item_count: int) -> list[str]: + error_list = [] + + for col_num, row in enumerate(self.csv_row, start=1): + if col_num > item_count and row is not None and len(row) > 0: + error_list.append([self.line_num, '', constants.CSV_UP_ITEM_CNT_ERR, 'の項目数が一致しません。項目数を確認してください。']) + break + return error_list + + def emp_chg_inst_count(self, start_date: str): + table_name = 'src05.emp_chg_inst_wrk' if self.select_table == 'dummy' else 'src05.emp_chg_inst' + # pythonは子クラスのメンバも親から呼べる? + return self.emp_chg_inst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, table_name) + + def is_error_emp_cd(self, start_date: str) -> bool: + if start_date is None or len(start_date) == 0: + return False + if self.emp_cd_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: + return True + return False + + @abstractmethod + def csv_row_data(self) -> dict: + pass + ... + + @abstractmethod + def check_require(self) -> list[str]: + """必須チェック""" + pass + ... + + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + inst_cd_count = self.inst_cd_repository.fetch_count(self.inst_cd) + if inst_cd_count == 0: + # 親クラスに持った方がいいので即値指定 + error_list.append([self.line_num, '施設コード', constants.CSV_UP_NOT_EXIST_INST_CD_ERR, '']) + return error_list + + @abstractmethod + def check_emp_cd_exists(self) -> list[str]: + """MUID存在チェック""" + pass + + def check_bu_cd_exists(self) -> list[str]: + """BuCd存在チェック""" + error_list = [] + + bu_cd_count = self.bu_cd_repository.fetch_count(self.bu_cd) + if bu_cd_count == 0: + # 親クラスに持った方がいいので即値指定 + error_list.append([self.line_num, 'ビジネスユニットコード', constants.CSV_UP_NOT_EXIST_BU_CD_ERR, '']) + return error_list + + @abstractmethod + def check_existing_date(self) -> list[str]: + """適用開始日 < 適用終了日、実在日チェック""" + pass + + @abstractmethod + def check_item_count(self) -> list[str]: + """項目数チェック""" + pass + ... + + @abstractmethod + def check_data_exists(self) -> list[str]: + """データ存在チェック""" + pass + + +class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): + """新規施設担当者登録CSV""" + # inst_cd: str # a + inst_name: str # b + # ta_cd: str # c + # emp_cd: str # d + emp_name_family: str # e + emp_name_first: str # f + bu_cd: str # g + start_date: str # h + end_date: str # i + + def __init__( + self, + csv_row: list[str], + select_table: str, + line_num: str, + inst_cd_repository: MenteExistInstCdRepository, + emp_cd_repository: MenteExistEmpCdRepository, + bu_cd_repository: MenteExistBuCdRepository, + dummy_data_repository: MenteExistDummyDataRepository, + real_data_repository: MenteExistRealDataRepository, + emp_chg_inst_repository: MenteExistEmpChgInstRepository + ): + super().__init__( + csv_row, + select_table, + line_num, + inst_cd_repository, + emp_cd_repository, + bu_cd_repository, + dummy_data_repository, + real_data_repository, + emp_chg_inst_repository + ) + self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] # a + self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] # b + self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO] # c + self.emp_cd = self.csv_row[constants.CSV_NEW_EMP_CD_COL_NO] # d + self.emp_name_family = self.csv_row[constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO] # e + self.emp_name_first = self.csv_row[constants.CSV_NEW_EMP_NAME_FIRST_COL_NO] # f + self.bu_cd = self.csv_row[constants.CSV_NEW_BU_CD_COL_NO] # g + self.start_date = self.csv_row[constants.CSV_NEW_START_DATE] # h + self.end_date = self.csv_row[constants.CSV_NEW_END_DATE] # i + + def csv_row_data(self) -> dict: + return {constants.NEW_INST_EMP_CSV_MAP[i]: self.csv_row[i] for i in range(len(self.csv_row))} + + def check_require(self) -> list[str]: + error_list = [] + if len(self.inst_cd) == 0: + error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) # エラーコードを入れないと、出力制御が難しい。 + # メッセージの一部を配列に混ぜるかどうか検討 + if len(self.ta_cd) == 0: + error_list.append( + [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + + if len(self.emp_cd) == 0: + error_list.append( + [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + + if len(self.bu_cd) == 0: + error_list.append( + [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + + if len(self.start_date) == 0: + error_list.append( + [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + + if len(self.end_date) == 0: + error_list.append( + [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + + return error_list + + def check_emp_cd_exists(self) -> list[str]: + error_list = [] + if self.start_date is None or len(self.start_date) == 0: + return error_list + + if super().is_error_emp_cd(self.start_date) is True: + error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], + constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + + return error_list + + def check_item_count(self) -> list[str]: + return super().check_csv_item_count(constants.CSV_NEW_COL_COUNT) + + def check_data_exists(self) -> list[str]: + error_list = [] + if super().emp_chg_inst_count(self.start_date) > 0: + error_list.append([self.line_num, '', constants.CSV_UP_NEW_DATA_DUP_ERR, '']) + + return error_list + + def check_existing_date(self) -> list[str]: + return [] + + +class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): + """施設担当者変更登録CSV""" + bu_cd: str # a + bu_name: str # b + org_cd: str # c + org_short_name: str # d + # inst_cd: str # e + inst_name: str # f + # ta_cd: str # g + explain: str # h + # emp_cd: str # i + emp_full_name: str # j + inst_emp_start_date: str # k + inst_emp_end_date: str # l + change_end_date: str # m + comment: str # n + + def __init__( + self, + csv_row: list[str], + select_table: str, + line_num: str, + inst_cd_repository: MenteExistInstCdRepository, + emp_cd_repository: MenteExistEmpCdRepository, + bu_cd_repository: MenteExistBuCdRepository, + dummy_data_repository: MenteExistDummyDataRepository, + real_data_repository: MenteExistRealDataRepository, + emp_chg_inst_repository: MenteExistEmpChgInstRepository + ): + super().__init__( + csv_row, + select_table, + line_num, + inst_cd_repository, + emp_cd_repository, + bu_cd_repository, + dummy_data_repository, + real_data_repository, + emp_chg_inst_repository + ) + + self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] + self.bu_name = self.csv_row[constants.CSV_CHANGE_BU_NAME_COL_NO] + self.org_cd = self.csv_row[constants.CSV_CHANGE_ORG_CD_COL_NO] + self.org_short_name = self.csv_row[constants.CSV_CHANGE_ORG_SHORT_NAME_COL_NO] + self.inst_cd = self.csv_row[constants.CSV_CHANGE_INST_CD_COL_NO] + self.inst_name = self.csv_row[constants.CSV_CHANGE_INST_NAME_COL_NO] + self.ta_cd = self.csv_row[constants.CSV_CHANGE_TA_CD_COL_NO] + self.explain = self.csv_row[constants.CSV_CHANGE_EXPLAIN_COL_NO] + self.emp_cd = self.csv_row[constants.CSV_CHANGE_EMP_CD_COL_NO] + self.emp_full_name = self.csv_row[constants.CSV_CHANGE_EMP_FULL_NAME_COL_NO] + self.inst_emp_start_date = self.csv_row[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO] + self.inst_emp_end_date = self.csv_row[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] + self.change_end_date = self.csv_row[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] + self.comment = self.csv_row[constants.CSV_CHANGE_COMMENT] + + def csv_row_data(self) -> dict: + return {constants.CHANGE_INST_EMP_MAP[i]: self.csv_row[i] for i in range(len(self.csv_row))} + + def check_require(self) -> list[str]: + error_list = [] + if self.comment == '追加': + if len(self.bu_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + if len(self.inst_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + if len(self.ta_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + if len(self.emp_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], + constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + if len(self.inst_emp_start_date) == 0: + error_list.append([self.line_num, constants. + CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.inst_emp_end_date) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + elif self.comment == '終了': + if len(self.inst_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.ta_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.inst_emp_start_date) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ + constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.change_end_date) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + elif self.comment == '担当者修正': + if len(self.inst_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.ta_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.emp_cd) == 0: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + if len(self.inst_emp_start_date) == 0: + error_list.append([self.line_num, constants. + CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + constants.CSV_UP_NULL_ERR, + 'が入力されておりません。']) + else: + error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_COMMENT], + constants.CSV_UP_COMMENT_ERR, + 'のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。']) + + return error_list + + def check_emp_cd_exists(self) -> list[str]: + error_list = [] + + if self.comment != '追加' and self.comment != '担当者修正': + return error_list + + if super().is_error_emp_cd(self.inst_emp_start_date) is True: + error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], + constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + return error_list + + def check_item_count(self) -> list[str]: + return super().check_csv_item_count(constants.CSV_CHANGE_COL_COUNT) + + def check_data_exists(self) -> list[str]: + error_list = [] + emp_chg_inst_count = super().emp_chg_inst_count(self.inst_emp_start_date) + if self.comment == '追加' and emp_chg_inst_count > 0: + error_list.append([self.line_num, '', constants.CSV_UP_ADD_DATA_DUP_ERR, '']) + elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: + error_list.append([self.line_num, '', constants.CSV_UP_UPDATE_DATA_DUP_ERR, '']) + + return error_list + + def check_existing_date(self) -> list[str]: + return [] + + +class MasterMainteCSVItems: + """施設担当者CSVをループで回すためのもの""" + lines: list[MasterMainteCSVItem] + __i: int = 0 + header: list[str] + + def reset(self): + self.__i = 0 + + def __iter__(self): + return self + + def __next__(self) -> MasterMainteCSVItem: + if self.__i == len(self.lines): + raise StopIteration() + line = self.lines[self.__i] + self.__i += 1 + return line + + def __init__( + self, + file: TextIOWrapper, + csv_upload_form: MasterMainteCsvUpModel, + inst_cd_repository: MenteExistInstCdRepository, + emp_cd_repository: MenteExistEmpCdRepository, + bu_cd_repository: MenteExistBuCdRepository, + dummy_data_repository: MenteExistDummyDataRepository, + real_data_repository: MenteExistRealDataRepository, + emp_chg_inst_repository: MenteExistEmpChgInstRepository + ) -> None: + # self.header = file.readline().strip('\n').replace('"', '').split(',') + # reader = csv.DictReader(file, fieldnames=self.header) + reader = csv.reader(file) + csv_rows = [] + if csv_upload_form.select_function == 'new': + for line_num, row in enumerate(reader, start=0): + if line_num == 0: + continue + csv_rows.append(MasterMainteNewInstEmpCSVItem( + row, + csv_upload_form.select_table, + str(line_num), + inst_cd_repository, + emp_cd_repository, + bu_cd_repository, + dummy_data_repository, + real_data_repository, + emp_chg_inst_repository) + ) + elif csv_upload_form.select_function == 'change': + for line_num, row in enumerate(reader, start=0): + if line_num == 0: + continue + csv_rows.append(MasterMainteChangeInstEmpCSVItem( + row, + csv_upload_form.select_table, + str(line_num), + inst_cd_repository, + emp_cd_repository, + bu_cd_repository, + dummy_data_repository, + real_data_repository, + emp_chg_inst_repository) + ) + self.lines = csv_rows diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py b/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py new file mode 100644 index 00000000..d709487f --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py @@ -0,0 +1,161 @@ +from abc import ABCMeta, abstractmethod +from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository + +from src.system_var import constants + + +class MasterMainteInsertEmpChg(metaclass=ABCMeta): + insert_data: list[dict] + table_name: str + select_table_message: str + user_name: str + emp_chg_inst_repository: MenteWriteEmpChgInstRepository + + def __init__( + self, + insert_data, + table_name: str, + select_table_message: str, + user_name: str, + emp_chg_inst_repository: MenteWriteEmpChgInstRepository + ): + self.insert_data = insert_data + self.table_name = table_name # ダミー or 本番 + self.select_table_message = select_table_message + self.user_name = user_name + self.emp_chg_inst_repository = emp_chg_inst_repository + + def insert_emp_chg_inst(self): + error_list = [] + try: + self.emp_chg_inst_repository.connect() + self.emp_chg_inst_repository.begin() + (result_message, error_list) = self.write_emp_chg_inst_table() + if len(error_list) > 0: + self.emp_chg_inst_repository.rollback() + else: + self.emp_chg_inst_repository.commit() + except Exception: + self.emp_chg_inst_repository.rollback() #  一つでもエラーが発生したら終了するようにする場合はここで + + finally: + self.emp_chg_inst_repository.disconnect() + + return (result_message, error_list) + + def insert_emp_chg_inst_table(self, data, start_date, end_date): + self.emp_chg_inst_repository.insert_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['MUID'], + data['ビジネスユニットコード'], + start_date, + end_date, + self.user_name, + self.user_name, + self.table_name) + + @abstractmethod + def write_emp_chg_inst_table(self): + pass + + +class MasterMainteNewInsertEmpChg(MasterMainteInsertEmpChg): + + def __init__( + self, + insert_data_list: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chg_inst_repository: MenteWriteEmpChgInstRepository + ): + super().__init__( + insert_data_list, + table_name, + select_table_message, + user_name, + emp_chg_inst_repository + ) + + def write_emp_chg_inst_table(self): + error_list = [] + + add_count = 0 + for row_no, data in enumerate(self.insert_data, start=1): + try: + self.insert_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) + add_count += 1 + except Exception: + error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? + + result_message_list = [] + result_message_list.append('新規施設登録を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + return (result_message_list, error_list) + + +class MasterMainteChangeInsertEmpChg(MasterMainteInsertEmpChg): + + def __init__( + self, + insert_data: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chg_inst_repository: MenteWriteEmpChgInstRepository + + ): + super().__init__( + insert_data, + table_name, + select_table_message, + user_name, + emp_chg_inst_repository + ) + + def write_emp_chg_inst_table(self): + add_count = 0 + end_count = 0 + modify_count = 0 + error_list = [] # 例外が発生する仕組みなのでどうするか? + for row_no, data in enumerate(self.insert_data, start=1): + try: + if data['コメント'] == '追加': + self.insert_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) + add_count += 1 + elif data['コメント'] == '終了': + self.__end_emp_chg_inst(data) + end_count += 1 + elif data['コメント'] == '担当者修正': + self.__modify_end_emp_chg_inst(data) + modify_count += 1 + except Exception: + error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? + + result_message_list = [] + result_message_list.append('施設担当者変更を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + result_message_list.append('修正:' + str(modify_count) + '件') + result_message_list.append('終了:' + str(end_count) + '件') + return (result_message_list, error_list) + + def __end_emp_chg_inst(self, data: dict): + self.emp_chg_inst_repository.end_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['終了日の変更'], + self.user_name, + self.table_name) + + def __modify_end_emp_chg_inst(self, data: dict): + self.emp_chg_inst_repository.modify_end_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['MUID'], + self.user_name, + self.table_name) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py new file mode 100644 index 00000000..55f5a470 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py @@ -0,0 +1,31 @@ +from typing import Optional, Annotated + +from fastapi import Form + +from src.util.sanitize import sanitize +from fastapi import File, UploadFile + +from src.model.request.request_base_model import RequestBaseModel + + +@sanitize +class MasterMainteCsvUpModel(RequestBaseModel): + csv_file: Optional[Annotated[UploadFile, File()]] + select_function: Optional[str] + select_table: Optional[str] + json_upload_data: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_csv_file: UploadFile = Form(None), + ctrl_select_function: Optional[str] = Form(None), + ctrl_select_table: Optional[str] = Form(None), + ctrl_json_upload_data: Optional[str] = Form(None), + ): + return cls( + csv_file=ctrl_csv_file, + select_function=ctrl_select_function, + select_table=ctrl_select_table, + json_upload_data=ctrl_json_upload_data + ) diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py index 64bde407..9d29f508 100644 --- 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 @@ -1,5 +1,62 @@ +from typing import Optional + from pydantic import BaseModel +from src.model.view.mainte_csv_upload_model import CsvUploadModel +from src.model.view.mainte_csv_error_model import CsvErrorModel +from src.system_var import constants class InstEmpCsvUploadViewModel(BaseModel): subtitle: str = '施設担当者データCSVアップロード' + is_verified: Optional[bool] + is_insert: Optional[bool] + error_list: Optional[list[CsvErrorModel]] + select_function: Optional[str] + select_table: Optional[str] + csv_file_name: Optional[str] + csv_upload_list: Optional[list[CsvUploadModel]] + json_upload_data: Optional[str] + result_message_list: Optional[list[str]] + dialog_msg: Optional[str] + + def select_function_message(self): + return self.__new_inst_emp() if self.select_function == 'new' else self.__change_inst_emp() + + def select_table_message(self): + return self.__dummy_table() if self.select_table == 'dummy' else self.__real_table() + + def upload_data_columns(self) -> list[str]: + return self.__inst_emp_columns() + + def is_select_function_empty(self): + return self.select_function is None or len(self.select_function) == 0 + + def is_select_table_empty(self): + return self.select_table is None or len(self.select_table) == 0 + + def is_error_list_empty(self): + return self.error_list is None or len(self.error_list) == 0 + + def csv_data_count(self): + return 0 if self.csv_upload_list is None else len(self.csv_upload_list) + + def __inst_emp_columns(self) -> list[str]: + if self.select_function == 'new': + return constants.NEW_INST_EMP_CSV_MAP + if self.select_function == 'change': + return constants.CHANGE_INST_EMP_MAP + return [] + + # 定数にした方が良さそう + + def __real_table(self): + return '本番テーブル' + + def __dummy_table(self): + return 'ダミーテーブル' + + def __new_inst_emp(self): + return '新規施設登録' + + def __change_inst_emp(self): + return '施設担当者変更' diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py new file mode 100644 index 00000000..4fb4e241 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py @@ -0,0 +1,30 @@ +from pydantic import BaseModel +from typing import Optional +from src.system_var import constants + + +class CsvErrorModel(BaseModel): + row_no: Optional[str] + item_name: Optional[str] + message: Optional[str] + error_code: Optional[str] + + def __init__(self, row_no: str, item_name: str, error_code: str, message: str) -> None: + super().__init__(row_no=row_no, item_name=item_name, + error_code=error_code, message=message) + + # 確認のため途中まで実装 エラーコードが無いと、メッセージの編集が適切にできない場合あり + + def error_message(self): + error_message: str = '' + if self.error_code == constants.CSV_UP_NULL_ERR: + error_message = self.row_no + '行目の' + self.item_name + 'が入力されておりません。' + elif self.error_code == constants.CSV_UP_NOT_EXIST_INST_CD_ERR: + error_message = self.row_no + '行目の施設コードは施設マスタに存在しないコードです。' + elif self.error_code == constants.CSV_UP_NOT_EXIST_EMP_CD_ERR: + error_message = self.row_no + '行目のMUIDは従業員マスタに存在しない もしくは 適用期間外のIDです。' + elif self.error_code == constants.CSV_UP_NOT_EXIST_BU_CD_ERR: + error_message = self.row_no + '行目のビジネスユニットコードはビジネスユニットマスタに存在しないコードです。' + elif self.error_code == constants.CSV_UP_SQL_ERR: + error_message = self.row_no + '行目がSQL実行エラーです。Excelファイルを確認してください。' + return error_message diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py new file mode 100644 index 00000000..2c227470 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel +from typing import Optional + + +class CsvUploadModel(BaseModel): + subtitle: str = '施設担当者データCSVアップロード' + csv_row: Optional[dict] diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py new file mode 100644 index 00000000..2305f884 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py @@ -0,0 +1,29 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistBuCdRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.bu + WHERE + bu.bu_cd = :bu_cd + """ + + def fetch_count(self, bu_cd) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'bu_cd': bu_cd}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py new file mode 100644 index 00000000..bb892aa2 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py @@ -0,0 +1,34 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistDummyDataRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.emp_chg_inst_wrk + WHERE + inst_cd = :instCd + AND ta_cd = :taCd + AND start_date = :startDate + """ + + def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, + {'instCd': inst_cd, + 'taCd': ta_cd, + 'startDate': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py new file mode 100644 index 00000000..d7619719 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py @@ -0,0 +1,32 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistEmpCdRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.emp + WHERE + emp.EMP_CD = :emp_cd + AND str_to_date(emp.start_date, '%Y%m%d') <= str_to_date(:start_date1, '%Y%m%d') + AND str_to_date(:start_date2 ,'%Y%m%d') <= str_to_date(emp.END_DATE ,'%Y%m%d') + """ + + def fetch_count(self, emp_cd, start_date1, start_date2) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'emp_cd': emp_cd, 'start_date1': start_date1, + 'start_date2': start_date2}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py new file mode 100644 index 00000000..4c321de7 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py @@ -0,0 +1,32 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistEmpChgInstRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + {table_name} + WHERE + inst_cd = :inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + + def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL.format(table_name=table_name) + result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'start_date': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py new file mode 100644 index 00000000..e360e494 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py @@ -0,0 +1,29 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistInstCdRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.mst_inst + WHERE + mst_inst.inst_cd = :instcd + """ + + def fetch_count(self, instcd) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, {'instcd': instcd}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py new file mode 100644 index 00000000..bf74305c --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py @@ -0,0 +1,34 @@ +from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel + + +class MenteExistRealDataRepository(BaseRepository): + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + src05.emp_chg_inst + WHERE + inst_cd = :instCd + AND ta_cd = :taCd + AND start_date = :startDate + """ + + def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL + result = self._database.execute_select(query, + {'instCd': inst_cd, + 'taCd': ta_cd, + 'startDate': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py new file mode 100644 index 00000000..4a2856ec --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py @@ -0,0 +1,124 @@ +from src.repositories.base_repository import BaseRepository + + +class MenteWriteEmpChgInstRepository(BaseRepository): + + def connect(self): + self._database.connect() + + def begin(self): + self._database.begin() + + def commit(self): + self._database.commit() + + def rollback(self): + self._database.rollback() + + def disconnect(self): + self._database.disconnect() + + INSERT_SQL = """\ + INSERT INTO {table_name} + ( + inst_cd, + ta_cd, + emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date + ) + VALUES ( + :inst_cd, + :ta_cd, + :emp_cd, + :bu_cd, + :start_date, + :end_date, + '1', + 'Y', + :create_user_name, + NOW(), + :update_user_name, + NOW() + ) + """ + + def insert_emp_chg_inst(self, inst_cd, ta_cd, emp_cd, bu_cd, start_date, + end_date, create_user_name, update_user_name, table_name): + try: + query = self.INSERT_SQL.format(table_name=table_name) + self._database.execute(query, { + 'inst_cd': inst_cd, + 'ta_cd': ta_cd, + 'emp_cd': emp_cd, + 'bu_cd': bu_cd, + 'start_date': start_date, + 'end_date': end_date, + 'create_user_name': create_user_name, + 'update_user_name': update_user_name + }) + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + + UPDATE_SQL = """\ + UPDATE + {table_name} + SET + end_date = :end_date, + updater = :update_user_name, + update_date = NOW() + WHERE + inst_cd = :inst_cd + and ta_cd = :ta_cd + and start_date = :start_date + """ + + def end_emp_chg_inst(self, inst_cd, ta_cd, start_date, + end_date, update_user_name, table_name): + try: + query = self.UPDATE_SQL.format(table_name=table_name) + self._database.execute(query, { + 'inst_cd': inst_cd, + 'ta_cd': ta_cd, + 'start_date': start_date, + 'end_date': end_date, + 'update_user_name': update_user_name + }) + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + + UPDATE_SQL = """\ + UPDATE + {table_name} + SET + emp_cd = :emp_cd, + updater = :update_user_name, + update_date = now() + where + inst_cd = :inst_cd + and ta_cd = :ta_cd + and start_date = :start_date + """ + + def modify_end_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): + try: + query = self.UPDATE_SQL.format(table_name=table_name) + self._database.execute(query, { + 'inst_cd': inst_cd, + 'ta_cd': ta_cd, + 'start_date': start_date, + 'emp_cd': emp_cd, + 'update_user_name': update_user_name + }) + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py new file mode 100644 index 00000000..f68cba6b --- /dev/null +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -0,0 +1,142 @@ +import json +import html +from io import TextIOWrapper +from src.aws.aws_api_client import AWSAPIClient +from src.repositories.base_repository import BaseRepository +from src.services.base_service import BaseService +from src.model.internal.master_mainte_csv import MasterMainteCSVItems +from src.model.internal.master_mainte_insert_emp_chg import MasterMainteChangeInsertEmpChg +from src.model.internal.master_mainte_insert_emp_chg import MasterMainteNewInsertEmpChg +from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.logging.get_logger import get_logger +from src.model.view.mainte_csv_upload_model import CsvUploadModel +from src.model.view.mainte_csv_error_model import CsvErrorModel +from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository +from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository +from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository +from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository +from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository +from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository +from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository + +logger = get_logger('マスターメンテ') + + +class MasterMainteService(BaseService): + REPOSITORIES = { + 'inst_cd_repository': MenteExistInstCdRepository, + 'emp_cd_repository': MenteExistEmpCdRepository, + 'bu_cd_repository': MenteExistBuCdRepository, + 'dummy_data_repository': MenteExistDummyDataRepository, + 'real_data_repository': MenteExistRealDataRepository, + 'emp_chg_inst_repository': MenteExistEmpChgInstRepository, + 'write_emp_chg_inst_repository': MenteWriteEmpChgInstRepository + } + + inst_cd_repository: MenteExistInstCdRepository + emp_cd_repository: MenteExistEmpCdRepository + bu_cd_repository: MenteExistBuCdRepository + dummy_data_repository: MenteExistDummyDataRepository + real_data_repository: MenteExistRealDataRepository + emp_chg_inst_repository: MenteExistEmpChgInstRepository + write_emp_chg_inst_repository: MenteWriteEmpChgInstRepository + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.inst_cd_repository = repositories['inst_cd_repository'] + self.emp_cd_repository = repositories['emp_cd_repository'] + self.bu_cd_repository = repositories['bu_cd_repository'] + self.dummy_data_repository = repositories['dummy_data_repository'] + self.real_data_repository = repositories['real_data_repository'] + self.emp_chg_inst_repository = repositories['emp_chg_inst_repository'] + self.write_emp_chg_inst_repository = repositories['write_emp_chg_inst_repository'] + + def prepare_mainte_csv_up_view(self, + file: TextIOWrapper, + csv_file_name: str, + csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + + csv_items = MasterMainteCSVItems( + file, + csv_upload_form, + self.inst_cd_repository, + self.emp_cd_repository, + self.bu_cd_repository, + self.dummy_data_repository, + self.real_data_repository, + self.emp_chg_inst_repository + ) + + error_list = [] + for row_item in csv_items: + error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in row_item.validate()]) # 微妙 + + csv_items.reset() + csv_upload_list = [] + json_upload_data = '' + if len(error_list) == 0: + csv_upload_list: list[CsvUploadModel] = [CsvUploadModel( + csv_row=row_item.csv_row_data()) for row_item in csv_items] + + # json作成 + json_upload_data = json.dumps([model.csv_row for model in csv_upload_list], ensure_ascii=False) + + mainte_csv_up = InstEmpCsvUploadViewModel( + is_verified=True, + error_list=error_list, + select_function=csv_upload_form.select_function, + select_table=csv_upload_form.select_table, + csv_upload_list=csv_upload_list, + json_upload_data=json_upload_data, + csv_file_name=csv_file_name + ) + return mainte_csv_up + + def prepare_mainte_new_inst_view(self, + user_name: str, + csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + + if csv_upload_form.select_table == 'dummy': + table_name = 'src05.emp_chg_inst_wrk' + selected_table_msg = 'ダミーテーブル' + elif csv_upload_form.select_table == 'real': + table_name = 'src05.emp_chg_inst' + selected_table_msg = '本番テーブル' + # else: + # 例外? + + csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) + + if csv_upload_form.select_function == 'new': + insert_emp_chg = MasterMainteNewInsertEmpChg( + csv_data_list, + table_name, + selected_table_msg, + user_name, + self.write_emp_chg_inst_repository) + elif csv_upload_form.select_function == 'change': + insert_emp_chg = MasterMainteChangeInsertEmpChg( + csv_data_list, + table_name, + selected_table_msg, + user_name, + self.write_emp_chg_inst_repository + ) + # else: + # 例外を発生させる? + + (result_message_list, raw_error_list) = insert_emp_chg.insert_emp_chg_inst() + + error_list = [] + error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in raw_error_list]) + + if result_message_list is None: + result_message_list.append('DB接続エラー') + + mainte_csv_up = InstEmpCsvUploadViewModel( + is_insert=True, + result_message_list=result_message_list, + error_list=error_list + ) + return mainte_csv_up diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 36171aad..bd39eafd 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -250,4 +250,69 @@ function checkNumberOnlyForm($this) str=str.replace(/[^\d]/,""); } $this.value=str; -} \ No newline at end of file +} + +// メニューへボタンの関数 +// 機能概要:マスターメンテメニュー画面に遷移する +function backToMainteMenu(){ + location.href = "/masterMainte/masterMainteMenu.php"; +} + +// クリアボタンの関数 +// 利用条件1:form名がsearch +// 引数にはクリアしたいinputの数 +// 上から順番にクリアされる +function clrMainte(elementNum){ + for (var i = 1; i <= elementNum; i++) { + // document.form名[要素名].value="いれたい値"; + var elementsName = "textbox_" + i; + document.search[elementsName].value = ""; + } + // ボタンの非活性化 + formBtDisabled(elementNum); +} + +// 確認ダイアログ +function confirmDialog(strMesssage) { + var result = confirm(strMesssage); + return result; +} + +// 検索ボタンの活性非活性関数 +// 利用条件1:form名がsearch +// 利用条件2:textbox名がtextbox_数字(1から連番) +// 引数にはテキストボックスの数 +function formBtDisabled(elementNum){ + var validFlg = false; + for (var i = 1; i <= elementNum; i++) { + var elementsName = "textbox_" + i; + if(document.search[elementsName].value.length > 0){ + validFlg = true; + break; + } + } + + if (validFlg == true) { + $('#csvDL').removeAttr('disabled'); + $('#clear').removeAttr('disabled'); + } + else { + $('#csvDL').attr('disabled', 'disabled'); + $('#clear').attr('disabled', 'disabled'); + } +} + +function formInsertBtDisabled(){ + var validFlg = false; + if(document.getElementById("excelFile").value === ""){ + validFlg = true; + } + + if (validFlg == true) { + document.getElementById("confirm").disabled = true; + } + else { + document.getElementById("confirm").disabled = false; + } +} + diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 604acfe5..0e0a8b0a 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -134,3 +134,110 @@ LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。', LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。' } + +NEW_INST_EMP_CSV_MAP = [ + '施設コード', + '施設名', + '領域コード', + 'MUID', + '担当者名(姓)', + '担当者名(名)', + 'ビジネスユニットコード', + '適用開始日', + '適用終了日' +] + +CHANGE_INST_EMP_MAP = [ + 'ビジネスユニットコード', # A + 'ビジネスユニット名', # B + '組織コード', # C + '組織名略称', # D + '施設コード', # E + '施設名', # F + '領域コード', # G + '説明', # H + 'MUID', # I + '担当者名', # J + '施設担当_開始日', # K + '施設担当_終了日', # L + '終了日の変更', # M + 'コメント' # N +] + +# 新規施設担当者登録CSV +# 施設コードの列No +CSV_NEW_INST_CD_COL_NO = 0 +# 施設名の列No +CSV_NEW_INST_NAME_COL_NO = 1 +# 領域コードの列No +CSV_NEW_TA_CD_COL_NO = 2 +# MUIDの列No +CSV_NEW_EMP_CD_COL_NO = 3 +# 担当者名(姓)の列No +CSV_NEW_EMP_NAME_FAMILY_COL_NO = 4 +# 担当者名(名)の列No +CSV_NEW_EMP_NAME_FIRST_COL_NO = 5 +# ビジネスユニットコードの列No +CSV_NEW_BU_CD_COL_NO = 6 +# 適用開始日の列No +CSV_NEW_START_DATE = 7 +# 適用終了日の列No +CSV_NEW_END_DATE = 8 + +# 施設担当者変更登録CSV +# ビジネスユニットコードの列No +CSV_CHANGE_BU_CD_COL_NO = 0 +# ビジネスユニット名の列No +CSV_CHANGE_BU_NAME_COL_NO = 1 +# 組織コードの列No +CSV_CHANGE_ORG_CD_COL_NO = 2 +# 組織名略称の列No +CSV_CHANGE_ORG_SHORT_NAME_COL_NO = 3 +# 施設コードの列No +CSV_CHANGE_INST_CD_COL_NO = 4 +# 施設名の列No +CSV_CHANGE_INST_NAME_COL_NO = 5 +# 領域コードの列No +CSV_CHANGE_TA_CD_COL_NO = 6 +# 説明の列No +CSV_CHANGE_EXPLAIN_COL_NO = 7 +# MUIDの列No +CSV_CHANGE_EMP_CD_COL_NO = 8 +# 担当者名の列No +CSV_CHANGE_EMP_FULL_NAME_COL_NO = 9 +# 施設担当_開始日の列No +CSV_CHANGE_INST_EMP_START_DATE_COL_NO = 10 +# 施設担当_終了日の列No +CSV_CHANGE_INST_EMP_END_DATE_COL_NO = 11 +# 終了日の変更の列No +CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 +# コメントの列No +CSV_CHANGE_COMMENT = 13 + + +# エラーコード +CSV_UP_NULL_ERR = 'nullError' +CSV_UP_COMMENT_ERR = 'commentError' +CSV_UP_NOT_EXIST_INST_CD_ERR = 'instCdErr' +CSV_UP_NOT_EXIST_EMP_CD_ERR = 'empCdErr' +CSV_UP_NOT_EXIST_BU_CD_ERR = 'buCdErr' +CSV_UP_ITEM_CNT_ERR = 'itemCntErr' +CSV_UP_FILE_TYPE_ERR = 'fileTypeErr' +CSV_UP_FILEN_EXIST_ERR = 'filenExistErr' +CSV_UP_SQL_ERR = 'sqlErr' +CSV_UP_NEW_COMPARE_DATE_ERR = 'newCompareDateErr' +CSV_UP_ADD_COMPARE_DATE_ERR = 'addCompareDateErr' +CSV_UP_END_COMPARE_DATE_ERR = 'endCompareDateErr' +CSV_UP_START_DATE_REAL_ERR = 'startDateRealErr' +CSV_UP_END_DATE_REAL_ERR = 'endDateRealErr' +CSV_UP_INST_EMPSTART_DATE_REAL_ERR = 'instEmpStartDateRealErr' +CSV_UP_INST_EMP_END_DATE_REAL_ERR = 'instEmpEndDateRealErr' +CSV_UP_CHANGE_END_DATE_REAL_ERR = 'changeEndDateRealErr' +CSV_UP_NEW_DATA_DUP_ERR = 'newDataDupErr' +CSV_UP_ADD_DATA_DUP_ERR = 'addDataDupErr' +CSV_UP_UPDATE_DATA_DUP_ERR = 'updateDataDupErr' +CSV_UP_INPUT_DATA_ZERO_ERR = 'inputDataZeroErr' + +# CSVの列数 +CSV_NEW_COL_COUNT = 9 +CSV_CHANGE_COL_COUNT = 14 diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 7e84fd4c..1209f8e2 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -1,12 +1,177 @@ - {% with subtitle = view.subtitle %} + {% with subtitle = mainte_csv_dl.subtitle %} {% include '_header.html' %} {% endwith %} + <!-- <?php echo $instEmpCsvDL ?> --> + + + + + +

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

+ +

+ + + + + +
+

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + ~ + + + + ~ + +
+ + + + + ~ + + + + ~ + +
+ + +
+
+

+ +

+

+ + + + diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 9ec84207..2c318134 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -1,13 +1,332 @@ - {% with subtitle = view.subtitle %} + {% with subtitle = mainte_csv_up.subtitle %} {% include '_header.html' %} {% endwith %} + + + + {% if not mainte_csv_up.is_verified %} + + {% endif %} -

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

+ +

+ + + + + +
施設担当者データCSVアップロード + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} + + {% else %} + + {% endif %} +
+

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

+ +

+ {% if not mainte_csv_up.is_error_list_empty() %} +
+ {% for error in mainte_csv_up.error_list %} + {{error.error_message()}}
+ {% endfor %} +
+ {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} +
+
件数:{{mainte_csv_up.csv_data_count()}}件
+ + + + + {% for column_name in mainte_csv_up.upload_data_columns() %} + + {% endfor %} + + {% for item in mainte_csv_up.csv_upload_list %} + + {% for key, value in item.csv_row.items() %} + + {% endfor %} + + {% endfor %} + +
{{column_name}}
{{value}}
+
+ {% elif mainte_csv_up.is_insert %} +
+ {% for message in mainte_csv_up.result_message_list %} + {{ message }}
+ {% endfor %} +
+ {% endif %} + + + + + +

diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index e473b469..2d6c624f 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -5,8 +5,68 @@ {% include '_header.html' %} {% endwith %} + <!-- <?php echo $tableOverride; ?> --> +

テーブル上書きコピー

+ + +

+ + + + + +
+

+ + + + + + + + + +
+ +
+ +
+ + + + + + From 8caa5ab14d35af49cc900968251bbff6920e400e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 10 Jul 2023 11:54:06 +0900 Subject: [PATCH 455/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/.dockerignore | 12 + ecs/jskult-dbdump/.env.example | 16 ++ ecs/jskult-dbdump/.gitignore | 10 + ecs/jskult-dbdump/.vscode/launch.json | 17 ++ .../.vscode/recommended_settings.json | 31 +++ ecs/jskult-dbdump/Dockerfile | 28 +++ ecs/jskult-dbdump/Pipfile | 19 ++ ecs/jskult-dbdump/Pipfile.lock | 206 ++++++++++++++++++ ecs/jskult-dbdump/README.md | 48 ++++ .../backup_rds_src05_20230710091352.gz | 0 ecs/jskult-dbdump/entrypoint.py | 10 + ecs/jskult-dbdump/my.cnf | 4 + ecs/jskult-dbdump/src/__init__.py | 0 .../src/batch/batch_functions.py | 118 ++++++++++ .../src/batch/common/__init__.py | 0 .../src/batch/common/batch_context.py | 29 +++ ecs/jskult-dbdump/src/db/__init__.py | 0 ecs/jskult-dbdump/src/db/database.py | 178 +++++++++++++++ ecs/jskult-dbdump/src/error/__init__.py | 0 ecs/jskult-dbdump/src/error/exceptions.py | 10 + ecs/jskult-dbdump/src/jobctrl_dbdump.py | 109 +++++++++ ecs/jskult-dbdump/src/logging/get_logger.py | 37 ++++ ecs/jskult-dbdump/src/system_var/__init__.py | 0 ecs/jskult-dbdump/src/system_var/constants.py | 15 ++ .../src/system_var/environment.py | 21 ++ 25 files changed, 918 insertions(+) create mode 100644 ecs/jskult-dbdump/.dockerignore create mode 100644 ecs/jskult-dbdump/.env.example create mode 100644 ecs/jskult-dbdump/.gitignore create mode 100644 ecs/jskult-dbdump/.vscode/launch.json create mode 100644 ecs/jskult-dbdump/.vscode/recommended_settings.json create mode 100644 ecs/jskult-dbdump/Dockerfile create mode 100644 ecs/jskult-dbdump/Pipfile create mode 100644 ecs/jskult-dbdump/Pipfile.lock create mode 100644 ecs/jskult-dbdump/README.md create mode 100644 ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz create mode 100644 ecs/jskult-dbdump/entrypoint.py create mode 100644 ecs/jskult-dbdump/my.cnf create mode 100644 ecs/jskult-dbdump/src/__init__.py create mode 100644 ecs/jskult-dbdump/src/batch/batch_functions.py create mode 100644 ecs/jskult-dbdump/src/batch/common/__init__.py create mode 100644 ecs/jskult-dbdump/src/batch/common/batch_context.py create mode 100644 ecs/jskult-dbdump/src/db/__init__.py create mode 100644 ecs/jskult-dbdump/src/db/database.py create mode 100644 ecs/jskult-dbdump/src/error/__init__.py create mode 100644 ecs/jskult-dbdump/src/error/exceptions.py create mode 100644 ecs/jskult-dbdump/src/jobctrl_dbdump.py create mode 100644 ecs/jskult-dbdump/src/logging/get_logger.py create mode 100644 ecs/jskult-dbdump/src/system_var/__init__.py create mode 100644 ecs/jskult-dbdump/src/system_var/constants.py create mode 100644 ecs/jskult-dbdump/src/system_var/environment.py diff --git a/ecs/jskult-dbdump/.dockerignore b/ecs/jskult-dbdump/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-dbdump/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-dbdump/.env.example b/ecs/jskult-dbdump/.env.example new file mode 100644 index 00000000..b331b25e --- /dev/null +++ b/ecs/jskult-dbdump/.env.example @@ -0,0 +1,16 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult +JSKULT_CONFIG_BUCKET=mbj-newdwh2021-staging-config + +DUMP_BACKUP_FOLDER=dump + +LOG_LEVEL=INFO +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ diff --git a/ecs/jskult-dbdump/.gitignore b/ecs/jskult-dbdump/.gitignore new file mode 100644 index 00000000..bd0b37f8 --- /dev/null +++ b/ecs/jskult-dbdump/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-dbdump/.vscode/launch.json b/ecs/jskult-dbdump/.vscode/launch.json new file mode 100644 index 00000000..a0178c26 --- /dev/null +++ b/ecs/jskult-dbdump/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)jskult batch dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-dbdump/.vscode/recommended_settings.json b/ecs/jskult-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile new file mode 100644 index 00000000..f87a7215 --- /dev/null +++ b/ecs/jskult-dbdump/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# mysql-clientと必要なパッケージインストール +RUN apt install -y less vim curl unzip sudo default-mysql-client + +# aws cli v2 のインストール +RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" +RUN unzip awscliv2.zip +RUN sudo ./aws/install + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-dbdump/Pipfile b/ecs/jskult-dbdump/Pipfile new file mode 100644 index 00000000..65b30a51 --- /dev/null +++ b/ecs/jskult-dbdump/Pipfile @@ -0,0 +1,19 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-dbdump/Pipfile.lock b/ecs/jskult-dbdump/Pipfile.lock new file mode 100644 index 00000000..58713cc6 --- /dev/null +++ b/ecs/jskult-dbdump/Pipfile.lock @@ -0,0 +1,206 @@ +{ + "_meta": { + "hash": { + "sha256": "e2e2efd7ebd6ad719931983f277105dd94c4ebb6363f7c00e75dd8ca05523713" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "greenlet": { + "hashes": [ + "sha256:0a9dfcadc1d79696e90ccb1275c30ad4ec5fd3d1ab3ae6671286fac78ef33435", + "sha256:0f313771cb8ee0a04dfdf586b7d4076180d80c94be09049daeea018089b5b957", + "sha256:17503397bf6cbb5e364217143b6150c540020c51a3f6b08f9a20cd67c25e2ca8", + "sha256:180ec55cb127bc745669eddc9793ffab6e0cf7311e67e1592f183d6ca00d88c1", + "sha256:1b3f3568478bc21b85968e8038c4f98f4bf0039a692791bc324b5e0d1522f4b1", + "sha256:1bd4ea36f0aeb14ca335e0c9594a5aaefa1ac4e2db7d86ba38f0be96166b3102", + "sha256:21ebcb570e0d8501457d6a2695a44c5af3b6c2143dc6644ec73574beba067c90", + "sha256:24071eee113d75fedebaeb86264d94f04b5a24e311c5ba3e8003c07d00112a7e", + "sha256:270432cfdd6a50016b8259b3bbf398a3f7c06a06f2c68c7b93e49f53bc193bcf", + "sha256:271ed380389d2f7e4c1545b6e0837986e62504ab561edbaff05da9c9f3f98f96", + "sha256:2840187a94e258445e62ff1545e34f0b1a14aef4d0078e5c88246688d2b6515e", + "sha256:2cda110faee67613fed221f90467003f477088ef1cc84c8fc88537785a5b4de9", + "sha256:2e160a65cc6023a237be870f2072513747d512a1d018efa083acce0b673cccc0", + "sha256:2fcf7af83516db35af3d0ed5d182dea8585eddd891977adff1b74212f4bfd2fd", + "sha256:36cebce1f30964d5672fd956860e7e7b69772da69658d5743cb676b442eeff36", + "sha256:42bfe67824a9b53e73f568f982f0d1d4c7ac0f587d2e702a23f8a7b505d7b7c2", + "sha256:450a7e52a515402fd110ba807f1a7d464424bfa703be4effbcb97e1dfbfcc621", + "sha256:463d63ca5d8c236788284a9a44b9715372a64d5318a6b5eee36815df1ea0ba3d", + "sha256:4d0c0ffd732466ff324ced144fad55ed5deca36f6036c1d8f04cec69b084c9d6", + "sha256:4ff2a765f4861fc018827eab4df1992f7508d06c62de5d2fe8a6ac2233d4f1d0", + "sha256:53abf19b7dc62795c67b8d0a3d8ef866db166b21017632fff2624cf8fbf3481c", + "sha256:5552d7be37d878e9b6359bbffa0512d857bb9703616a4c0656b49c10739d5971", + "sha256:585810056a8adacd3152945ebfcd25deb58335d41f16ae4e0f3d768918957f9a", + "sha256:5942b1d6ba447cff1ec23a21ec525dde2288f00464950bc647f4e0f03bd537d1", + "sha256:5c355c99be5bb23e85d899b059a4f22fdf8a0741c57e7029425ee63eb436f689", + "sha256:5f61df4fe07864561f49b45c8bd4d2c42e3f03d2872ed05c844902a58b875028", + "sha256:665942d3a954c3e4c976581715f57fb3b86f4cf6bae3ac30b133f8ff777ac6c7", + "sha256:68368e908f14887fb202a81960bfbe3a02d97e6d3fa62b821556463084ffb131", + "sha256:6aac94ff957b5dea0216af71ab59c602e1b947b394e4f5e878a5a65643090038", + "sha256:889934aa8d72b6bfc46babd1dc4b817a56c97ec0f4a10ae7551fb60ab1f96fae", + "sha256:a00550757fca1b9cbc479f8eb1cf3514dbc0103b3f76eae46341c26ddcca67a9", + "sha256:a4a2d6ed0515c05afd5cc435361ced0baabd9ba4536ddfe8ad9a95bcb702c8ce", + "sha256:a8dd92fd76a61af2abc8ccad0c6c6069b3c4ebd4727ecc9a7c33aae37651c8c7", + "sha256:ab81f9ff3e3c2ca65e824454214c10985a846cd9bee5f4d04e15cd875d9fe13b", + "sha256:ac10196b8cde7a082e4e371ff171407270d3337c8d57ed43030094eb01d9c95c", + "sha256:b767930af686551dc96a5eb70af3736709d547ffa275c11a5e820bfb3ae61d8d", + "sha256:b9a1f4d256b81f59ba87bb7a29b9b38b1c018e052dba60a543cb0ddb5062d159", + "sha256:ba94c08321b5d345100fc64eb1ab235f42faf9aabba805cface55ebe677f1c2c", + "sha256:bab71f73001cd15723c4e2ca398f2f48e0a3f584c619eefddb1525e8986e06eb", + "sha256:bce5cf2b0f0b29680396c5c98ab39a011bd70f2dfa8b8a6811a69ee6d920cf9f", + "sha256:c02e514c72e745e49a3ae7e672a1018ba9b68460c21e0361054e956e5d595bc6", + "sha256:c3fb459ced6c5e3b2a895f23f1400f93e9b24d85c30fbe2d637d4f7706a1116b", + "sha256:cd31ab223e43ac64fd23f8f5dad249addadac2a459f040546200acbf7e84e353", + "sha256:ce70aa089ec589b5d5fab388af9f8c9f9dfe8fe4ad844820a92eb240d8628ddf", + "sha256:d47b2e1ad1429da9aa459ef189fbcd8a74ec28a16bc4c3f5f3cf3f88e36535eb", + "sha256:d61bad421c1f496f9fb6114dbd7c30a1dac0e9ff90e9be06f4472cbd8f7a1704", + "sha256:d7ba2e5cb119eddbc10874b41047ad99525e39e397f7aef500e6da0d6f46ab91", + "sha256:dde0ab052c7a1deee8d13d72c37f2afecee30ebdf6eb139790157eaddf04dd61", + "sha256:df34b52aa50a38d7a79f3abc9fda7e400791447aa0400ed895f275f6d8b0bb1f", + "sha256:e0fc20e6e6b298861035a5fc5dcf9fbaa0546318e8bda81112591861a7dcc28f", + "sha256:e20d5e8dc76b73db9280464d6e81bea05e51a99f4d4dd29c5f78dc79f294a5d3", + "sha256:e31d1a33dc9006b278f72cb0aacfe397606c2693aa2fdc0c2f2dcddbad9e0b53", + "sha256:e3a99f890f2cc5535e1b3a90049c6ca9ff9da9ec251cc130c8d269997f9d32ee", + "sha256:e7b192c3df761d0fdd17c2d42d41c28460f124f5922e8bd524018f1d35610682", + "sha256:ed0f4fad4c3656e34d20323a789b6a2d210a6bb82647d9c86dded372f55c58a1", + "sha256:f34ec09702be907727fd479046193725441aaaf7ed4636ca042734f469bb7451", + "sha256:f3530c0ec1fc98c43d5b7061781a8c55bd0db44f789f8152e19d9526cbed6021", + "sha256:f5672082576d0e9f52fa0fa732ff57254d65faeb4a471bc339fe54b58b3e79d2", + "sha256:ffb9f8969789771e95d3c982a36be81f0adfaa7302a1d56e29f168ca15e284b8" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.0a1" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:00aa050faf24ce5f2af643e2b86822fa1d7149649995f11bc1e769bbfbf9010b", + "sha256:09397a18733fa2a4c7680b746094f980060666ee549deafdb5e102a99ce4619b", + "sha256:0f7fdcce52cd882b559a57b484efc92e108efeeee89fab6b623aba1ac68aad2e", + "sha256:10514adc41fc8f5922728fbac13d401a1aefcf037f009e64ca3b92464e33bf0e", + "sha256:10e001a84f820fea2640e4500e12322b03afc31d8f4f6b813b44813b2a7c7e0d", + "sha256:194f2d5a7cb3739875c4d25b3fe288ab0b3dc33f7c857ba2845830c8c51170a0", + "sha256:1aac42a21a7fa6c9665392c840b295962992ddf40aecf0a88073bc5c76728117", + "sha256:1fb792051db66e09c200e7bc3bda3b1eb18a5b8eb153d2cedb2b14b56a68b8cb", + "sha256:2756485f49e7df5c2208bdc64263d19d23eba70666f14ad12d6d8278a2fff65f", + "sha256:2b791577c546b6bbd7b43953565fcb0a2fec63643ad605353dd48afbc3c48317", + "sha256:420bc6d06d4ae7fb6921524334689eebcbea7bf2005efef070a8562cc9527a37", + "sha256:45b07470571bda5ee7f5ec471271bbde97267cc8403fce05e280c36ea73f4754", + "sha256:4ebc542d2289c0b016d6945fd07a7e2e23f4abc41e731ac8ad18a9e0c2fd0ec2", + "sha256:556dc18e39b6edb76239acfd1c010e37395a54c7fde8c57481c15819a3ffb13e", + "sha256:589aba9a35869695b319ed76c6f673d896cd01a7ff78054be1596df7ad9b096f", + "sha256:5c95e3e7cc6285bf7ff263eabb0d3bfe3def9a1ff98124083d45e5ece72f4579", + "sha256:5dd574a37be388512c72fe0d7318cb8e31743a9b2699847a025e0c08c5bf579d", + "sha256:67fbb40db3985c0cfb942fe8853ad94a5e9702d2987dec03abadc2f3b6a24afb", + "sha256:6852cd34d96835e4c9091c1e6087325efb5b607b75fd9f7075616197d1c4688a", + "sha256:69ae0e9509c43474e33152abe1385b8954922544616426bf793481e1a37e094f", + "sha256:6c5bae4c288bda92a7550fe8de9e068c0a7cd56b1c5d888aae5b40f0e13b40bd", + "sha256:774bd401e7993452ba0596e741c0c4d6d22f882dd2a798993859181dbffadc62", + "sha256:79228a7b90d95957354f37b9d46f2cc8926262ae17b0d3ed8f36c892f2a37e06", + "sha256:7b8cba5a25e95041e3413d91f9e50616bcfaec95afa038ce7dc02efefe576745", + "sha256:7db97eabd440327c35b751d5ebf78a107f505586485159bcc87660da8bb1fdca", + "sha256:7ddd6d35c598af872f9a0a5bce7f7c4a1841684a72dab3302e3df7f17d1b5249", + "sha256:82edf3a6090554a83942cec79151d6b5eb96e63d143e80e4cf6671e5d772f6be", + "sha256:8b7b3ebfa9416c8eafaffa65216e229480c495e305a06ba176dcac32710744e6", + "sha256:8da677135eff43502b7afab5a1e641edfb2dc734ba7fc146e9b1b86817a728e2", + "sha256:908c850b98cac1e203ababd4ba76868d19ae0d7172cdc75d3f1b7829b16837d2", + "sha256:9da4ee8f711e077633730955c8f3cd2485c9abf5ea0f80aac23221a3224b9a8c", + "sha256:a6f1d8256d06f58e6ece150fbe05c63c7f9510df99ee8ac37423f5476a2cebb4", + "sha256:afb322ca05e2603deedbcd2e9910f11a3fd2f42bdeafe63018e5641945c7491c", + "sha256:b52c6741073de5a744d27329f9803938dcad5c9fee7e61690c705f72973f4175", + "sha256:ba633b51835036ff0f402c21f3ff567c565a22ff0a5732b060a68f4660e2a38f", + "sha256:bfa1a0f83bdf8061db8d17c2029454722043f1e4dd1b3d3d3120d1b54e75825a", + "sha256:bffd6cd47c2e68970039c0d3e355c9ed761d3ca727b204e63cd294cad0e3df90", + "sha256:d7a2c1e711ce59ac9d0bba780318bcd102d2958bb423209f24c6354d8c4da930", + "sha256:da46beef0ce882546d92b7b2e8deb9e04dbb8fec72945a8eb28b347ca46bc15a", + "sha256:ebdd2418ab4e2e26d572d9a1c03877f8514a9b7436729525aa571862507b3fea", + "sha256:fc44e50f9d5e96af1a561faa36863f9191f27364a4df3eb70bca66e9370480b6" + ], + "index": "pypi", + "version": "==2.0.18" + }, + "tenacity": { + "hashes": [ + "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", + "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" + ], + "index": "pypi", + "version": "==8.2.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + ], + "markers": "python_version >= '3.7'", + "version": "==4.7.1" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-dbdump/README.md b/ecs/jskult-dbdump/README.md new file mode 100644 index 00000000..f6e7c2da --- /dev/null +++ b/ecs/jskult-dbdump/README.md @@ -0,0 +1,48 @@ +# 実消化&アルトマーク 月次バッチ + +## 概要 + +実消化&アルトマークの月次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_monthly.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz b/ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/entrypoint.py b/ecs/jskult-dbdump/entrypoint.py new file mode 100644 index 00000000..9a13c457 --- /dev/null +++ b/ecs/jskult-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 月次バッチのエントリーポイント""" +from src import jobctrl_dbdump + +if __name__ == '__main__': + try: + exit(jobctrl_dbdump.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-dbdump/my.cnf b/ecs/jskult-dbdump/my.cnf new file mode 100644 index 00000000..8bdb2c20 --- /dev/null +++ b/ecs/jskult-dbdump/my.cnf @@ -0,0 +1,4 @@ +[client] +user=root +password=admin +host=localhost \ No newline at end of file diff --git a/ecs/jskult-dbdump/src/__init__.py b/ecs/jskult-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/batch/batch_functions.py b/ecs/jskult-dbdump/src/batch/batch_functions.py new file mode 100644 index 00000000..da329291 --- /dev/null +++ b/ecs/jskult-dbdump/src/batch/batch_functions.py @@ -0,0 +1,118 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants + + +def get_batch_statuses() -> tuple[str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - dump取得状況区分 + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + + return batch_processing_flag, dump_status_kbn + + +def update_dump_status_kbn_in_processing() -> None: + """dump取得状況区分を処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = 'UPDATE src05.hdke_tbl SET dump_sts_kbn = :in_processing' + try: + db.connect() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_in_error() -> None: + """dump取得状況区分をエラーに更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed + """ + try: + db.connect() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_ERROR + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_in_complete() -> None: + """dump取得状況区分を正常終了に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed + """ + try: + db.connect() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_COMPLETE + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-dbdump/src/batch/common/__init__.py b/ecs/jskult-dbdump/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/batch/common/batch_context.py b/ecs/jskult-dbdump/src/batch/common/batch_context.py new file mode 100644 index 00000000..8c8c12fb --- /dev/null +++ b/ecs/jskult-dbdump/src/batch/common/batch_context.py @@ -0,0 +1,29 @@ +class BatchContext: + __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) + __is_arisj_output_day: bool # 月次バッチ起動日フラグ + + def __init__(self) -> None: + self.__is_arisj_output_day = False + + @classmethod + def get_instance(cls): + if cls.__instance is None: + cls.__instance = cls() + return cls.__instance + + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + + @property + def is_arisj_output_day(self): + return self.__is_arisj_output_day + + @is_arisj_output_day.setter + def is_arisj_output_day(self, flag: bool): + self.__is_arisj_output_day = flag diff --git a/ecs/jskult-dbdump/src/db/__init__.py b/ecs/jskult-dbdump/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/db/database.py b/ecs/jskult-dbdump/src/db/database.py new file mode 100644 index 00000000..f67a21b9 --- /dev/null +++ b/ecs/jskult-dbdump/src/db/database.py @@ -0,0 +1,178 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment + +logger = get_logger(__name__) + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-dbdump/src/error/__init__.py b/ecs/jskult-dbdump/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/error/exceptions.py b/ecs/jskult-dbdump/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-dbdump/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py new file mode 100644 index 00000000..3ae7bdb6 --- /dev/null +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -0,0 +1,109 @@ +"""日次バッチ処理前DBダンプ取得""" + +import datetime +import textwrap +import subprocess +import os +from src.system_var import environment +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants +from src.batch.batch_functions import ( + get_batch_statuses, update_dump_status_kbn_in_processing, + update_dump_status_kbn_in_complete, update_dump_status_kbn_in_error) +import gzip + +logger = get_logger('日次バッチ処理前DBダンプ取得') + + +def exec(): + try: + logger.info('日次バッチ処理前DBダンプ取得:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分を取得 + batch_processing_flag, dump_status_kbn = get_batch_statuses() + except BatchOperationException as e: + logger.exception(f'日次ジョブ取得エラー(異常終了)\n{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 日次バッチ処理中の場合、処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('日次ジョブ処理中エラー(異常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分が処理中またはエラーの場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED or dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: + logger.error('dump処理状態区エラー(異常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分を処理中に更新 + try: + update_dump_status_kbn_in_processing() + except BatchOperationException as e: + logger.exception(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('.', 'my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + dt_now = datetime.datetime.now() + converted_value = dt_now.strftime('%Y%m%d%H%M%S') + file_name = f'backup_rds_src05_{converted_value}.gz' + s3_file_name = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{file_name}' + + mysqldump_cmd = [ + 'mysqldump', + '--user={mysql_user}'.format(mysql_user=environment.DB_USERNAME), + '--password={db_pw}'.format(db_pw=environment.DB_PASSWORD), + '--host={db_host}'.format(db_host=environment.DB_HOST), + '--port={db_port}'.format(db_port=environment.DB_PORT), + '{db_name}'.format(db_name=environment.DB_SCHEMA) + ] + + # mysqldumpコマンドを実行してデータを標準出力に出力 + mysqldump_output = subprocess.check_output(mysqldump_cmd) + + # gzipで圧縮 + compressed_data = gzip.compress(mysqldump_output) + + # AWS CLIを使ってS3にアップロード + aws_cli_cmd = [ + 'aws', + 's3', + 'cp', + '-', + s3_file_name + ] + subprocess.run(aws_cli_cmd, input=compressed_data) + + # dump処理状態区分を正常終了に更新 + try: + update_dump_status_kbn_in_complete() + except BatchOperationException as e: + logger.exception(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了)\n{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 正常終了を保守ユーザーに通知 + logger.info('[NOTICE]日次バッチ処理前DBダンプ取得:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + # dump処理状態区分をエラーに更新 + try: + update_dump_status_kbn_in_error() + except BatchOperationException as e: + logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了)\n{e}') + raise constants.BATCH_EXIT_CODE_SUCCESS + logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました \n{e}') + raise e diff --git a/ecs/jskult-dbdump/src/logging/get_logger.py b/ecs/jskult-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-dbdump/src/system_var/__init__.py b/ecs/jskult-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-dbdump/src/system_var/constants.py b/ecs/jskult-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..993e5a7d --- /dev/null +++ b/ecs/jskult-dbdump/src/system_var/constants.py @@ -0,0 +1,15 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:処理中 +DUMP_STATUS_KBN_PROCESSED = '1' +# dump取得状態区分:正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' +# dump取得状態区分:エラー +DUMP_STATUS_KBN_ERROR = '9' diff --git a/ecs/jskult-dbdump/src/system_var/environment.py b/ecs/jskult-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..123935a2 --- /dev/null +++ b/ecs/jskult-dbdump/src/system_var/environment.py @@ -0,0 +1,21 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') +DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) +DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + +DUMP_BACKUP_FOLDER = os.environ['DUMP_BACKUP_FOLDER'] From cf02c6158804df78fd0c5da095c8e71a0088ba41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 10 Jul 2023 13:52:14 +0900 Subject: [PATCH 456/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/.env.example | 1 - .../backup_rds_src05_20230710091352.gz | 0 ecs/jskult-dbdump/src/jobctrl_dbdump.py | 18 +++++++++++++++++- .../src/system_var/environment.py | 1 - 4 files changed, 17 insertions(+), 3 deletions(-) delete mode 100644 ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz diff --git a/ecs/jskult-dbdump/.env.example b/ecs/jskult-dbdump/.env.example index b331b25e..6db2d461 100644 --- a/ecs/jskult-dbdump/.env.example +++ b/ecs/jskult-dbdump/.env.example @@ -5,7 +5,6 @@ DB_PASSWORD=************ DB_SCHEMA=src05 JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult -JSKULT_CONFIG_BUCKET=mbj-newdwh2021-staging-config DUMP_BACKUP_FOLDER=dump diff --git a/ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz b/ecs/jskult-dbdump/backup_rds_src05_20230710091352.gz deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 3ae7bdb6..42be4e51 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -57,6 +57,23 @@ def exec(): with open(my_cnf_path, 'w') as f: f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + #*************************************************************** + # # MySQLコマンドを実行する + # command = ['mysqldump', f'--defaults-file={my_cnf_path}', '-P', f"'{environment.DB_PORT}'", environment.DB_SCHEMA] + # mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # # gzipコマンドを実行して圧縮する + # gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # # aws s3 cpコマンドを実行してアップロードする + # s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout ,stderr=subprocess.PIPE) + # # 出力を取得する + # mysqldump_process.stdout.close() + # _, error = s3_cp_process.communicate() + + # if s3_cp_process.returncode != 0: + # print("Error: ", error.decode("utf-8")) + # raise Exception('Error') + #*************************************************************** + dt_now = datetime.datetime.now() converted_value = dt_now.strftime('%Y%m%d%H%M%S') file_name = f'backup_rds_src05_{converted_value}.gz' @@ -70,7 +87,6 @@ def exec(): '--port={db_port}'.format(db_port=environment.DB_PORT), '{db_name}'.format(db_name=environment.DB_SCHEMA) ] - # mysqldumpコマンドを実行してデータを標準出力に出力 mysqldump_output = subprocess.check_output(mysqldump_cmd) diff --git a/ecs/jskult-dbdump/src/system_var/environment.py b/ecs/jskult-dbdump/src/system_var/environment.py index 123935a2..46f08c5d 100644 --- a/ecs/jskult-dbdump/src/system_var/environment.py +++ b/ecs/jskult-dbdump/src/system_var/environment.py @@ -9,7 +9,6 @@ DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] -JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 732557cb47eb1a7862c9a68b6659ee6014d7758d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 10 Jul 2023 19:12:01 +0900 Subject: [PATCH 457/962] =?UTF-8?q?staging=E3=81=A7=E3=81=AE=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E3=81=AE=E7=82=BA=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 2 +- ecs/jskult-batch-daily/src/aws/s3.py | 2 +- ecs/jskult-batch-daily/src/system_var/environment.py | 2 +- .../tests/batch/vjsk/vjsk_file_check/conftest.py | 4 ++-- ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py | 4 ++-- s3/config/jskult/task_settings/batch_daily_task_settings.env | 3 ++- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 1683e935..1e15cdb0 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -15,7 +15,7 @@ JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt VJSK_DATA_SEND_FOLDER=send VJSK_DATA_BUCKET=************* JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt -JSKULT_DATA_FOLDER_RECV=********************** +VJSK_DATA_RECEIVE_FOLDER=********************** # 連携データ抽出期間 SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 # 洗替対象テーブル名 diff --git a/ecs/jskult-batch-daily/src/aws/s3.py b/ecs/jskult-batch-daily/src/aws/s3.py index 764b600c..a4ebc30a 100644 --- a/ecs/jskult-batch-daily/src/aws/s3.py +++ b/ecs/jskult-batch-daily/src/aws/s3.py @@ -117,7 +117,7 @@ class VjskBackupBucket(JskUltBackupBucket): class VjskReceiveBucket(S3Bucket): _bucket_name = environment.VJSK_DATA_BUCKET - _recv_folder = environment.JSKULT_DATA_FOLDER_RECV + _recv_folder = environment.VJSK_DATA_RECEIVE_FOLDER _s3_file_list = None diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index dd45ae01..42ed6073 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -19,7 +19,7 @@ JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALEND VJSK_DATA_SEND_FOLDER = os.environ['VJSK_DATA_SEND_FOLDER'] VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME'] -JSKULT_DATA_FOLDER_RECV = os.environ['JSKULT_DATA_FOLDER_RECV'] +VJSK_DATA_RECEIVE_FOLDER = os.environ['VJSK_DATA_RECEIVE_FOLDER'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index c315147a..dccdd0df 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -15,12 +15,12 @@ def s3_client(): @pytest.fixture def bucket_name(): - return os.environ["JSKULT_DATA_BUCKET"] + return os.environ["VJSK_DATA_BUCKET"] @pytest.fixture def receive_folder(): - return os.environ["JSKULT_DATA_FOLDER_RECV"] + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] # TODO 共通fixtureにして15個固定でput/delete、各個別fixtureで15個から引き算でdeleteする diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py index ea29eb63..dc77a65f 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/conftest.py @@ -15,12 +15,12 @@ def s3_client(): @pytest.fixture def bucket_name(): - return os.environ["JSKULT_DATA_BUCKET"] + return os.environ["VJSK_DATA_BUCKET"] @pytest.fixture def receive_folder(): - return os.environ["JSKULT_DATA_FOLDER_RECV"] + return os.environ["VJSK_DATA_RECEIVE_FOLDER"] @pytest.fixture diff --git a/s3/config/jskult/task_settings/batch_daily_task_settings.env b/s3/config/jskult/task_settings/batch_daily_task_settings.env index 2590fe79..12c1e83c 100644 --- a/s3/config/jskult/task_settings/batch_daily_task_settings.env +++ b/s3/config/jskult/task_settings/batch_daily_task_settings.env @@ -7,10 +7,11 @@ ULTMARC_BACKUP_FOLDER=ultmarc VJSK_BACKUP_FOLDER=vjsk JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt -JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILENAME=jskult_wholesaler_stock_input_day_list.txt +JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau DB_CONNECTION_MAX_RETRY_ATTEMPT=4 DB_CONNECTION_RETRY_INTERVAL_INIT=5 DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5 DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50 +SALES_LAUNDERING_TARGET_YEAR_OFFSET=5 \ No newline at end of file From 59548a1fa4392ba99b4e721697552b79e64c63a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 10 Jul 2023 19:44:30 +0900 Subject: [PATCH 458/962] =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 42be4e51..477a1388 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -57,23 +57,6 @@ def exec(): with open(my_cnf_path, 'w') as f: f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) - #*************************************************************** - # # MySQLコマンドを実行する - # command = ['mysqldump', f'--defaults-file={my_cnf_path}', '-P', f"'{environment.DB_PORT}'", environment.DB_SCHEMA] - # mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # # gzipコマンドを実行して圧縮する - # gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # # aws s3 cpコマンドを実行してアップロードする - # s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout ,stderr=subprocess.PIPE) - # # 出力を取得する - # mysqldump_process.stdout.close() - # _, error = s3_cp_process.communicate() - - # if s3_cp_process.returncode != 0: - # print("Error: ", error.decode("utf-8")) - # raise Exception('Error') - #*************************************************************** - dt_now = datetime.datetime.now() converted_value = dt_now.strftime('%Y%m%d%H%M%S') file_name = f'backup_rds_src05_{converted_value}.gz' @@ -85,6 +68,10 @@ def exec(): '--password={db_pw}'.format(db_pw=environment.DB_PASSWORD), '--host={db_host}'.format(db_host=environment.DB_HOST), '--port={db_port}'.format(db_port=environment.DB_PORT), + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', '{db_name}'.format(db_name=environment.DB_SCHEMA) ] # mysqldumpコマンドを実行してデータを標準出力に出力 From 47d164a9a254ba6146b86b149f99d931bc4d8df0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 11 Jul 2023 11:08:09 +0900 Subject: [PATCH 459/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 477a1388..1f821456 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -33,7 +33,7 @@ def exec(): # dump処理状態区分が処理中またはエラーの場合、処理は行わない if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED or dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: - logger.error('dump処理状態区エラー(異常終了)') + logger.error('dump処理状態区分エラー(異常終了)') return constants.BATCH_EXIT_CODE_SUCCESS # dump処理状態区分を処理中に更新 From e87da068bb9986f1bac482cde2cd0ecd6013fc87 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 13:03:54 +0900 Subject: [PATCH 460/962] =?UTF-8?q?feat:=20DB=E5=86=8D=E8=B5=B7=E5=8B=95?= =?UTF-8?q?=E3=80=81=E6=99=82=E9=96=93=E7=B5=8C=E9=81=8E=E5=BE=8C=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=8D=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E5=86=8D?= =?UTF-8?q?=E7=A2=BA=E7=AB=8B=E3=81=AE=E4=BB=95=E8=BE=BC=E3=81=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/database.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 85759f96..f700c016 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -1,10 +1,28 @@ from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, - create_engine, text) + create_engine, event, exc, text) from sqlalchemy.engine.url import URL +from sqlalchemy.pool import Pool from src.error.exceptions import DBException +from src.logging.get_logger import get_logger from src.system_var import environment +logger = get_logger('DB接続') + + +@event.listens_for(Pool, 'checkout') +def ping_connection(dbapi_connection, connection_record, connection_proxy): + """コネクションが切れた場合、再接続""" + cursor = dbapi_connection.cursor() + try: + cursor.execute("SELECT 1") + except Exception as e: + logger.info(f'DB接続に失敗したため、リトライします: {e}') + # raise DisconnectionError - pool will try + # connecting again up to three times before raising. + raise exc.DisconnectionError() + cursor.close() + class Database: """データベース操作クラス""" From e690661168ce1513af947d42b5992c86a6610e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Jul 2023 16:51:42 +0900 Subject: [PATCH 461/962] =?UTF-8?q?feat:=20=E3=83=AA=E3=83=9D=E3=82=B8?= =?UTF-8?q?=E3=83=88=E3=83=AA=E4=BF=AE=E6=AD=A3=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 9 +- .../src/model/internal/master_mainte_csv.py | 442 ++++++++++-------- .../model/internal/master_mainte_emp_chg.py | 166 +++++++ .../internal/master_mainte_insert_emp_chg.py | 161 ------- .../view/inst_emp_csv_upload_view_model.py | 6 +- .../src/model/view/mainte_csv_error_model.py | 27 +- ...pository.py => bu_master_cd_repository.py} | 2 +- ...pository.py => emp_chg_inst_repository.py} | 32 +- ...repository.py => emp_master_repository.py} | 2 +- .../mente_exist_dummy_data_repository.py | 34 -- .../mente_exist_emp_chg_inst_repository.py | 32 -- .../mente_exist_real_data_repository.py | 34 -- ...d_repository.py => mst_inst_repository.py} | 2 +- .../src/services/master_mainte_service.py | 120 +++-- .../src/static/css/masterMainte.css | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 24 - .../src/templates/instEmpCsvUL.html | 183 +------- 17 files changed, 530 insertions(+), 748 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py delete mode 100644 ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py rename ecs/jskult-webapp/src/repositories/{mente_exist_bu_cd_repository.py => bu_master_cd_repository.py} (91%) rename ecs/jskult-webapp/src/repositories/{mente_write_emp_chg_inst_repository.py => emp_chg_inst_repository.py} (71%) rename ecs/jskult-webapp/src/repositories/{mente_exist_emp_cd_repository.py => emp_master_repository.py} (93%) delete mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py delete mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py delete mode 100644 ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py rename ecs/jskult-webapp/src/repositories/{mente_exist_inst_cd_repository.py => mst_inst_repository.py} (91%) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index beb17f53..c97d40eb 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -90,14 +90,7 @@ def inst_emp_csv_upload_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - mainte_csv_up = InstEmpCsvUploadViewModel( - # is_verified=False, - # select_function="", - # select_table="", - # new_inst_emp="", - # dialog_msg="", - # error_list=[] - ) + mainte_csv_up = InstEmpCsvUploadViewModel() # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 0edf92c8..4400c318 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -1,54 +1,46 @@ import csv from io import TextIOWrapper +from datetime import datetime from abc import ABCMeta, abstractmethod from src.system_var import constants -from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository -from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository -from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository -from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository -from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository -from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository -from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.repositories.mst_inst_repository import MstInstRepository +from src.repositories.bu_master_cd_repository import BuMasterRepository +from src.repositories.emp_master_repository import EmpMasterRepository +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') class MasterMainteCSVItem(metaclass=ABCMeta): - select_table: str + csv_row: list[str] + table_name: str line_num: str - csv_row: list[str] # dictで持つかどうかは要検討 - inst_cd: str - ta_cd: str - emp_cd: str - inst_cd_repository: MenteExistInstCdRepository - emp_cd_repository: MenteExistEmpCdRepository - bu_cd_repository: MenteExistBuCdRepository - dummy_data_repository: MenteExistDummyDataRepository - real_data_repository: MenteExistRealDataRepository - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): - self.select_table = select_table # ダミー or 本番 - self.csv_row = csv_row # CSVの1行 - self.line_num = line_num # CSVの行数 - self.inst_cd_repository = inst_cd_repository - self.emp_cd_repository = emp_cd_repository - self.bu_cd_repository = bu_cd_repository - self.dummy_data_repository = dummy_data_repository - self.real_data_repository = real_data_repository - self.emp_chg_inst_repository = emp_chg_inst_repository + self.csv_row = csv_row + self.table_name = table_name + self.line_num = line_num + self.mst_inst_repository = mst_inst_repository + self.emp_master_repository = emp_master_repository + self.bu_master_repository = bu_master_repository + self.emp_chginst_repository = emp_chginst_repository - def validate(self) -> list[list[str]]: + def validate(self) -> list[str]: """ 項目のバリデーションを行うテンプレートメソッド\n 各チェックロジックはサブクラスで実装する @@ -64,7 +56,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): # BuCd存在チェック error_list.extend(self.check_bu_cd_exists()) # 適用開始日 < 適用終了日、実在日チェック - # error_list.extend(self.check_existing_date()) + error_list.extend(self.check_existing_date()) # 項目数チェック error_list.extend(self.check_item_count()) # データ存在チェック @@ -74,28 +66,70 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list = [error for error in error_list if len(error) != 0] return error_list - # protected? def check_csv_item_count(self, item_count: int) -> list[str]: error_list = [] for col_num, row in enumerate(self.csv_row, start=1): if col_num > item_count and row is not None and len(row) > 0: - error_list.append([self.line_num, '', constants.CSV_UP_ITEM_CNT_ERR, 'の項目数が一致しません。項目数を確認してください。']) + error_list.append(f'{self.line_num}行目の項目数が一致しません。項目数を確認してください。') break return error_list def emp_chg_inst_count(self, start_date: str): - table_name = 'src05.emp_chg_inst_wrk' if self.select_table == 'dummy' else 'src05.emp_chg_inst' - # pythonは子クラスのメンバも親から呼べる? - return self.emp_chg_inst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, table_name) + return self.emp_chginst_repository.fetch_count(self.inst_cd, self.ta_cd, start_date, self.table_name) def is_error_emp_cd(self, start_date: str) -> bool: if start_date is None or len(start_date) == 0: return False - if self.emp_cd_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: + if self.emp_master_repository.fetch_count(self.emp_cd, start_date, start_date) == 0: return True return False + def is_exist_inst_cd(self) -> bool: + return True if self.mst_inst_repository.fetch_count(self.inst_cd) > 0 else False + + def is_exist_bu_cd(self) -> bool: + return True if self.bu_master_repository.fetch_count(self.bu_cd) > 0 else False + + def make_require_error_message(self, line_num: str, col_name: str) -> str: + return f'{line_num}行目の{col_name}が入力されておりません。' + + def __parse_str_to_date(self, check_date: str) -> tuple[bool, datetime]: + try: + check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') + except Exception as e: + logger.exception(f'適用期間の日付が不正{e}') + return (False, None) + + try: + reverse_check_date: str = check_date_time.strftime('%Y%m%d') + except Exception as e: + logger.exception(f'適用期間の日付が不正{e}') + return (False, None) + + if check_date != reverse_check_date: + return (False, None) + + return (True, check_date_time) + + def check_term_date(self, + start_date: str, + end_date: str, + start_date_col_name: str, + end_date_col_name: str) -> tuple[list[str], datetime, datetime]: + error_list = [] + + if start_date is not None: + (result, start_date_time) = self.__parse_str_to_date(start_date) + if result is False: + error_list.append(f'{self.line_num}行目の{start_date_col_name}が実在しない日付になっています。') + if end_date is not None: + (result, end_date_time) = self.__parse_str_to_date(end_date) + if result is False: + error_list.append(f'{self.line_num}行目の{end_date_col_name}が実在しない日付になっています。') + + return (error_list, start_date_time, end_date_time) + @abstractmethod def csv_row_data(self) -> dict: pass @@ -107,34 +141,27 @@ class MasterMainteCSVItem(metaclass=ABCMeta): pass ... + @abstractmethod def check_inst_cd_exists(self) -> list[str]: - error_list = [] - - inst_cd_count = self.inst_cd_repository.fetch_count(self.inst_cd) - if inst_cd_count == 0: - # 親クラスに持った方がいいので即値指定 - error_list.append([self.line_num, '施設コード', constants.CSV_UP_NOT_EXIST_INST_CD_ERR, '']) - return error_list + """InstCD存在チェック""" + pass + ... @abstractmethod def check_emp_cd_exists(self) -> list[str]: """MUID存在チェック""" pass + ... + @abstractmethod def check_bu_cd_exists(self) -> list[str]: """BuCd存在チェック""" - error_list = [] - - bu_cd_count = self.bu_cd_repository.fetch_count(self.bu_cd) - if bu_cd_count == 0: - # 親クラスに持った方がいいので即値指定 - error_list.append([self.line_num, 'ビジネスユニットコード', constants.CSV_UP_NOT_EXIST_BU_CD_ERR, '']) - return error_list + pass + ... @abstractmethod def check_existing_date(self) -> list[str]: """適用開始日 < 適用終了日、実在日チェック""" - pass @abstractmethod def check_item_count(self) -> list[str]: @@ -146,6 +173,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): def check_data_exists(self) -> list[str]: """データ存在チェック""" pass + ... class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): @@ -156,32 +184,28 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): # emp_cd: str # d emp_name_family: str # e emp_name_first: str # f - bu_cd: str # g + # bu_cd: str # g start_date: str # h end_date: str # i def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): super().__init__( csv_row, - select_table, + table_name, line_num, - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository ) self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] # a self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] # b @@ -199,45 +223,66 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_require(self) -> list[str]: error_list = [] if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) # エラーコードを入れないと、出力制御が難しい。 - # メッセージの一部を配列に混ぜるかどうか検討 + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO])) if len(self.bu_cd) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO])) if len(self.start_date) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) - + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE])) if len(self.end_date) == 0: - error_list.append( - [self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE])) return error_list + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_inst_cd() is False: + error_list.append( + f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') + return error_list + def check_emp_cd_exists(self) -> list[str]: error_list = [] if self.start_date is None or len(self.start_date) == 0: return error_list if super().is_error_emp_cd(self.start_date) is True: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + def check_bu_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_bu_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + (error_list, start_date_time, end_date_time) = super().check_term_date( + self.start_date, + self.end_date, + constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], + constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]) + if len(error_list) > 0 or self.start_date is None or self.end_date is None: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE]}\ +が{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]}よりも後の日付になっています。') return error_list def check_item_count(self) -> list[str]: @@ -246,17 +291,14 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_data_exists(self) -> list[str]: error_list = [] if super().emp_chg_inst_count(self.start_date) > 0: - error_list.append([self.line_num, '', constants.CSV_UP_NEW_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、適用開始日がすべて同一のデータが既に登録されています。') return error_list - def check_existing_date(self) -> list[str]: - return [] - class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): """施設担当者変更登録CSV""" - bu_cd: str # a + # bu_cd: str # a bu_name: str # b org_cd: str # c org_short_name: str # d @@ -274,25 +316,21 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def __init__( self, csv_row: list[str], - select_table: str, + table_name: str, line_num: str, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ): super().__init__( csv_row, - select_table, + table_name, line_num, - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository ) self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] @@ -317,69 +355,59 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list = [] if self.comment == '追加': if len(self.bu_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO])) if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants. - CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.inst_emp_end_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '終了': if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.change_end_date) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message(self.line_num, constants.CHANGE_INST_EMP_MAP[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '担当者修正': if len(self.inst_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append([self.line_num, constants. - CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], - constants.CSV_UP_NULL_ERR, - 'が入力されておりません。']) + error_list.append(self.make_require_error_message( + self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) else: - error_list.append([self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_COMMENT], - constants.CSV_UP_COMMENT_ERR, - 'のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。']) + error_list.append(f'{self.line_num}行目のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。') + return error_list + def check_inst_cd_exists(self) -> list[str]: + error_list = [] + + if super().is_exist_inst_cd() is False: + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO]}\ +は施設マスタに存在しないコードです。') return error_list def check_emp_cd_exists(self) -> list[str]: @@ -389,8 +417,45 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): return error_list if super().is_error_emp_cd(self.inst_emp_start_date) is True: - error_list.append([self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO], - constants.CSV_UP_NOT_EXIST_EMP_CD_ERR, '']) + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ +は従業員マスタに存在しない もしくは 適用期間外のIDです。') + return error_list + + def check_bu_cd_exists(self) -> list[str]: + """BuCd存在チェック""" + error_list = [] + + if super().is_exist_bu_cd() is False: + + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO]}\ +はビジネスユニットマスタに存在しないコードです。') + return error_list + + def check_existing_date(self) -> list[str]: + error_list = [] + start_date = self.inst_emp_start_date + if self.comment == '追加' or self.comment == '終了': + if self.comment == '追加': + end_date = self.inst_emp_end_date + end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' + else: + end_date = self.change_end_date + end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] + compare_error_message = f'\ +{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' + + (error_list, start_date_time, end_date_time) = super().check_term_date( + start_date, + end_date, + constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + end_date_col_name) + if len(error_list) > 0 or self.start_date is None or self.end_date is None: + return error_list + + if start_date_time > end_date_time: + error_list.append(f'{self.line_num}行目の{compare_error_message}') return error_list def check_item_count(self) -> list[str]: @@ -400,15 +465,13 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list = [] emp_chg_inst_count = super().emp_chg_inst_count(self.inst_emp_start_date) if self.comment == '追加' and emp_chg_inst_count > 0: - error_list.append([self.line_num, '', constants.CSV_UP_ADD_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが既に登録されています。') + elif (self.comment == '終了' or self.comment == '担当者修正') and emp_chg_inst_count == 0: - error_list.append([self.line_num, '', constants.CSV_UP_UPDATE_DATA_DUP_ERR, '']) + error_list.append(f'{self.line_num}行目の施設コード、領域コード、施設担当_開始日がすべて同一のデータが存在しないため更新できません。') return error_list - def check_existing_date(self) -> list[str]: - return [] - class MasterMainteCSVItems: """施設担当者CSVをループで回すためのもの""" @@ -432,46 +495,39 @@ class MasterMainteCSVItems: def __init__( self, file: TextIOWrapper, - csv_upload_form: MasterMainteCsvUpModel, - inst_cd_repository: MenteExistInstCdRepository, - emp_cd_repository: MenteExistEmpCdRepository, - bu_cd_repository: MenteExistBuCdRepository, - dummy_data_repository: MenteExistDummyDataRepository, - real_data_repository: MenteExistRealDataRepository, - emp_chg_inst_repository: MenteExistEmpChgInstRepository + select_function: str, + table_name: str, + mst_inst_repository: MstInstRepository, + emp_master_repository: EmpMasterRepository, + bu_master_repository: BuMasterRepository, + emp_chginst_repository: EmpChgInstRepository ) -> None: - # self.header = file.readline().strip('\n').replace('"', '').split(',') - # reader = csv.DictReader(file, fieldnames=self.header) reader = csv.reader(file) csv_rows = [] - if csv_upload_form.select_function == 'new': + if select_function == 'new': for line_num, row in enumerate(reader, start=0): if line_num == 0: continue csv_rows.append(MasterMainteNewInstEmpCSVItem( row, - csv_upload_form.select_table, + table_name, str(line_num), - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository) + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) ) - elif csv_upload_form.select_function == 'change': + elif select_function == 'change': for line_num, row in enumerate(reader, start=0): if line_num == 0: continue csv_rows.append(MasterMainteChangeInstEmpCSVItem( row, - csv_upload_form.select_table, + table_name, str(line_num), - inst_cd_repository, - emp_cd_repository, - bu_cd_repository, - dummy_data_repository, - real_data_repository, - emp_chg_inst_repository) + mst_inst_repository, + emp_master_repository, + bu_master_repository, + emp_chginst_repository) ) self.lines = csv_rows diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py new file mode 100644 index 00000000..cc25ad26 --- /dev/null +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg.py @@ -0,0 +1,166 @@ +from abc import ABCMeta, abstractmethod +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.logging.get_logger import get_logger + +logger = get_logger('マスターメンテ') + + +class MasterMainteEmpChg(metaclass=ABCMeta): + insert_data: list[dict] + table_name: str + select_table_message: str + user_name: str + emp_chginst_repository: EmpChgInstRepository + + def __init__( + self, + insert_data, + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + self.insert_data = insert_data + self.table_name = table_name + self.select_table_message = select_table_message + self.user_name = user_name + self.emp_chginst_repository = emp_chginst_repository + + def save(self): + error_list = [] + try: + self.emp_chginst_repository.connect() + self.emp_chginst_repository.begin() + (result_message, error_list) = self.write_emp_chg_inst_table() + if len(error_list) > 0: + self.emp_chginst_repository.rollback() + else: + self.emp_chginst_repository.commit() + except Exception as e: + self.emp_chginst_repository.rollback() + raise e + finally: + self.emp_chginst_repository.disconnect() + + return (result_message, error_list) + + def add_emp_chg_inst_table(self, data, start_date, end_date): + self.emp_chginst_repository.insert_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['MUID'], + data['ビジネスユニットコード'], + start_date, + end_date, + self.user_name, + self.user_name, + self.table_name) + + @abstractmethod + def write_emp_chg_inst_table(self): + pass + + +class MasterMainteNewEmpChg(MasterMainteEmpChg): + + def __init__( + self, + insert_data_list: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + ): + super().__init__( + insert_data_list, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + error_list = [] + + add_count = 0 + for row_no, data in enumerate(self.insert_data, start=1): + try: + self.add_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) + add_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + logger.info(f'新規施設登録時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('新規施設登録を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + return (result_message_list, error_list) + + +class MasterMainteChangeEmpChg(MasterMainteEmpChg): + + def __init__( + self, + insert_data: list[dict], + table_name: str, + select_table_message: str, + user_name: str, + emp_chginst_repository: EmpChgInstRepository + + ): + super().__init__( + insert_data, + table_name, + select_table_message, + user_name, + emp_chginst_repository + ) + + def write_emp_chg_inst_table(self): + add_count = 0 + end_count = 0 + modify_count = 0 + error_list = [] + for row_no, data in enumerate(self.insert_data, start=1): + try: + if data['コメント'] == '追加': + self.add_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) + add_count += 1 + elif data['コメント'] == '終了': + self.__end_emp_chg_inst(data) + end_count += 1 + elif data['コメント'] == '担当者修正': + self.__modify_emp_chg_inst(data) + modify_count += 1 + except Exception as e: + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + logger.info(f'施設担当者変更時に{row_no}行目でエラーが発生しました: {e}') + + result_message_list = [] + if len(error_list) == 0: + result_message_list.append('施設担当者変更を行いました') + result_message_list.append('対象:' + self.select_table_message) + result_message_list.append('追加:' + str(add_count) + '件') + result_message_list.append('修正:' + str(modify_count) + '件') + result_message_list.append('終了:' + str(end_count) + '件') + return (result_message_list, error_list) + + def __end_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.end_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['終了日の変更'], + self.user_name, + self.table_name) + + def __modify_emp_chg_inst(self, data: dict): + self.emp_chginst_repository.modify_emp_chg_inst( + data['施設コード'], + data['領域コード'], + data['施設担当_開始日'], + data['MUID'], + self.user_name, + self.table_name) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py b/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py deleted file mode 100644 index d709487f..00000000 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_insert_emp_chg.py +++ /dev/null @@ -1,161 +0,0 @@ -from abc import ABCMeta, abstractmethod -from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository - -from src.system_var import constants - - -class MasterMainteInsertEmpChg(metaclass=ABCMeta): - insert_data: list[dict] - table_name: str - select_table_message: str - user_name: str - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - - def __init__( - self, - insert_data, - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - ): - self.insert_data = insert_data - self.table_name = table_name # ダミー or 本番 - self.select_table_message = select_table_message - self.user_name = user_name - self.emp_chg_inst_repository = emp_chg_inst_repository - - def insert_emp_chg_inst(self): - error_list = [] - try: - self.emp_chg_inst_repository.connect() - self.emp_chg_inst_repository.begin() - (result_message, error_list) = self.write_emp_chg_inst_table() - if len(error_list) > 0: - self.emp_chg_inst_repository.rollback() - else: - self.emp_chg_inst_repository.commit() - except Exception: - self.emp_chg_inst_repository.rollback() #  一つでもエラーが発生したら終了するようにする場合はここで - - finally: - self.emp_chg_inst_repository.disconnect() - - return (result_message, error_list) - - def insert_emp_chg_inst_table(self, data, start_date, end_date): - self.emp_chg_inst_repository.insert_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['MUID'], - data['ビジネスユニットコード'], - start_date, - end_date, - self.user_name, - self.user_name, - self.table_name) - - @abstractmethod - def write_emp_chg_inst_table(self): - pass - - -class MasterMainteNewInsertEmpChg(MasterMainteInsertEmpChg): - - def __init__( - self, - insert_data_list: list[dict], - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - ): - super().__init__( - insert_data_list, - table_name, - select_table_message, - user_name, - emp_chg_inst_repository - ) - - def write_emp_chg_inst_table(self): - error_list = [] - - add_count = 0 - for row_no, data in enumerate(self.insert_data, start=1): - try: - self.insert_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) - add_count += 1 - except Exception: - error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? - - result_message_list = [] - result_message_list.append('新規施設登録を行いました') - result_message_list.append('対象:' + self.select_table_message) - result_message_list.append('追加:' + str(add_count) + '件') - return (result_message_list, error_list) - - -class MasterMainteChangeInsertEmpChg(MasterMainteInsertEmpChg): - - def __init__( - self, - insert_data: list[dict], - table_name: str, - select_table_message: str, - user_name: str, - emp_chg_inst_repository: MenteWriteEmpChgInstRepository - - ): - super().__init__( - insert_data, - table_name, - select_table_message, - user_name, - emp_chg_inst_repository - ) - - def write_emp_chg_inst_table(self): - add_count = 0 - end_count = 0 - modify_count = 0 - error_list = [] # 例外が発生する仕組みなのでどうするか? - for row_no, data in enumerate(self.insert_data, start=1): - try: - if data['コメント'] == '追加': - self.insert_emp_chg_inst_table(data, data['施設担当_開始日'], data['施設担当_終了日']) - add_count += 1 - elif data['コメント'] == '終了': - self.__end_emp_chg_inst(data) - end_count += 1 - elif data['コメント'] == '担当者修正': - self.__modify_end_emp_chg_inst(data) - modify_count += 1 - except Exception: - error_list.append([str(row_no), '', constants.CSV_UP_SQL_ERR, '']) # ここをどうする? - - result_message_list = [] - result_message_list.append('施設担当者変更を行いました') - result_message_list.append('対象:' + self.select_table_message) - result_message_list.append('追加:' + str(add_count) + '件') - result_message_list.append('修正:' + str(modify_count) + '件') - result_message_list.append('終了:' + str(end_count) + '件') - return (result_message_list, error_list) - - def __end_emp_chg_inst(self, data: dict): - self.emp_chg_inst_repository.end_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['施設担当_開始日'], - data['終了日の変更'], - self.user_name, - self.table_name) - - def __modify_end_emp_chg_inst(self, data: dict): - self.emp_chg_inst_repository.modify_end_emp_chg_inst( - data['施設コード'], - data['領域コード'], - data['施設担当_開始日'], - data['MUID'], - self.user_name, - self.table_name) 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 index 9d29f508..1cd0157c 100644 --- 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 @@ -10,7 +10,7 @@ class InstEmpCsvUploadViewModel(BaseModel): subtitle: str = '施設担当者データCSVアップロード' is_verified: Optional[bool] is_insert: Optional[bool] - error_list: Optional[list[CsvErrorModel]] + error_message_list: Optional[list[CsvErrorModel]] select_function: Optional[str] select_table: Optional[str] csv_file_name: Optional[str] @@ -34,8 +34,8 @@ class InstEmpCsvUploadViewModel(BaseModel): def is_select_table_empty(self): return self.select_table is None or len(self.select_table) == 0 - def is_error_list_empty(self): - return self.error_list is None or len(self.error_list) == 0 + def is_error_message_list_empty(self): + return self.error_message_list is None or len(self.error_message_list) == 0 def csv_data_count(self): return 0 if self.csv_upload_list is None else len(self.csv_upload_list) diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py index 4fb4e241..2cf9ac13 100644 --- a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py +++ b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py @@ -1,30 +1,9 @@ from pydantic import BaseModel from typing import Optional -from src.system_var import constants class CsvErrorModel(BaseModel): - row_no: Optional[str] - item_name: Optional[str] - message: Optional[str] - error_code: Optional[str] + error_message: Optional[str] - def __init__(self, row_no: str, item_name: str, error_code: str, message: str) -> None: - super().__init__(row_no=row_no, item_name=item_name, - error_code=error_code, message=message) - - # 確認のため途中まで実装 エラーコードが無いと、メッセージの編集が適切にできない場合あり - - def error_message(self): - error_message: str = '' - if self.error_code == constants.CSV_UP_NULL_ERR: - error_message = self.row_no + '行目の' + self.item_name + 'が入力されておりません。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_INST_CD_ERR: - error_message = self.row_no + '行目の施設コードは施設マスタに存在しないコードです。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_EMP_CD_ERR: - error_message = self.row_no + '行目のMUIDは従業員マスタに存在しない もしくは 適用期間外のIDです。' - elif self.error_code == constants.CSV_UP_NOT_EXIST_BU_CD_ERR: - error_message = self.row_no + '行目のビジネスユニットコードはビジネスユニットマスタに存在しないコードです。' - elif self.error_code == constants.CSV_UP_SQL_ERR: - error_message = self.row_no + '行目がSQL実行エラーです。Excelファイルを確認してください。' - return error_message + def __init__(self, error_message: str) -> None: + super().__init__(error_message=error_message) diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py similarity index 91% rename from ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py rename to ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py index 2305f884..62b24de0 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_bu_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistBuCdRepository(BaseRepository): +class BuMasterRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py similarity index 71% rename from ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py rename to ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 4a2856ec..b90ea51c 100644 --- a/ecs/jskult-webapp/src/repositories/mente_write_emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -1,7 +1,8 @@ from src.repositories.base_repository import BaseRepository +from src.model.db.master_mente_count import MasterMenteCountModel -class MenteWriteEmpChgInstRepository(BaseRepository): +class EmpChgInstRepository(BaseRepository): def connect(self): self._database.connect() @@ -109,7 +110,7 @@ class MenteWriteEmpChgInstRepository(BaseRepository): and start_date = :start_date """ - def modify_end_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): + def modify_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): try: query = self.UPDATE_SQL.format(table_name=table_name) self._database.execute(query, { @@ -122,3 +123,30 @@ class MenteWriteEmpChgInstRepository(BaseRepository): except Exception as e: print(f"[ERROR] DB Error : Exception={e.args}") raise e + + FETCH_COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + {table_name} + WHERE + inst_cd = :inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + + def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: + try: + self._database.connect() + query = self.FETCH_COUNT_SQL.format(table_name=table_name) + result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, + 'start_date': start_date}) + models = [MasterMenteCountModel(**r) for r in result] + if len(models) == 0: + return 0 + return models[0].count + except Exception as e: + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py similarity index 93% rename from ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py rename to ecs/jskult-webapp/src/repositories/emp_master_repository.py index d7619719..631bd643 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_emp_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistEmpCdRepository(BaseRepository): +class EmpMasterRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py deleted file mode 100644 index bb892aa2..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_dummy_data_repository.py +++ /dev/null @@ -1,34 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistDummyDataRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - src05.emp_chg_inst_wrk - WHERE - inst_cd = :instCd - AND ta_cd = :taCd - AND start_date = :startDate - """ - - def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, - {'instCd': inst_cd, - 'taCd': ta_cd, - 'startDate': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py deleted file mode 100644 index 4c321de7..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_emp_chg_inst_repository.py +++ /dev/null @@ -1,32 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistEmpChgInstRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - {table_name} - WHERE - inst_cd = :inst_cd - AND ta_cd = :ta_cd - AND start_date = :start_date - """ - - def fetch_count(self, inst_cd, ta_cd, start_date, table_name) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL.format(table_name=table_name) - result = self._database.execute_select(query, {'inst_cd': inst_cd, 'ta_cd': ta_cd, - 'start_date': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py b/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py deleted file mode 100644 index bf74305c..00000000 --- a/ecs/jskult-webapp/src/repositories/mente_exist_real_data_repository.py +++ /dev/null @@ -1,34 +0,0 @@ -from src.repositories.base_repository import BaseRepository -from src.model.db.master_mente_count import MasterMenteCountModel - - -class MenteExistRealDataRepository(BaseRepository): - - FETCH_COUNT_SQL = """\ - SELECT - COUNT(*) AS count - FROM - src05.emp_chg_inst - WHERE - inst_cd = :instCd - AND ta_cd = :taCd - AND start_date = :startDate - """ - - def fetch_count(self, inst_cd, ta_cd, start_date) -> MasterMenteCountModel: - try: - self._database.connect() - query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, - {'instCd': inst_cd, - 'taCd': ta_cd, - 'startDate': start_date}) - models = [MasterMenteCountModel(**r) for r in result] - if len(models) == 0: - return 0 - return models[0].count - except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") - raise e - finally: - self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py similarity index 91% rename from ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py rename to ecs/jskult-webapp/src/repositories/mst_inst_repository.py index e360e494..bafcc525 100644 --- a/ecs/jskult-webapp/src/repositories/mente_exist_inst_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py @@ -2,7 +2,7 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel -class MenteExistInstCdRepository(BaseRepository): +class MstInstRepository(BaseRepository): FETCH_COUNT_SQL = """\ SELECT diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index f68cba6b..4ca8f624 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -5,77 +5,71 @@ from src.aws.aws_api_client import AWSAPIClient from src.repositories.base_repository import BaseRepository from src.services.base_service import BaseService from src.model.internal.master_mainte_csv import MasterMainteCSVItems -from src.model.internal.master_mainte_insert_emp_chg import MasterMainteChangeInsertEmpChg -from src.model.internal.master_mainte_insert_emp_chg import MasterMainteNewInsertEmpChg +from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg +from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel from src.logging.get_logger import get_logger from src.model.view.mainte_csv_upload_model import CsvUploadModel from src.model.view.mainte_csv_error_model import CsvErrorModel -from src.repositories.mente_exist_inst_cd_repository import MenteExistInstCdRepository -from src.repositories.mente_exist_bu_cd_repository import MenteExistBuCdRepository -from src.repositories.mente_exist_emp_cd_repository import MenteExistEmpCdRepository -from src.repositories.mente_exist_dummy_data_repository import MenteExistDummyDataRepository -from src.repositories.mente_exist_real_data_repository import MenteExistRealDataRepository -from src.repositories.mente_exist_emp_chg_inst_repository import MenteExistEmpChgInstRepository -from src.repositories.mente_write_emp_chg_inst_repository import MenteWriteEmpChgInstRepository +from src.repositories.mst_inst_repository import MstInstRepository +from src.repositories.bu_master_cd_repository import BuMasterRepository +from src.repositories.emp_master_repository import EmpMasterRepository +from src.repositories.emp_chg_inst_repository import EmpChgInstRepository logger = get_logger('マスターメンテ') class MasterMainteService(BaseService): REPOSITORIES = { - 'inst_cd_repository': MenteExistInstCdRepository, - 'emp_cd_repository': MenteExistEmpCdRepository, - 'bu_cd_repository': MenteExistBuCdRepository, - 'dummy_data_repository': MenteExistDummyDataRepository, - 'real_data_repository': MenteExistRealDataRepository, - 'emp_chg_inst_repository': MenteExistEmpChgInstRepository, - 'write_emp_chg_inst_repository': MenteWriteEmpChgInstRepository + 'mst_inst_repository': MstInstRepository, + 'emp_master_repository': EmpMasterRepository, + 'bu_master_repository': BuMasterRepository, + 'emp_chginst_repository': EmpChgInstRepository, } - inst_cd_repository: MenteExistInstCdRepository - emp_cd_repository: MenteExistEmpCdRepository - bu_cd_repository: MenteExistBuCdRepository - dummy_data_repository: MenteExistDummyDataRepository - real_data_repository: MenteExistRealDataRepository - emp_chg_inst_repository: MenteExistEmpChgInstRepository - write_emp_chg_inst_repository: MenteWriteEmpChgInstRepository + mst_inst_repository: MstInstRepository + emp_master_repository: EmpMasterRepository + bu_master_repository: BuMasterRepository + emp_chginst_repository: EmpChgInstRepository def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) - self.inst_cd_repository = repositories['inst_cd_repository'] - self.emp_cd_repository = repositories['emp_cd_repository'] - self.bu_cd_repository = repositories['bu_cd_repository'] - self.dummy_data_repository = repositories['dummy_data_repository'] - self.real_data_repository = repositories['real_data_repository'] - self.emp_chg_inst_repository = repositories['emp_chg_inst_repository'] - self.write_emp_chg_inst_repository = repositories['write_emp_chg_inst_repository'] + self.mst_inst_repository = repositories['mst_inst_repository'] + self.emp_master_repository = repositories['emp_master_repository'] + self.bu_master_repository = repositories['bu_master_repository'] + self.emp_chginst_repository = repositories['emp_chginst_repository'] def prepare_mainte_csv_up_view(self, file: TextIOWrapper, csv_file_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: + if csv_upload_form.select_function != 'new' and csv_upload_form.select_function == 'change': + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') + if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': + raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') + + (table_name, _) = self.__target_table(csv_upload_form.select_table) + csv_items = MasterMainteCSVItems( file, - csv_upload_form, - self.inst_cd_repository, - self.emp_cd_repository, - self.bu_cd_repository, - self.dummy_data_repository, - self.real_data_repository, - self.emp_chg_inst_repository + csv_upload_form.select_function, + table_name, + self.mst_inst_repository, + self.emp_master_repository, + self.bu_master_repository, + self.emp_chginst_repository ) - error_list = [] + error_message_list = [] for row_item in csv_items: - error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in row_item.validate()]) # 微妙 + error_message_list.extend([CsvErrorModel(data) for data in row_item.validate()]) csv_items.reset() csv_upload_list = [] json_upload_data = '' - if len(error_list) == 0: + if len(error_message_list) == 0: csv_upload_list: list[CsvUploadModel] = [CsvUploadModel( csv_row=row_item.csv_row_data()) for row_item in csv_items] @@ -84,7 +78,7 @@ class MasterMainteService(BaseService): mainte_csv_up = InstEmpCsvUploadViewModel( is_verified=True, - error_list=error_list, + error_message_list=error_message_list, select_function=csv_upload_form.select_function, select_table=csv_upload_form.select_table, csv_upload_list=csv_upload_list, @@ -97,46 +91,46 @@ class MasterMainteService(BaseService): user_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: - if csv_upload_form.select_table == 'dummy': - table_name = 'src05.emp_chg_inst_wrk' - selected_table_msg = 'ダミーテーブル' - elif csv_upload_form.select_table == 'real': - table_name = 'src05.emp_chg_inst' - selected_table_msg = '本番テーブル' - # else: - # 例外? + (table_name, selected_table_msg) = self.__target_table(csv_upload_form.select_table) csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) if csv_upload_form.select_function == 'new': - insert_emp_chg = MasterMainteNewInsertEmpChg( + emp_chg_inst = MasterMainteNewEmpChg( csv_data_list, table_name, selected_table_msg, user_name, - self.write_emp_chg_inst_repository) + self.emp_chginst_repository) elif csv_upload_form.select_function == 'change': - insert_emp_chg = MasterMainteChangeInsertEmpChg( + emp_chg_inst = MasterMainteChangeEmpChg( csv_data_list, table_name, selected_table_msg, user_name, - self.write_emp_chg_inst_repository - ) - # else: - # 例外を発生させる? + self.emp_chginst_repository) + else: + raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') - (result_message_list, raw_error_list) = insert_emp_chg.insert_emp_chg_inst() + (result_message_list, raw_error_list) = emp_chg_inst.save() - error_list = [] - error_list.extend([CsvErrorModel(data[0], data[1], data[2], data[3]) for data in raw_error_list]) - - if result_message_list is None: - result_message_list.append('DB接続エラー') + error_message_list = [] + error_message_list.extend([CsvErrorModel(data) for data in raw_error_list]) mainte_csv_up = InstEmpCsvUploadViewModel( is_insert=True, result_message_list=result_message_list, - error_list=error_list + error_message_list=error_message_list ) return mainte_csv_up + + def __target_table(self, select_table: str): + if select_table == 'dummy': + table_name = 'src05.emp_chg_inst_wrk' + selected_table_msg = 'ダミーテーブル' + elif select_table == 'real': + table_name = 'src05.emp_chg_inst' + selected_table_msg = '本番テーブル' + else: + raise Exception(f'登録テーブルの選択値が不正です: {select_table}') + return (table_name, selected_table_msg) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index a59c1681..ed02abb8 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -23,7 +23,7 @@ h1{ width: 20%; } -.buttonSize{ +.csvup_buttonSize{ width: 85px; } diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 0e0a8b0a..27d07283 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -214,30 +214,6 @@ CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 # コメントの列No CSV_CHANGE_COMMENT = 13 - -# エラーコード -CSV_UP_NULL_ERR = 'nullError' -CSV_UP_COMMENT_ERR = 'commentError' -CSV_UP_NOT_EXIST_INST_CD_ERR = 'instCdErr' -CSV_UP_NOT_EXIST_EMP_CD_ERR = 'empCdErr' -CSV_UP_NOT_EXIST_BU_CD_ERR = 'buCdErr' -CSV_UP_ITEM_CNT_ERR = 'itemCntErr' -CSV_UP_FILE_TYPE_ERR = 'fileTypeErr' -CSV_UP_FILEN_EXIST_ERR = 'filenExistErr' -CSV_UP_SQL_ERR = 'sqlErr' -CSV_UP_NEW_COMPARE_DATE_ERR = 'newCompareDateErr' -CSV_UP_ADD_COMPARE_DATE_ERR = 'addCompareDateErr' -CSV_UP_END_COMPARE_DATE_ERR = 'endCompareDateErr' -CSV_UP_START_DATE_REAL_ERR = 'startDateRealErr' -CSV_UP_END_DATE_REAL_ERR = 'endDateRealErr' -CSV_UP_INST_EMPSTART_DATE_REAL_ERR = 'instEmpStartDateRealErr' -CSV_UP_INST_EMP_END_DATE_REAL_ERR = 'instEmpEndDateRealErr' -CSV_UP_CHANGE_END_DATE_REAL_ERR = 'changeEndDateRealErr' -CSV_UP_NEW_DATA_DUP_ERR = 'newDataDupErr' -CSV_UP_ADD_DATA_DUP_ERR = 'addDataDupErr' -CSV_UP_UPDATE_DATA_DUP_ERR = 'updateDataDupErr' -CSV_UP_INPUT_DATA_ZERO_ERR = 'inputDataZeroErr' - # CSVの列数 CSV_NEW_COL_COUNT = 9 CSV_CHANGE_COL_COUNT = 14 diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 2c318134..50a1b2bd 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -40,19 +40,19 @@ 施設担当者データCSVアップロード - {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} {% else %} - + {% endif %} -
新規施設登録 @@ -77,7 +77,7 @@ @@ -91,7 +91,7 @@ @@ -100,7 +100,7 @@ @@ -111,7 +111,7 @@ 登録Excel: - {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} {{mainte_csv_up.csv_file_name}} {% else %} @@ -119,10 +119,10 @@ - {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() and mainte_csv_up.select_table == 'real' %} + {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() and mainte_csv_up.select_table == 'real' %}
本番テーブルが選択されています
- {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() and mainte_csv_up.select_table == 'dummy' %} + {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() and mainte_csv_up.select_table == 'dummy' %} {% else %} @@ -133,8 +133,8 @@ -{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} - +{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} + {% endif %} @@ -142,16 +142,15 @@

- {% if not mainte_csv_up.is_error_list_empty() %} + {% if not mainte_csv_up.is_error_message_list_empty() %}
- {% for error in mainte_csv_up.error_list %} - {{error.error_message()}}
+ {% for error in mainte_csv_up.error_message_list %} + {{error.error_message}}
{% endfor %}
- {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_list_empty() %} + {% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %}
件数:{{mainte_csv_up.csv_data_count()}}件
@@ -179,154 +178,6 @@ {% endfor %}
{% endif %} - - - - -

From c7c5eade7b311aea55d45b1f25f950ed2cafae0f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 14:42:28 +0900 Subject: [PATCH 462/962] =?UTF-8?q?fix:=20my.cnf=E3=81=AFgit=E8=BF=BD?= =?UTF-8?q?=E8=B7=A1=E5=AF=BE=E8=B1=A1=E5=A4=96=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/.gitignore | 1 + ecs/jskult-dbdump/my.cnf | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 ecs/jskult-dbdump/my.cnf diff --git a/ecs/jskult-dbdump/.gitignore b/ecs/jskult-dbdump/.gitignore index bd0b37f8..cf44449e 100644 --- a/ecs/jskult-dbdump/.gitignore +++ b/ecs/jskult-dbdump/.gitignore @@ -1,5 +1,6 @@ .vscode/settings.json .env +my.cnf # python __pycache__ diff --git a/ecs/jskult-dbdump/my.cnf b/ecs/jskult-dbdump/my.cnf deleted file mode 100644 index 8bdb2c20..00000000 --- a/ecs/jskult-dbdump/my.cnf +++ /dev/null @@ -1,4 +0,0 @@ -[client] -user=root -password=admin -host=localhost \ No newline at end of file From 268282486378eb456d639ac8d6510b0e70014aca Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 14:46:46 +0900 Subject: [PATCH 463/962] =?UTF-8?q?feat:=20Docker=E3=82=A4=E3=83=A1?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=81=A7mysql-client=208.x=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/Dockerfile | 38 ++++++++++++++-------- ecs/jskult-dbdump/mysql_dpkg_selection.txt | 3 ++ 2 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 ecs/jskult-dbdump/mysql_dpkg_selection.txt diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile index f87a7215..1d1a865e 100644 --- a/ecs/jskult-dbdump/Dockerfile +++ b/ecs/jskult-dbdump/Dockerfile @@ -1,28 +1,40 @@ -FROM python:3.9 +FROM python:3.9-bullseye ENV TZ="Asia/Tokyo" WORKDIR /usr/src/app COPY Pipfile Pipfile.lock ./ +# apt mysqlパッケージのdpkg次のコマンド注入用 +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# # mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.25-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール RUN \ - apt update -y && \ - # パッケージのセキュリティアップデートのみを適用するコマンド - apt install -y unattended-upgrades && \ - unattended-upgrades && \ pip install --upgrade pip wheel setuptools && \ pip install pipenv --no-cache-dir && \ pipenv install --system --deploy && \ pip uninstall -y pipenv virtualenv-clone virtualenv -# mysql-clientと必要なパッケージインストール -RUN apt install -y less vim curl unzip sudo default-mysql-client - -# aws cli v2 のインストール -RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" -RUN unzip awscliv2.zip -RUN sudo ./aws/install +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades COPY src ./src -COPY entrypoint.py entrypoint.py +COPY entrypoint.py entrypoint.py CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-dbdump/mysql_dpkg_selection.txt b/ecs/jskult-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/jskult-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file From dbfe62e30b7588024c8cf23527cabde4854230d6 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 16:31:14 +0900 Subject: [PATCH 464/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=83=BC=E3=82=AB?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=82=B9=E3=83=88=E3=83=AC=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=82=92=E7=B5=8C=E7=94=B1=E3=81=9B=E3=81=9A=E3=80=81=E3=83=91?= =?UTF-8?q?=E3=82=A4=E3=83=97=E3=83=A9=E3=82=A4=E3=83=B3=E3=81=AE=E3=81=BF?= =?UTF-8?q?=E3=81=A7=E5=AE=9F=E8=A1=8C=E3=80=82=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0=E3=81=AF?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E3=81=A7=E3=81=8D=E3=81=A6=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 80 ++++++++++++------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 1f821456..dcc02211 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -1,17 +1,17 @@ """日次バッチ処理前DBダンプ取得""" import datetime -import textwrap -import subprocess import os -from src.system_var import environment +import subprocess +import textwrap + +from src.batch.batch_functions import (get_batch_statuses, + update_dump_status_kbn_in_complete, + update_dump_status_kbn_in_error, + update_dump_status_kbn_in_processing) from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger -from src.system_var import constants -from src.batch.batch_functions import ( - get_batch_statuses, update_dump_status_kbn_in_processing, - update_dump_status_kbn_in_complete, update_dump_status_kbn_in_error) -import gzip +from src.system_var import constants, environment logger = get_logger('日次バッチ処理前DBダンプ取得') @@ -23,7 +23,7 @@ def exec(): # 日次バッチ処置中フラグ、dump処理状態区分を取得 batch_processing_flag, dump_status_kbn = get_batch_statuses() except BatchOperationException as e: - logger.exception(f'日次ジョブ取得エラー(異常終了)\n{e}') + logger.exception(f'日次ジョブ取得エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS # 日次バッチ処理中の場合、処理は行わない @@ -40,7 +40,7 @@ def exec(): try: update_dump_status_kbn_in_processing() except BatchOperationException as e: - logger.exception(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了){e}') + logger.exception(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS # MySQL接続情報を作成する @@ -51,7 +51,7 @@ def exec(): host={environment.DB_HOST} """ # my.cnfファイルのパス - my_cnf_path = os.path.join('.', 'my.cnf') + my_cnf_path = os.path.join('my.cnf') # my.cnfファイルを生成する with open(my_cnf_path, 'w') as f: @@ -62,39 +62,37 @@ def exec(): file_name = f'backup_rds_src05_{converted_value}.gz' s3_file_name = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{file_name}' - mysqldump_cmd = [ - 'mysqldump', - '--user={mysql_user}'.format(mysql_user=environment.DB_USERNAME), - '--password={db_pw}'.format(db_pw=environment.DB_PASSWORD), - '--host={db_host}'.format(db_host=environment.DB_HOST), - '--port={db_port}'.format(db_port=environment.DB_PORT), - '--no-tablespaces', - '--skip-column-statistics', - '--single-transaction', - '--set-gtid-purged=OFF', - '{db_name}'.format(db_name=environment.DB_SCHEMA) + # 'mysqldump --login-path=dwhadmin --no-tablespaces --skip-column-statistics --single-transaction --set-gtid-purged=OFF dwh > /data/mountdwh/backup/%s/before/' + # mysqldumpコマンドを実行する + command = [ + 'mysqldump', + f'--defaults-file={my_cnf_path}', + '-P', + f"{environment.DB_PORT}", + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', + environment.DB_SCHEMA + # 'src05' ] - # mysqldumpコマンドを実行してデータを標準出力に出力 - mysqldump_output = subprocess.check_output(mysqldump_cmd) - - # gzipで圧縮 - compressed_data = gzip.compress(mysqldump_output) - - # AWS CLIを使ってS3にアップロード - aws_cli_cmd = [ - 'aws', - 's3', - 'cp', - '-', - s3_file_name - ] - subprocess.run(aws_cli_cmd, input=compressed_data) - + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gzipコマンドを実行してdump結果を圧縮する + gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # aws s3 cpコマンドを実行してアップロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + # 出力を取得する + mysqldump_process.stdout.close() + gzip_process.stdout.close() + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + print("Error: ", error.decode("utf-8")) + raise Exception('Error') # dump処理状態区分を正常終了に更新 try: update_dump_status_kbn_in_complete() except BatchOperationException as e: - logger.exception(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了)\n{e}') + logger.exception(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS # 正常終了を保守ユーザーに通知 @@ -106,7 +104,7 @@ def exec(): try: update_dump_status_kbn_in_error() except BatchOperationException as e: - logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了)\n{e}') + logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') raise constants.BATCH_EXIT_CODE_SUCCESS - logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました \n{e}') + logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました :{e}') raise e From 0b19ba8e04bdd7cc790be65595b77eabac3c52e4 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 17:03:13 +0900 Subject: [PATCH 465/962] =?UTF-8?q?feat:=20=E5=90=84=E3=82=B3=E3=83=9E?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=81=94=E3=81=A8=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 27 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index dcc02211..dc688f69 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -62,8 +62,7 @@ def exec(): file_name = f'backup_rds_src05_{converted_value}.gz' s3_file_name = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{file_name}' - # 'mysqldump --login-path=dwhadmin --no-tablespaces --skip-column-statistics --single-transaction --set-gtid-purged=OFF dwh > /data/mountdwh/backup/%s/before/' - # mysqldumpコマンドを実行する + # mysqldumpコマンドを実行し、dumpを取得する command = [ 'mysqldump', f'--defaults-file={my_cnf_path}', @@ -81,22 +80,32 @@ def exec(): gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # aws s3 cpコマンドを実行してアップロードする s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout, stderr=subprocess.PIPE) - # 出力を取得する + # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする mysqldump_process.stdout.close() + # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする gzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = mysqldump_process.communicate() + if mysqldump_process.returncode != 0: + raise BatchOperationException(error.decode('utf-8')) + + _, error = gzip_process.communicate() + if gzip_process.returncode != 0: + raise BatchOperationException(error.decode('utf-8')) + _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: - print("Error: ", error.decode("utf-8")) - raise Exception('Error') - # dump処理状態区分を正常終了に更新 + raise BatchOperationException(error.decode('utf-8')) + + # # dump処理状態区分を正常終了に更新 try: update_dump_status_kbn_in_complete() except BatchOperationException as e: logger.exception(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS - # 正常終了を保守ユーザーに通知 - logger.info('[NOTICE]日次バッチ処理前DBダンプ取得:終了(正常終了)') + logger.info('日次バッチ処理前DBダンプ取得:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: @@ -105,6 +114,6 @@ def exec(): update_dump_status_kbn_in_error() except BatchOperationException as e: logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') - raise constants.BATCH_EXIT_CODE_SUCCESS + raise e logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました :{e}') raise e From a108f20a21860a6f6ce1c16569ee2795dab57a7d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 17:06:39 +0900 Subject: [PATCH 466/962] =?UTF-8?q?feat:=20DB=E6=8E=A5=E7=B6=9A=E3=83=AA?= =?UTF-8?q?=E3=83=88=E3=83=A9=E3=82=A4=E6=99=82=E3=81=ABRetry=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=8C=E8=BF=94=E3=81=95=E3=82=8C=E3=80=81?= =?UTF-8?q?=E6=8D=95=E7=B8=9B=E3=81=A7=E3=81=8D=E3=81=A6=E3=81=84=E3=81=AA?= =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/db/database.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-dbdump/src/db/database.py b/ecs/jskult-dbdump/src/db/database.py index f67a21b9..67f5c5a5 100644 --- a/ecs/jskult-dbdump/src/db/database.py +++ b/ecs/jskult-dbdump/src/db/database.py @@ -74,7 +74,9 @@ class Database: min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) def connect(self): """ DBに接続します。接続に失敗した場合、リトライします。 From 51955c7a8491c46959fcf0a1150db79b06dbbd71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Jul 2023 17:25:33 +0900 Subject: [PATCH 467/962] =?UTF-8?q?feat:=20=E4=B8=8D=E8=A6=81=E5=AE=9A?= =?UTF-8?q?=E6=95=B0=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 39 +++++++------------ .../view/inst_emp_csv_upload_view_model.py | 14 ++----- .../src/services/master_mainte_service.py | 7 ++-- ecs/jskult-webapp/src/system_var/constants.py | 14 ++++--- 4 files changed, 31 insertions(+), 43 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 4400c318..fd77af95 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -178,15 +178,11 @@ class MasterMainteCSVItem(metaclass=ABCMeta): class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): """新規施設担当者登録CSV""" - # inst_cd: str # a - inst_name: str # b - # ta_cd: str # c - # emp_cd: str # d - emp_name_family: str # e - emp_name_first: str # f - # bu_cd: str # g - start_date: str # h - end_date: str # i + inst_name: str + emp_name_family: str + emp_name_first: str + start_date: str + end_date: str def __init__( self, @@ -298,20 +294,16 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): """施設担当者変更登録CSV""" - # bu_cd: str # a - bu_name: str # b - org_cd: str # c - org_short_name: str # d - # inst_cd: str # e - inst_name: str # f - # ta_cd: str # g - explain: str # h - # emp_cd: str # i - emp_full_name: str # j - inst_emp_start_date: str # k - inst_emp_end_date: str # l - change_end_date: str # m - comment: str # n + bu_name: str + org_cd: str + org_short_name: str + inst_name: str + explain: str + emp_full_name: str + inst_emp_start_date: str + inst_emp_end_date: str + change_end_date: str + comment: str def __init__( self, @@ -332,7 +324,6 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) - self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] self.bu_name = self.csv_row[constants.CSV_CHANGE_BU_NAME_COL_NO] self.org_cd = self.csv_row[constants.CSV_CHANGE_ORG_CD_COL_NO] 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 index 1cd0157c..f9bbc0e9 100644 --- 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 @@ -20,7 +20,7 @@ class InstEmpCsvUploadViewModel(BaseModel): dialog_msg: Optional[str] def select_function_message(self): - return self.__new_inst_emp() if self.select_function == 'new' else self.__change_inst_emp() + return '新規施設登録' if self.select_function == 'new' else '施設担当者変更' def select_table_message(self): return self.__dummy_table() if self.select_table == 'dummy' else self.__real_table() @@ -47,16 +47,8 @@ class InstEmpCsvUploadViewModel(BaseModel): return constants.CHANGE_INST_EMP_MAP return [] - # 定数にした方が良さそう - def __real_table(self): - return '本番テーブル' + return constants.CSV_REAL_TABLE_NAME def __dummy_table(self): - return 'ダミーテーブル' - - def __new_inst_emp(self): - return '新規施設登録' - - def __change_inst_emp(self): - return '施設担当者変更' + return constants.CSV_CHANGE_TABLE_NAME diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 4ca8f624..3d0d24f9 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -16,6 +16,7 @@ from src.repositories.mst_inst_repository import MstInstRepository from src.repositories.bu_master_cd_repository import BuMasterRepository from src.repositories.emp_master_repository import EmpMasterRepository from src.repositories.emp_chg_inst_repository import EmpChgInstRepository +from src.system_var import constants logger = get_logger('マスターメンテ') @@ -45,7 +46,7 @@ class MasterMainteService(BaseService): csv_file_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: - if csv_upload_form.select_function != 'new' and csv_upload_form.select_function == 'change': + if csv_upload_form.select_function != 'new' and csv_upload_form.select_function != 'change': raise Exception(f'機能の選択値が不正です: {csv_upload_form.select_function}') if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') @@ -127,10 +128,10 @@ class MasterMainteService(BaseService): def __target_table(self, select_table: str): if select_table == 'dummy': table_name = 'src05.emp_chg_inst_wrk' - selected_table_msg = 'ダミーテーブル' + selected_table_msg = constants.CSV_CHANGE_TABLE_NAME elif select_table == 'real': table_name = 'src05.emp_chg_inst' - selected_table_msg = '本番テーブル' + selected_table_msg = constants.CSV_REAL_TABLE_NAME else: raise Exception(f'登録テーブルの選択値が不正です: {select_table}') return (table_name, selected_table_msg) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 27d07283..7e30e7f5 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -164,7 +164,7 @@ CHANGE_INST_EMP_MAP = [ 'コメント' # N ] -# 新規施設担当者登録CSV +# 新規施設担当者登録CSV(マスターメンテ) # 施設コードの列No CSV_NEW_INST_CD_COL_NO = 0 # 施設名の列No @@ -184,7 +184,7 @@ CSV_NEW_START_DATE = 7 # 適用終了日の列No CSV_NEW_END_DATE = 8 -# 施設担当者変更登録CSV +# 施設担当者変更登録CSV(マスターメンテ) # ビジネスユニットコードの列No CSV_CHANGE_BU_CD_COL_NO = 0 # ビジネスユニット名の列No @@ -214,6 +214,10 @@ CSV_CHANGE_CHANGE_END_DATE_COL_NO = 12 # コメントの列No CSV_CHANGE_COMMENT = 13 -# CSVの列数 -CSV_NEW_COL_COUNT = 9 -CSV_CHANGE_COL_COUNT = 14 +# CSVアップロードの列数(マスターメンテ) +CSV_NEW_COL_COUNT = 9 # 新規施設担当者登録CSV +CSV_CHANGE_COL_COUNT = 14 # 施設担当者変更登録CSV + +# CSVアップロードテーブル名(マスターメンテ) +CSV_REAL_TABLE_NAME = '本番テーブル' +CSV_CHANGE_TABLE_NAME = 'ダミーテーブル' From 2493e8e06439add2ab7bef4cf2ca78f50939e400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Jul 2023 17:31:07 +0900 Subject: [PATCH 468/962] =?UTF-8?q?feat:=20develop=E3=83=9E=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E5=89=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/system_var/constants.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 7e30e7f5..200e4dcd 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -148,20 +148,20 @@ NEW_INST_EMP_CSV_MAP = [ ] CHANGE_INST_EMP_MAP = [ - 'ビジネスユニットコード', # A - 'ビジネスユニット名', # B - '組織コード', # C - '組織名略称', # D - '施設コード', # E - '施設名', # F - '領域コード', # G - '説明', # H - 'MUID', # I - '担当者名', # J - '施設担当_開始日', # K - '施設担当_終了日', # L - '終了日の変更', # M - 'コメント' # N + 'ビジネスユニットコード', + 'ビジネスユニット名', + '組織コード', + '組織名略称', + '施設コード', + '施設名', + '領域コード', + '説明', + 'MUID', + '担当者名', + '施設担当_開始日', + '施設担当_終了日', + '終了日の変更', + 'コメント' ] # 新規施設担当者登録CSV(マスターメンテ) From c87bee4e9ad40213fefc6f376f86c8ddcd2cbb8a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 17:44:30 +0900 Subject: [PATCH 469/962] =?UTF-8?q?feat:=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0=E3=81=AE?= =?UTF-8?q?=E3=82=84=E3=82=8A=E6=96=B9=E3=82=92=E7=B5=B1=E4=B8=80=E3=80=82?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/Dockerfile | 4 ++-- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile index 1d1a865e..9c6838cb 100644 --- a/ecs/jskult-dbdump/Dockerfile +++ b/ecs/jskult-dbdump/Dockerfile @@ -4,12 +4,12 @@ ENV TZ="Asia/Tokyo" WORKDIR /usr/src/app COPY Pipfile Pipfile.lock ./ -# apt mysqlパッケージのdpkg次のコマンド注入用 +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー COPY mysql_dpkg_selection.txt ./ # 必要なパッケージインストール RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release -# # mysqlをインストール +# mysqlをインストール RUN \ wget https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb && \ dpkg -i mysql-apt-config_0.8.25-1_all.deb < mysql_dpkg_selection.txt && \ diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index dc688f69..964c34e8 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -88,17 +88,20 @@ def exec(): # パイプラインを実行し、エラーハンドリング _, error = mysqldump_process.communicate() if mysqldump_process.returncode != 0: - raise BatchOperationException(error.decode('utf-8')) + logger.error(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS _, error = gzip_process.communicate() if gzip_process.returncode != 0: - raise BatchOperationException(error.decode('utf-8')) + logger.error(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: - raise BatchOperationException(error.decode('utf-8')) + logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS - # # dump処理状態区分を正常終了に更新 + # dump処理状態区分を正常終了に更新 try: update_dump_status_kbn_in_complete() except BatchOperationException as e: From 1ae009115d6258593741b9eb9102e2cec1007087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 11 Jul 2023 18:02:52 +0900 Subject: [PATCH 470/962] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 964c34e8..02b8da84 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -23,17 +23,17 @@ def exec(): # 日次バッチ処置中フラグ、dump処理状態区分を取得 batch_processing_flag, dump_status_kbn = get_batch_statuses() except BatchOperationException as e: - logger.exception(f'日次ジョブ取得エラー(異常終了):{e}') + logger.exception(f'日付テーブル取得エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS # 日次バッチ処理中の場合、処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: - logger.error('日次ジョブ処理中エラー(異常終了)') + logger.error('日次バッチ処理中の為、処理を終了') return constants.BATCH_EXIT_CODE_SUCCESS # dump処理状態区分が処理中またはエラーの場合、処理は行わない if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED or dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: - logger.error('dump処理状態区分エラー(異常終了)') + logger.error(f'dump処理状態区分が実行不可な状態の為、処理を終了 dump処理状態区分={dump_status_kbn}') return constants.BATCH_EXIT_CODE_SUCCESS # dump処理状態区分を処理中に更新 @@ -73,7 +73,6 @@ def exec(): '--single-transaction', '--set-gtid-purged=OFF', environment.DB_SCHEMA - # 'src05' ] mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # gzipコマンドを実行してdump結果を圧縮する @@ -117,6 +116,6 @@ def exec(): update_dump_status_kbn_in_error() except BatchOperationException as e: logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') - raise e + return constants.BATCH_EXIT_CODE_SUCCESS logger.exception(f'日次バッチ処理前DBダンプ取得中に想定外のエラーが発生しました :{e}') - raise e + return constants.BATCH_EXIT_CODE_SUCCESS From eb1ccebbacc511b746de1902f0b44894962df39a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 18:13:59 +0900 Subject: [PATCH 471/962] =?UTF-8?q?fix:=20DB=E6=8E=A5=E7=B6=9A=E3=81=AE?= =?UTF-8?q?=E3=83=AA=E3=83=88=E3=83=A9=E3=82=A4=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E6=99=82=E3=81=AE=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=81=8C=E6=AD=A3=E3=81=97=E3=81=8F=E3=81=AA=E3=81=8B?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81=E3=80=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/db/database.py | 4 +++- ecs/jskult-batch-monthly/src/db/database.py | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/db/database.py b/ecs/jskult-batch-daily/src/db/database.py index 03c9c068..280a9d8b 100644 --- a/ecs/jskult-batch-daily/src/db/database.py +++ b/ecs/jskult-batch-daily/src/db/database.py @@ -83,7 +83,9 @@ class Database: min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) def connect(self): """ DBに接続します。接続に失敗した場合、リトライします。\n diff --git a/ecs/jskult-batch-monthly/src/db/database.py b/ecs/jskult-batch-monthly/src/db/database.py index f67a21b9..d2171fb5 100644 --- a/ecs/jskult-batch-monthly/src/db/database.py +++ b/ecs/jskult-batch-monthly/src/db/database.py @@ -1,11 +1,10 @@ from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, create_engine, text) from sqlalchemy.engine.url import URL -from tenacity import retry, stop_after_attempt, wait_exponential - from src.error.exceptions import DBException from src.logging.get_logger import get_logger from src.system_var import environment +from tenacity import retry, stop_after_attempt, wait_exponential logger = get_logger(__name__) @@ -74,7 +73,9 @@ class Database: min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) def connect(self): """ DBに接続します。接続に失敗した場合、リトライします。 From 19901bf80e68c890f6176f8ef95878e214fa0b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Jul 2023 18:15:27 +0900 Subject: [PATCH 472/962] =?UTF-8?q?feat:=20=E3=83=AA=E3=83=9D=E3=82=B8?= =?UTF-8?q?=E3=83=88=E3=83=AA=E3=81=A7=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E5=87=BA=E5=8A=9B=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/repositories/bu_master_cd_repository.py | 5 ++++- .../src/repositories/emp_chg_inst_repository.py | 11 +++++++---- .../src/repositories/emp_master_repository.py | 5 ++++- .../src/repositories/mst_inst_repository.py | 11 +++++++---- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py index 62b24de0..36992192 100644 --- a/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py +++ b/ecs/jskult-webapp/src/repositories/bu_master_cd_repository.py @@ -1,5 +1,8 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('ビジネスユニットマスタ') class BuMasterRepository(BaseRepository): @@ -23,7 +26,7 @@ class BuMasterRepository(BaseRepository): return 0 return models[0].count except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index b90ea51c..abcd93ea 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -1,5 +1,8 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('従業員担当施設マスタ') class EmpChgInstRepository(BaseRepository): @@ -66,7 +69,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': update_user_name }) except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e UPDATE_SQL = """\ @@ -94,7 +97,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': update_user_name }) except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e UPDATE_SQL = """\ @@ -121,7 +124,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': update_user_name }) except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e FETCH_COUNT_SQL = """\ @@ -146,7 +149,7 @@ class EmpChgInstRepository(BaseRepository): return 0 return models[0].count except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/emp_master_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py index 631bd643..620e4fee 100644 --- a/ecs/jskult-webapp/src/repositories/emp_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -1,5 +1,8 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('従業員マスタ') class EmpMasterRepository(BaseRepository): @@ -26,7 +29,7 @@ class EmpMasterRepository(BaseRepository): return 0 return models[0].count except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/mst_inst_repository.py b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py index bafcc525..9c92599c 100644 --- a/ecs/jskult-webapp/src/repositories/mst_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/mst_inst_repository.py @@ -1,5 +1,8 @@ from src.repositories.base_repository import BaseRepository from src.model.db.master_mente_count import MasterMenteCountModel +from src.logging.get_logger import get_logger + +logger = get_logger('メルク施設マスタ') class MstInstRepository(BaseRepository): @@ -10,20 +13,20 @@ class MstInstRepository(BaseRepository): FROM src05.mst_inst WHERE - mst_inst.inst_cd = :instcd + mst_inst.inst_cd = :inst_cd """ - def fetch_count(self, instcd) -> MasterMenteCountModel: + def fetch_count(self, inst_cd) -> MasterMenteCountModel: try: self._database.connect() query = self.FETCH_COUNT_SQL - result = self._database.execute_select(query, {'instcd': instcd}) + result = self._database.execute_select(query, {'inst_cd': inst_cd}) models = [MasterMenteCountModel(**r) for r in result] if len(models) == 0: return 0 return models[0].count except Exception as e: - print(f"[ERROR] DB Error : Exception={e.args}") + logger.exception(f"DB Error : Exception={e.args}") raise e finally: self._database.disconnect() From a3624903cf08bcc3612ad0290d5af660f4894924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 11 Jul 2023 18:57:55 +0900 Subject: [PATCH 473/962] =?UTF-8?q?feat:=20=E9=81=A9=E7=94=A8=E6=9C=9F?= =?UTF-8?q?=E9=96=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index fd77af95..c093fe0c 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -203,15 +203,15 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) - self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] # a - self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] # b - self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO] # c - self.emp_cd = self.csv_row[constants.CSV_NEW_EMP_CD_COL_NO] # d - self.emp_name_family = self.csv_row[constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO] # e - self.emp_name_first = self.csv_row[constants.CSV_NEW_EMP_NAME_FIRST_COL_NO] # f - self.bu_cd = self.csv_row[constants.CSV_NEW_BU_CD_COL_NO] # g - self.start_date = self.csv_row[constants.CSV_NEW_START_DATE] # h - self.end_date = self.csv_row[constants.CSV_NEW_END_DATE] # i + self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] + self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] + self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO] + self.emp_cd = self.csv_row[constants.CSV_NEW_EMP_CD_COL_NO] + self.emp_name_family = self.csv_row[constants.CSV_NEW_EMP_NAME_FAMILY_COL_NO] + self.emp_name_first = self.csv_row[constants.CSV_NEW_EMP_NAME_FIRST_COL_NO] + self.bu_cd = self.csv_row[constants.CSV_NEW_BU_CD_COL_NO] + self.start_date = self.csv_row[constants.CSV_NEW_START_DATE] + self.end_date = self.csv_row[constants.CSV_NEW_END_DATE] def csv_row_data(self) -> dict: return {constants.NEW_INST_EMP_CSV_MAP[i]: self.csv_row[i] for i in range(len(self.csv_row))} @@ -442,7 +442,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): end_date, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], end_date_col_name) - if len(error_list) > 0 or self.start_date is None or self.end_date is None: + if len(error_list) > 0 or start_date is None or end_date is None: return error_list if start_date_time > end_date_time: From e27c4f16329987cd0e8dd1e76a39ede1e9e87762 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Tue, 11 Jul 2023 20:35:59 +0900 Subject: [PATCH 474/962] =?UTF-8?q?=E3=82=BF=E3=83=96=E6=95=B0=E7=95=B0?= =?UTF-8?q?=E5=B8=B8=E6=A4=9C=E7=9F=A5=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=81=E3=81=8A=E3=82=88=E3=81=B3=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E5=AE=9F=E8=A3=85?= =?UTF-8?q?=E3=80=80=E2=80=BB=E3=81=BE=E3=81=A0=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=82=E3=82=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 66 +- .../batch/vjsk/vjsk_load/test_vjsk_load.py | 830 ++++++++++++++++-- .../NoData/bio_slip_data_nodatarecord.tsv | 1 + .../testdata/NoData/fcl_mst_nodatarecord.tsv | 1 + .../testdata/NoData/hld_mst_nodatarecord.tsv | 1 + .../NoData/lot_num_mst_nodatarecord.tsv | 1 + .../NoData/mdb_conv_mst_nodatarecord.tsv | 1 + .../NoData/mkr_org_horizon_nodatarecord.tsv | 1 + .../NoData/org_cnv_mst_nodatarecord.tsv | 1 + .../NoData/phm_prd_mst_nodatarecord.tsv | 1 + .../NoData/phm_price_mst_nodatarecord.tsv | 1 + .../NoData/slip_data_nodatarecord.tsv | 1 + .../NoData/stock_slip_data_nodatarecord.tsv | 1 + .../NoData/tran_kbn_mst_nodatarecord.tsv | 1 + .../NoData/vop_hco_merge_nodatarecord.tsv | 1 + .../NoData/whs_customer_mst_nodatarecord.tsv | 1 + .../testdata/NoData/whs_mst_nodatarecord.tsv | 1 + .../bio_slip_data_formaterror.tsv | 5 + .../fcl_mst_formaterror.tsv | 5 + .../hld_mst_formaterror.tsv | 5 + .../lot_num_mst_formaterror.tsv | 5 + .../mdb_conv_mst_formaterror.tsv | 5 + .../mkr_org_horizon_formaterror.tsv | 5 + .../org_cnv_mst_formaterror.tsv | 5 + .../phm_prd_mst_formaterror.tsv | 5 + .../phm_price_mst_formaterror.tsv | 0 .../slip_data_formaterror.tsv | 5 + .../stock_slip_data_formaterror.tsv | 5 + .../tran_kbn_mst_formaterror.tsv | 5 + .../vop_hco_merge_formaterror.tsv | 5 + .../whs_customer_mst_formaterror.tsv | 5 + .../whs_mst_formaterror.tsv | 5 + .../testdata/phm_price_mst_dataerror.tsv | 3 - 33 files changed, 915 insertions(+), 69 deletions(-) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv rename ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/{ => TestFormatErrorFile}/phm_price_mst_formaterror.tsv (100%) create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv create mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv delete mode 100644 ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index cef4e1ec..0cc8a248 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -1,4 +1,6 @@ # from src.batch.vjsk.vjsk_recv_file_manager import VjskDatFile +import os + from src.batch.vjsk.vjsk_recv_file_mapper import VjskReceiveFileMapper from src.db.database import Database from src.error.exceptions import BatchOperationException @@ -63,21 +65,52 @@ class VjskDataLoadManager: def _get_tsv_last_row_tab_count(src_file_name: str) -> int: # memo: tsvファイルが数百MBに及ぶことを想定して、末尾から1行分を参照する # memo: 前提1 行区切りは LF('\n') + # memo: 前提2 正常時のファイル終端にある文字は、末尾行の LF('\n') + # memo: 前提3 ファイルエンコードはBOM付UTF-8(先頭3byteが b'\xEF' + b'\xBB' + b'\xBF' ) buf_count = 0 + # ファイルサイズ取得 + file_size = os.path.getsize(src_file_name) + + # ファイルサイズが0byteなら処理終了 + if file_size == 0: + return buf_count + # バイナリモードでファイルオープン with open(src_file_name, 'rb') as file: - # ファイルの末尾から2バイト手前に移動 - file.seek(-2, 2) - # 改行文字を見つけるまで逆方向に読み進める - while file.read(1) != b'\n': - # 1バイト戻って再度読み込み - file.seek(-2, 1) - # 末尾行を抽出 - last_line = file.readline().decode().rstrip('\n') - # 末尾行に含まれるタブ文字の数を抽出 + # ファイルポインタを末尾に移動 + file.seek(0, os.SEEK_END) + + # ファイルポインタが先頭+1になるまで逆方向にシークする + while file.tell() > 1: + # 2byte戻って + file.seek(-2, os.SEEK_CUR) + # 1byte読む(同時に+1シークする) + char = file.read(1) + # 行区切りを検出したらループ終了 + # memo: UTF-8 バイトシーケンスとして、b'\n' が全角文字の一部にはならない + if char == b'\n': + break + # ファイル先頭のBOMを検出したらループ終了 + if char == b'\xbf': + break + last_line = file.readline().decode('utf-8-sig').rstrip('\n') buf_count = last_line.count('\t') + # # ファイルの末尾から2バイト手前に、シーク位置を移動 + # # memo: 1byte戻るだけだと、直後のread(1)で末尾行のLFを見てしまうので、-2移動 + # file.seek(-2, os.SEEK_END) + # # 改行文字を見つけるまで逆方向に読み進める + # # memo: read(1)することでシーク位置は1byte前に進む + # while file.read(1) != b'\n': + # # シーク位置を1バイト戻って再度読み込み + # # memo: read(1)でシーク位置が1byte進んでいるので、その戻しと合わせて-2移動 + # file.seek(-2, os.SEEK_CUR) + # # 末尾行を抽出 + # last_line = file.readline().decode().rstrip('\n') + # # 末尾行に含まれるタブ文字の数を抽出 + # buf_count = last_line.count('\t') + return buf_count @classmethod @@ -88,13 +121,14 @@ class VjskDataLoadManager: local_file_name = target["src_file_path"] # tsvファイル末尾行のTABの数が総定数と一致しない場合は例外をスロー - # TODO: ↓↓↓developへのマージを優先させたいので、未テストのロジックはコメントアウトする - # tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) - # expect_tabs = mapper.get_file_column_separators(target["condkey"]) - # if tsv_tabs != expect_tabs: - # msg = f"受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした local_file_name: {local_file_name}" - # raise BatchOperationException(msg) - # TODO: ↑↑↑developへのマージを優先させたいので、未テストのロジックはコメントアウトする + tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) + expect_tabs = mapper.get_file_column_separators(target["condkey"]) + if tsv_tabs != expect_tabs: + msg = "受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした" + msg += f" local_file_name: {local_file_name}" + msg += f" 末尾行のtab数: {tsv_tabs}" + msg += f" tab想定数: {expect_tabs}" + raise BatchOperationException(msg) # データベース登録 self._import_to_db(local_file_name, target["condkey"]) diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 2dbe2ef5..70504795 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -1163,56 +1163,6 @@ class TestImportFileToDb: key = f"{receive_folder}/{test_file}" s3_client.delete_object(Bucket=bucket_name, Key=key) - def test_load_data_error(self, mapper): - """ - 観点 - 異常系 : 日付型矛盾のデータ ※製品価格マスタファイルで確認 - 期待値 - 例外が発生する - """ - - # setup - self.batch_context.is_vjsk_stock_import_day = True - - # 処理実行 - target_dict = { - "condkey": mapper.CONDKEY_PHM_PRICE_MST, - "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_dataerror.tsv") - } - - with pytest.raises(BatchOperationException) as e: - VjskDataLoadManager.load(target_dict) - - # 検証 - assert str(e.value).startswith("SQL Error:") > 0 - - # teardown - - def test_load_format_error(self, mapper): - """ - 観点 - 異常系 : tsvファイルが途中で欠落している - 期待値 - 例外が発生する - """ - - # setup - self.batch_context.is_vjsk_stock_import_day = True - - # 処理実行 - target_dict = { - "condkey": mapper.CONDKEY_PHM_PRICE_MST, - "src_file_path": path.join(self.test_file_path_load_individual, "phm_price_mst_formaterror.tsv") - } - - with pytest.raises(BatchOperationException) as e: - VjskDataLoadManager.load(target_dict) - - # 検証 - assert str(e.value).startswith("LOAD文実行時にWARNINGが発生しました。") > 0 - - # teardown - def test_s3backup_ok(self, s3_client, bucket_name, receive_folder, mapper): """ 観点 @@ -1293,3 +1243,783 @@ class TestImportFileToDb: assert str(e.value) == "An error occurred (404) when calling the HeadObject operation: Not Found" # teardown + + def test_load_format_error_01(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "stock_slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_02(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_03(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "org_cnv_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_04(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "vop_hco_merge_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_05(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "whs_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_06(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "hld_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_07(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "fcl_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_08(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "mkr_org_horizon_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_09(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "tran_kbn_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_10(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "phm_prd_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_11(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "phm_price_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_12(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "whs_customer_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_13(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "mdb_conv_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_14(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "bio_slip_data_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_format_error_15(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "TestFormatErrorFile", "lot_num_mst_formaterror.tsv") + } + + with pytest.raises(BatchOperationException) as e: + VjskDataLoadManager.load(target_dict) + + # 検証 + assert str(e.value).startswith("受領tsvファイルの末尾行のTABの数が総定数と一致しませんでした") > 0 + + # teardown + print(e) + + def test_load_no_data_ok_01(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_STOCK_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "stock_slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_02(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_03(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_ORG_CNV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "org_cnv_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_04(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_VOP_HCO_MERGE, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "vop_hco_merge_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_05(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "whs_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_06(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_HLD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "hld_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_07(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_FCL_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "fcl_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_08(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MKR_ORG_HORIZON, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "mkr_org_horizon_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_09(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_TRAN_KBN_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "tran_kbn_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_10(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRD_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "phm_prd_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_11(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_PHM_PRICE_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "phm_price_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_12(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_WHS_CUSTOMER_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "whs_customer_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_13(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_MDB_CONV_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "mdb_conv_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_14(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_BIO_SLIP_DATA, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "bio_slip_data_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown + + def test_load_no_data_ok_15(self, mapper): + """ + 観点 + 異常系 : tsvファイルが途中で欠落している + 期待値 + 例外が発生する + """ + + # setup + self.batch_context.is_vjsk_stock_import_day = True + + # 処理実行 + target_dict = { + "condkey": mapper.CONDKEY_LOT_NUM_MST, + "src_file_path": path.join(self.test_file_path_load_individual, + "NoData", "lot_num_mst_nodatarecord.tsv") + } + + VjskDataLoadManager.load(target_dict) + + # 検証 + assert True + + # teardown diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv new file mode 100644 index 00000000..e2dccedb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/bio_slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv new file mode 100644 index 00000000..ccd44bbd --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/fcl_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv new file mode 100644 index 00000000..27e3a2b4 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/hld_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv new file mode 100644 index 00000000..73c23a1f --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/lot_num_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv new file mode 100644 index 00000000..d8868820 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mdb_conv_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv new file mode 100644 index 00000000..afd4d124 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/mkr_org_horizon_nodatarecord.tsv @@ -0,0 +1 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv new file mode 100644 index 00000000..a4c52b43 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/org_cnv_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv new file mode 100644 index 00000000..a9ce545e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_prd_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv new file mode 100644 index 00000000..362c753c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/phm_price_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv new file mode 100644 index 00000000..8957ebc7 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv new file mode 100644 index 00000000..4dcd83cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/stock_slip_data_nodatarecord.tsv @@ -0,0 +1 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv new file mode 100644 index 00000000..67a2ed3d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/tran_kbn_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv new file mode 100644 index 00000000..e707d5cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/vop_hco_merge_nodatarecord.tsv @@ -0,0 +1 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv new file mode 100644 index 00000000..dc76587c --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_customer_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv new file mode 100644 index 00000000..6f760e14 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/NoData/whs_mst_nodatarecord.tsv @@ -0,0 +1 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv new file mode 100644 index 00000000..0b359d23 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/bio_slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rec_hsdnYmd_wrk" "rec_hsdnYmd_srk" "rec_urag_no" "rec_comm_nm" "rec_nnskFcl_nm" "rec_nnsk_fcl_addr" "rec_lot_num1" "rec_amt1" "rec_lot_num2" "rec_amt2" "rec_lot_num3" "rec_amt3" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_nm" "fcl_kn" "fcl_addr_v" "comm_cd" "comm_nm" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "amt1" "amt2" "amt3" "slip_org_kbn" "bef_slip_mgt_no" "whs_rep_comm_nm" "whs_rep_nnskFcl_nm" "whs_rep_nnsk_fcl_addr" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D452960211JD1111311102503851400002304016427519111 496350122バベンチオテンテキ200MG 1V ソウゴウメデイカルニホンコウカンビツクバシ タカサキ 753 BAVB007 000003 000000 000000 " "296" "02" "11JD11113111025" "0385140000" "496350122" "111" "230401" "20230401" "6427519" "バベンチオテンテキ200MG 1V " "ソウゴウメデイカルニホンコウカンビ" "ツクバシ タカサキ 753 " "BAVB007 " "000003" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000126" "129" "20230401" "202305082041" "110" "売上" "11JD" "300001370" "川崎南支店" "" "200000007" "アルフレッサ株式会社" "0385140000" "670235967013012526" "医療法人社団こうかん会 日本鋼管病院" "イリョウホウジンシャダンコウカンカイ ニホンコウカンビョウイン" "210-0852 神奈川県川崎市川崎区鋼管通1−2−1" "496350122" "バベンチオ 注射剤 200mg 1VIAL" "" "1" "" "3" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211G11111377452402930640002304016433215111 496300127ゴナ-ルエフヒカチユウペン450 1トウ セコム)オギクボビヨウイン トウキヨウト シブヤク ジングウマエ 1-5-1 GF4C001 000002 000000 000000 " "296" "02" "11G111113774524" "0293064000" "496300127" "111" "230401" "20230401" "6433215" "ゴナ-ルエフヒカチユウペン450 1トウ " "セコム)オギクボビヨウイン " "トウキヨウト シブヤク ジングウマエ 1-5-1 " "GF4C001 " "000002" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000127" "130" "20230401" "202305082041" "110" "売上" "11G1" "300001351" "杉並・中野支店" "" "200000007" "アルフレッサ株式会社" "0293064000" "670234652241314835" "医療法人財団荻窪病院 荻窪病院" "イリョウホウジンザイダンオギクボビョウイン オギクボビョウイン" "167-0035 東京都杉並区今川3−1−24" "496300127" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "1" "" "2" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211V11121120604204799500002304016461276111 496300134ゴナ-ルエフヒカチユウペン900 1トウ ニチイサ-ビスキユウシユウフクオカサンフクオカシ サワラク モモチハマ 1-7-5 7F GF9C002 000010 000000 000000 " "296" "02" "11V111211206042" "0479950000" "496300134" "111" "230401" "20230401" "6461276" "ゴナ-ルエフヒカチユウペン900 1トウ " "ニチイサ-ビスキユウシユウフクオカサン" "フクオカシ サワラク モモチハマ 1-7-5 7F " "GF9C002 " "000010" " " "000000" " " "000000" "20230403" "J" "VJSK-BIO_J_MERCK_2023040300.txt" "J2023040300000128" "131" "20230401" "202305082041" "110" "売上" "11V1" "300001491" "福岡第一支店" "" "200000007" "アルフレッサ株式会社" "0479950000" "670235883412145206" "医療法人社団高邦会 福岡山王病院" "イリョウホウジンシャダンコウホウカイ フクオカサンノウビョウイン" "814-0001 福岡県福岡市早良区百道浜3−6−45" "496300134" "ゴナールエフ 皮下注ペン 900IU 1PEN" "" "1" "" "10" "0" "0" "J" "" "" "" "" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202304" "" "" "0" "23-04-03 20:42:11" "system" +"D452960211JB1121309300202875030002304016523689111 496300127ゴナ-ルエフヒカチユウペン450 1トウ イツカンドウヤツキヨク0561 カワサキシ アサオク フルサワ 172-1 GF4C001 000001 000000 000000 " "296" "02" "11JB11213093002" "02875 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv new file mode 100644 index 00000000..0125ec7d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/fcl_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"fcl_cd" "sub_no" "start_dt" "end_dt" "closed_dt" "nm" "kn_nm" "sht_nm" "sht_kn_nm" "mkr_cd" "jsk_proc_kbn" "fmt_addr" "fmt_kn_addr" "post_cd" "prft_cd" "prft_nm" "city_nm" "addr_line_1" "tel_no" "admin_kbn" "fcl_type" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229430760653825" "0" "20000101" "99991231" "" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "駅前町歯科診療所" "エキマエチョウシカシンリョウジョ" "" "0" "700-0023 岡山県岡山市北区駅前町1−6−20" "オカヤマケン オカヤマシキタク エキマエチョウ1-6-20" "700-0023" "33" "岡山県" "岡山市北区" "駅前町1−6−20" "0862236468" "33101" "30" "1" "" "" +"670229435466662922" "0" "20000101" "99991231" "" "医療法人社団仁卓会 ほりかわ歯科クリニック" "イリョウホウジンシャダンジンタクカイ ホリカワシカクリニック" "ほりかわ歯科クリニック (医社)" "ホリカワシカクリニック (イシャ)" "" "0" "675-0101 兵庫県加古川市平岡町新在家1573−1−4F" "ヒョウゴケン カコガワシ ヒラオカチョウシンザイケ1573-1-4F" "675-0101" "28" "兵庫県" "加古川市" "平岡町新在家1573−1−4F" "0794244617" "28210" "30" "1" "" "" +"670229435785430019" "0" "20000101" "99991231" "" "株式会社コミュニティメディカル なつめ薬局 千歳船橋店" "カブシキガイシャコミュニティメディカル ナツメヤッキョク チトセフナバシテン" "なつめ薬局 千歳船橋店 (株)" "ナツメヤッキョク チトセフナバシテン (カ)" "" "0" "156-0054 東京都世田谷区桜丘2−24−2" "トウキョウト セタガヤク サクラガオカ2-24-2" "156-0054" "13" "東京都" "世田谷区" "桜丘2−24−2" "0364136189" "13112" "20" "1" "" "" +"670229447437206529" "0" "20000101" "20230407" "2023-04-07" "ヒカリ薬局" "ヒカリヤッキョク" "ヒカリ薬局" "ヒカリヤッキョク" "" "0" "670-0955 兵庫県 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv new file mode 100644 index 00000000..9060a7da --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/hld_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_hld_cd" "sub_no" "nm" "kn_nm" "sht_nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "卸ホールディングス名01-1" "オロシホールディングスメイ01-1" "卸名01-1" "20230101" "99991231" "1" "0" "23-05-09 12:00:01" "23-05-09 13:00:01" +"10001" "2" "卸ホールディングス名01-2" "オロシホールディングスメイ01-2" "卸名01-2" "20230102" "99991231" "1" "0" "23-05-09 12:00:02" "23-05-09 13:00:02" +"10001" "3" "卸ホールディングス名01-3" "オロシホールディングスメイ01-3" "卸名01-3" "20230103" "99991231" "1" "0" "23-05-09 12:00:03" "23-05-09 13:00:03" +"10001" "4" "卸ホールディングス名01-4" "オロシホールディングスメイ01-4" "卸 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv new file mode 100644 index 00000000..6978f030 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/lot_num_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"ser_no" "lot_num" "expr_dt" "frst_mov_dt" "ins_dt" "ins_usr" +"F0110601" "BAVA001" "20230331" "20210510" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA002" "20230331" "20210615" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA003" "20231031" "20210719" "23-05-08 20:40:41" "batch" +"F0110601" "BAVA004" "2 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv new file mode 100644 index 00000000..5b4d688d --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mdb_conv_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "sub_no" "mdb_cd" "reliability" "start_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"670229780011959315" "1" "003410424" "0" "20020601" "0" "22-03-09 13:56:19" "22-03-09 13:56:19" +"670230081112654862" "0" "004101420" "0" "20000101" "9" "17-10-17 17:06:52" "22-03-09 14:17:34" +"670230081112654862" "1" "004104997" "2" "20000101" "0" "22-03-09 14:17:33" "22-03-09 14:17:33" +"670230100414841865" "0" "003622111" "3" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv new file mode 100644 index 00000000..6f108bcf --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/mkr_org_horizon_formaterror.tsv @@ -0,0 +1,5 @@ +"vid_kind_1" "v_cd_1" "nm_1" "dsp_odr_1" "vid_kind_2" "v_cd_2" "nm_2" "dsp_odr_2" "vid_kind_3" "v_cd_3" "nm_3" "dsp_odr_3" "vid_kind_4" "v_cd_4" "nm_4" "dsp_odr_4" "vid_kind_5" "v_cd_5" "nm_5" "dsp_odr_5" "vid_kind_6" "v_cd_6" "nm_6" "dsp_odr_6" "vid_kind_7" "v_cd_7" "nm_7" "dsp_odr_7" "vid_kind_8" "v_cd_8" "nm_8" "dsp_odr_8" "vid_kind_9" "v_cd_9" "nm_9" "dsp_odr_9" "vid_kind_10" "v_cd_10" "nm_10" "dsp_odr_10" "v_whs_cd" "start_dt" "end_dt" "rec_sts_kbn" "ins_dt" "upd_dt" +"3" "300003202" "その他営業本部卸" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "3" "300003217" "試薬岐阜(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003138" "北関東甲信越営業本部" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "3" "300003195" "首都圏移管組織" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"3" "300003202" "その他営業本部卸" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "3" "300003226" "大垣(回収)" "0" "200000007" "20190401" "99991231" "0" "19-04-11 11:30:59" "23-04-12 17:52:38" +"a" "300003144" "メディカル営業本部1" "1" "b" "300003202" "東海スタッフ医療2" "2" "c" "300003203" "東海スタ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv new file mode 100644 index 00000000..6151cd4e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/org_cnv_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "org_cd" "sub_no" "v_org_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"042" "01" "361007" "0" "300006657" "20230401" "99991231" "0" "0" "23-04-12 11:24:06" "23-04-12 11:24:06" +"042" "01" "381207" "0" "300006658" "20230401" "99991231" "0" "0" "23-04-12 11:24:27" "23-04-12 11:24:27" +"080" "00" "02780" "0" "300006526" "20220401" "99991231" "0" "9" "22-04-11 15:57:35" "23-04-12 10:46:48" +"080" "00" "02780" "1" "300006526" "20220401" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv new file mode 100644 index 00000000..8324689b --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_prd_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"prd_cd" "sub_no" "prd_nm" "prd_e_nm" "mkr_cd" "mkr_inf_1" "mkr_inf_2" "phm_itm_cd" "itm_nm" "itm_sht_nm" "form_cd" "form_nm" "vol_cd" "vol_nm" "cont_cd" "cont_nm" "pkg_cd" "pkg_nm" "cnv_num" "jsk_start_dt" "prd_sale_kbn" "jsk_proc_kbn" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"496201110" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20080101" "20190930" "140" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496201127" "0" "セロフェン 錠剤 50mg 30TAB" "" "F21206A0" "セロフェン 錠 50MG" "SEROPHENE TAB. 50 MG. (30)" "001" "セロフェン" "SP" "F003" "錠剤" "0000" "" "V009" "50mg" "P007" "30TAB" "30" "" "0" "0" "20070401" "20190930" "150" "0" "17-11-08 16:52:41" "19-09-19 11:42:45" +"496300110" "2" "ゴナールエフ 皮下注ペン 300IU 1PEN" "" "F1990608" "ゴナールエフ皮下注ペン 300" "GONAL-F PEN 300IU (1) - JPN" "005" "セロスティム" "ST" "F005" "皮下注ペン" "0000" "" "V017" "300IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "100" "9" "19-04-23 16:35:36" "19-04-23 16:40:38" +"496300127" "2" "ゴナールエフ 皮下注ペン 450IU 1PEN" "" "F19D0608" "ゴナールエフ皮下注ペン450" "Gonalef Pen 450 (1)" "008" "BDマイクロファインプラス" "MF" "F005" "皮下注ペン" "0000" "" "V018" "450IU" "P011" "1PEN" "1" "" "0" "0" "20190501" "20190930" "120" "9" "19-04-23 1 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_price_mst_formaterror.tsv similarity index 100% rename from ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_formaterror.tsv rename to ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/phm_price_mst_formaterror.tsv diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv new file mode 100644 index 00000000..7b4b20b0 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"recvdata" "rec_whs_cd" "rec_whs_sub_cd" "rec_whs_org_cd" "rec_cust_cd" "rec_comm_cd" "rec_tran_kbn" "rev_hsdnYmd_wrk" "rev_hsdnYmd_srk" "rec_urag_no" "rec_amt" "rec_unit_price" "rec_price" "rec_comm_nm" "rec_nnskFcl_nm" "free_item" "rec_nnsk_fcl_addr" "rec_nnsk_fcl_post" "rec_nnsk_fcl_tel" "rec_bef_hsdn_ymd" "rec_bef_slip_no" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "hsdn_ymd" "exec_dt" "v_tran_cd" "tran_kbn_nm" "whs_org_cd" "v_whsOrg_cd" "whs_org_nm" "whs_org_kn" "v_whs_cd" "whs_nm" "nnsk_cd" "fcl_cd" "fcl_kn" "fcl_nm" "fcl_addr_v" "comm_cd" "comm_nm" "nn_amt" "nn_unitPrice" "nn_price" "unit_price" "unit_amt" "drag_price" "drag_amt" "whsPos_err_kbn" "htdnYmd_err_kbn" "prd_exis_kbn" "fcl_exis_kbn" "bef_hsdn_ymd" "bef_slip_no" "slip_org_kbn" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "err_flg11" "err_flg12" "err_flg13" "err_flg14" "err_flg15" "err_flg16" "err_flg17" "err_flg18" "err_flg19" "err_flg20" "kjyo_ym" "tksNbk_kbn" "fcl_exec_kbn" "rec_sts_kbn" "ins_dt" "ins_usr" +"D4420202011611A4 0183733 23030133625911102303 4963500230000020003110000000622000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362591" "000002" "00031100" "0000062200" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000022" "29" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "2" "31100" "62200" "31438" "62876" "35309" "70618" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4420202011611A4 0183733 23030133625921102303 4963500230000080003110000002488000000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vハコダテチユウオウビヨウイン 00000408585ハコダテシホンチヨウ33バン2ゴウ " "202" "02" "011611A4 " "0183733 " "496350023" "110" "230301" "20230301" "3362592" "000008" "00031100" "0000248800" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "ハコダテチユウオウビヨウイン " "0408585ハコダテシホンチヨウ33バン2ゴウ " "ハコダテシホンチヨウ33バン2ゴウ " "0408585" "" "000000" " " "20230222" "J" "VJSK_J_MERCK_2023022" "J2023022200000023" "30" "20230301" "202303142041" "110" "売上" "01161" "300000383" "函館支店" "" "200000016" "株式会社スズケン" "0183733 " "670234934576694289" "シャカイフクシホウジンハコダテコウセイイン ハコダテチュウオウビョウイン" "社会福祉法人函館厚生院 函館中央病院" "040-0011 北海道函館市本町33−2" "496350023" "アービタックス 注射剤 100mg 1VIAL" "8" "31100" "248800" "31438" "251504" "35309" "282472" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311101A8 5140013 23030173719811122303 4963500230000120002738100003285720000000000000000000000 ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1Vトツトリニツセキビヨウイン 00006808517トツトリケントツトリシシヨウトクチヨウ117 " "161" "01" "311101A8 " "5140013 " "496350023" "112" "230301" "20230301" "7371981" "000012" "00027381" "0000328572" "ア-ビタツクスチユウシヤエキ100MG 100MG 20MLX1V" "トツトリニツセキビヨウイン " "6808517トツトリケントツトリシシヨウトクチヨウ117 " "トツトリケントツトリシシヨウトクチヨウ117 " "6808517" "" "000000" " " "20230224" "J" "VJSK_J_MERCK_2023022" "J2023022400000011" "16" "20230301" "202303142041" "110" "売上" "31110" "300000391" "鳥取支店" "" "200000015" "株式会社サンキ" "5140013 " "670237031040828444" "ニホンセキジュウジシャ トットリセキジュウジビョウイン" "日本赤十字社 鳥取赤十字病院" "680-0017 鳥取県鳥取市尚徳町117" "496350023" "アービタックス 注射剤 100mg 1VIAL" "12" "27381" "328572" "31438" "377256" "35309" "423708" "" "" "1" "" "" "" "J" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "202303" "" "" "0" "23-03-14 20:41:26" "SYSTEM" +"D4416101311 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv new file mode 100644 index 00000000..aa3cb22e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/stock_slip_data_formaterror.tsv @@ -0,0 +1,5 @@ +"rec_data" "rec_whs_cd" "rec_whs_sub_cd" "rec_sto_place" "rec_stock_ymd" "rec_comm_cd" "rec_amt" "rev_stok_no_sign" "rev_jan_cd" "rec_free_item" "rec_ymd" "sale_data_cat" "slip_file_nm" "slip_mgt_no" "row_num" "exec_dt" "err_flg1" "err_flg2" "err_flg3" "err_flg4" "err_flg5" "err_flg6" "err_flg7" "err_flg8" "err_flg9" "err_flg10" "rec_sts_kbn" "ins_dt" "ins_usr" +"D463630101 23022849630021900003500000 セトロタイドチユウシヤヨウ0.25MG 1V" "363" "01" "01 " "230228" "496300219" "000035" "0" "0000" " セトロタイドチユウシヤヨウ0.25MG 1V" "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000059" "59" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001270000040000001ゴナールエフヒカチユウペン450 1トウ40 " "253" "01" "026 " "230228" "496300127" "000004" "0" "0000" "01ゴナールエフヒカチユウペン450 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000060" "60" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963001340000220000001ゴナールエフヒカチユウペン900 1トウ40 " "253" "01" "026 " "230228" "496300134" "000022" "0" "0000" "01ゴナールエフヒカチユウペン900 1トウ40 " "20230314" "J" "VJSK-STOCK_J_MERCK_2023031400.txt" "J2023031400000061" "61" "202303142041" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "23-03-14 20:41:57" "SYSTEM" +"D4625301026 2302284963004170000500000001オビドレルヒカチユウシリンジ250MCG 140 " "2 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv new file mode 100644 index 00000000..34692f31 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/tran_kbn_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_tran_cd" "sub_no" "nm" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"10001" "1" "Veeva取引区分名01-1" "20230101" "99991231" "1" "0" "2023-05-09 12:00:01" "2023-05-09 13:00:01" +"10001" "2" "Veeva取引区分名01-2" "20230102" "99991231" "1" "0" "2023-05-09 12:00:02" "2023-05-09 13:00:02" +"10001" "3" "Veeva取引区分名01-3" "20230103" "99991231" "1" "0" "2023-05-09 12:00:03" "2023-05-09 13:00:03" +"10001" "4" "Veeva取引区分名01-4" "20230104" "9 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv new file mode 100644 index 00000000..f4e8956e --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/vop_hco_merge_formaterror.tsv @@ -0,0 +1,5 @@ +"hco_vid__v" "hco_vid__v_merge" "apply_dt" "merge_reason" +"100000001" "900000001" "20230509" "事由01" +"100000002" "900000002" "20230509" "事由02" +"100000003" "900000003" "20230509" "事由03" +"100000004" "900000004" \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv new file mode 100644 index 00000000..0ec0c4cb --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_customer_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"whs_cd" "whs_sub_cd" "customer_cd" "sub_no" "start_dt" "end_dt" "org_cd" "src_org_cd" "nm" "kn_nm" "addr" "kn_addr" "zip_cd" "tel_no" "rec_sts_kbn" "ins_dt" "upd_dt" +"006" "01" "1002900000" "0" "20000101" "99991231" "11" "1131A2283316" "辻内科小児科医院               " "ツジナイカシヨウニカ イイン" "長崎県 佐世保市皆瀬町29                   " "ナガサキケン サセボシカイゼチヨウ 29" "8570144" "0956492319" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1005400000" "0" "20000101" "99991231" "12" "1211C3415515" "医療法人 愛恵会 佐世保愛恵病院       " "イリヨウホウジンアイケイカイサセボアイケイビ" "長崎県 佐世保市瀬戸越4丁目 2−15             " "ナガサキケン サセボシセトゴシ 4チヨウメ 2-15" "8570134" "0956493335" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007200000" "0" "20000101" "99991231" "11" "1131A2407312" "医療法人 山祇診療所             " "イリヨウホウジンヤマズミシンリヨウジヨ" "長崎県 佐世保市山祇町 19−36               " "ナガサキケン サセボシヤマズミチョウ" "8570822" "0956313633" "0" "23-04-14 11:53:14" "23-04-14 11:53:14" +"006" "01" "1007800000" "0" "20000101" "999912 \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv new file mode 100644 index 00000000..82239889 --- /dev/null +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/TestFormatErrorFile/whs_mst_formaterror.tsv @@ -0,0 +1,5 @@ +"v_whs_cd" "sub_no" "nm" "kn_nm" "sht_nm" "zip_cd" "addr" "kn_addr" "tel_no" "v_hld_cd" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" +"200000002" "0" "株式会社モロオ" "カナ01" "モロオ" "1110001" "住所01" "ジュウショ01" "00-0000-0001" "0" "20000101" "99991231" "20" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000005" "0" "岩渕薬品株式会社" "カナ02" "岩渕薬品" "1110002" "住所02" "ジュウショ02" "00-0000-0002" "0" "20000101" "99991231" "50" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000009" "0" "株式会社マルタケ" "カナ03" "マルタケ" "1110003" "住所03" "ジュウショ03" "00-0000-0003" "0" "20000101" "99991231" "90" "0" "16-04-15 16:25:33" "16-04-15 16:25:33" +"200000010" "0" "株式会社ファイネス" "カナ04" "ファイネス" "1110004" "住所04" "ジュ \ No newline at end of file diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv deleted file mode 100644 index 3df124c1..00000000 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/testdata/phm_price_mst_dataerror.tsv +++ /dev/null @@ -1,3 +0,0 @@ -"phm_prd_cd" "phm_price_kind" "sub_no" "price" "start_dt" "end_dt" "dsp_odr" "rec_sts_kbn" "ins_dt" "upd_dt" -"123456701" "01" "1" "12345.6" "yyyy0401" "20190930" "10" "0" "18-03-07 09:48:00" "19-09-19 11:23:47" -"123456701" "02" "1" "12587.8" "20191001" "99991231" "10" "0" "19-09-19 11:24:05" "19-09-19 11:24:05" From c29044873096a87ef03d0546c70274ada88d4299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Jul 2023 10:48:07 +0900 Subject: [PATCH 475/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/README.md | 6 ++-- ecs/jskult-dbdump/entrypoint.py | 2 +- .../src/batch/batch_functions.py | 4 +-- .../src/batch/common/batch_context.py | 29 ------------------- ecs/jskult-dbdump/src/db/database.py | 7 +---- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 13 +++++---- .../src/system_var/environment.py | 2 +- 7 files changed, 15 insertions(+), 48 deletions(-) delete mode 100644 ecs/jskult-dbdump/src/batch/common/batch_context.py diff --git a/ecs/jskult-dbdump/README.md b/ecs/jskult-dbdump/README.md index f6e7c2da..7d8f0ccd 100644 --- a/ecs/jskult-dbdump/README.md +++ b/ecs/jskult-dbdump/README.md @@ -1,8 +1,8 @@ -# 実消化&アルトマーク 月次バッチ +# 日次バッチ処理前DBダンプ取得  ## 概要 -実消化&アルトマークの月次バッチ処理。 +日次バッチ処理前DBダンプ取得処理。 ## 環境情報 @@ -42,7 +42,7 @@ - VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 - 「entrypoint.py」が、バッチ処理のエントリーポイント。 -- 実際の処理は、「src/jobctrl_monthly.py」で行っている。 +- 実際の処理は、「src/jobctrl_dbdump.py」で行っている。 ## フォルダ構成(工事中) diff --git a/ecs/jskult-dbdump/entrypoint.py b/ecs/jskult-dbdump/entrypoint.py index 9a13c457..543cb134 100644 --- a/ecs/jskult-dbdump/entrypoint.py +++ b/ecs/jskult-dbdump/entrypoint.py @@ -1,4 +1,4 @@ -"""実消化&アルトマーク 月次バッチのエントリーポイント""" +"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" from src import jobctrl_dbdump if __name__ == '__main__': diff --git a/ecs/jskult-dbdump/src/batch/batch_functions.py b/ecs/jskult-dbdump/src/batch/batch_functions.py index da329291..87231e17 100644 --- a/ecs/jskult-dbdump/src/batch/batch_functions.py +++ b/ecs/jskult-dbdump/src/batch/batch_functions.py @@ -58,7 +58,7 @@ def update_dump_status_kbn_in_processing() -> None: return -def update_dump_status_kbn_in_error() -> None: +def update_dump_status_kbn_error() -> None: """dump取得状況区分をエラーに更新する Raises: @@ -83,7 +83,7 @@ def update_dump_status_kbn_in_error() -> None: return -def update_dump_status_kbn_in_complete() -> None: +def update_dump_status_kbn_complete() -> None: """dump取得状況区分を正常終了に更新する Raises: diff --git a/ecs/jskult-dbdump/src/batch/common/batch_context.py b/ecs/jskult-dbdump/src/batch/common/batch_context.py deleted file mode 100644 index 8c8c12fb..00000000 --- a/ecs/jskult-dbdump/src/batch/common/batch_context.py +++ /dev/null @@ -1,29 +0,0 @@ -class BatchContext: - __instance = None - __syor_date: str # 処理日(yyyy/mm/dd形式) - __is_arisj_output_day: bool # 月次バッチ起動日フラグ - - def __init__(self) -> None: - self.__is_arisj_output_day = False - - @classmethod - def get_instance(cls): - if cls.__instance is None: - cls.__instance = cls() - return cls.__instance - - @property - def syor_date(self): - return self.__syor_date - - @syor_date.setter - def syor_date(self, syor_date_str: str): - self.__syor_date = syor_date_str - - @property - def is_arisj_output_day(self): - return self.__is_arisj_output_day - - @is_arisj_output_day.setter - def is_arisj_output_day(self, flag: bool): - self.__is_arisj_output_day = flag diff --git a/ecs/jskult-dbdump/src/db/database.py b/ecs/jskult-dbdump/src/db/database.py index 67f5c5a5..ee127d51 100644 --- a/ecs/jskult-dbdump/src/db/database.py +++ b/ecs/jskult-dbdump/src/db/database.py @@ -4,11 +4,8 @@ from sqlalchemy.engine.url import URL from tenacity import retry, stop_after_attempt, wait_exponential from src.error.exceptions import DBException -from src.logging.get_logger import get_logger from src.system_var import environment -logger = get_logger(__name__) - class Database: """データベース操作クラス""" @@ -74,9 +71,7 @@ class Database: min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), - retry_error_cls=DBException - ) + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) def connect(self): """ DBに接続します。接続に失敗した場合、リトライします。 diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 02b8da84..7eba902a 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -6,8 +6,8 @@ import subprocess import textwrap from src.batch.batch_functions import (get_batch_statuses, - update_dump_status_kbn_in_complete, - update_dump_status_kbn_in_error, + update_dump_status_kbn_complete, + update_dump_status_kbn_error, update_dump_status_kbn_in_processing) from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger @@ -28,12 +28,12 @@ def exec(): # 日次バッチ処理中の場合、処理は行わない if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: - logger.error('日次バッチ処理中の為、処理を終了') + logger.error('日次バッチ処理中の為、日次バッチ処理前DBダンプ取得を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS # dump処理状態区分が処理中またはエラーの場合、処理は行わない if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED or dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: - logger.error(f'dump処理状態区分が実行不可な状態の為、処理を終了 dump処理状態区分={dump_status_kbn}') + logger.error(f'ダンプ取得が実行不可能な状態の為、日次バッチ処理前DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') return constants.BATCH_EXIT_CODE_SUCCESS # dump処理状態区分を処理中に更新 @@ -74,6 +74,7 @@ def exec(): '--set-gtid-purged=OFF', environment.DB_SCHEMA ] + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # gzipコマンドを実行してdump結果を圧縮する gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -102,7 +103,7 @@ def exec(): # dump処理状態区分を正常終了に更新 try: - update_dump_status_kbn_in_complete() + update_dump_status_kbn_complete() except BatchOperationException as e: logger.exception(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS @@ -113,7 +114,7 @@ def exec(): except Exception as e: # dump処理状態区分をエラーに更新 try: - update_dump_status_kbn_in_error() + update_dump_status_kbn_error() except BatchOperationException as e: logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-dbdump/src/system_var/environment.py b/ecs/jskult-dbdump/src/system_var/environment.py index 46f08c5d..ff510581 100644 --- a/ecs/jskult-dbdump/src/system_var/environment.py +++ b/ecs/jskult-dbdump/src/system_var/environment.py @@ -9,6 +9,7 @@ DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +DUMP_BACKUP_FOLDER = os.environ['DUMP_BACKUP_FOLDER'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') @@ -17,4 +18,3 @@ DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTE 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)) -DUMP_BACKUP_FOLDER = os.environ['DUMP_BACKUP_FOLDER'] From 3c3178fe70becf2c581ff65c56f336d3df53debb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Jul 2023 13:15:37 +0900 Subject: [PATCH 476/962] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E6=96=87=E8=A8=80=E3=82=92=E3=82=8F=E3=81=91=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index 7eba902a..eebbaf3e 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -31,8 +31,13 @@ def exec(): logger.error('日次バッチ処理中の為、日次バッチ処理前DBダンプ取得を終了します。') return constants.BATCH_EXIT_CODE_SUCCESS - # dump処理状態区分が処理中またはエラーの場合、処理は行わない - if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED or dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: + # dump処理状態区分が処理中の場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED: + logger.error(f'ダンプ取得中の為、日次バッチ処理前DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分がエラーの場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: logger.error(f'ダンプ取得が実行不可能な状態の為、日次バッチ処理前DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') return constants.BATCH_EXIT_CODE_SUCCESS From e0797fae1f293f0f88edef160f08e8c1bcd68513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Jul 2023 14:26:43 +0900 Subject: [PATCH 477/962] =?UTF-8?q?=E9=96=93=E9=81=95=E3=81=88=E3=81=A6?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=A6=E3=81=97=E3=81=BE=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=82=92=E6=88=BB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/db/database.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-dbdump/src/db/database.py b/ecs/jskult-dbdump/src/db/database.py index ee127d51..b675381c 100644 --- a/ecs/jskult-dbdump/src/db/database.py +++ b/ecs/jskult-dbdump/src/db/database.py @@ -71,7 +71,9 @@ class Database: min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT)) + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) def connect(self): """ DBに接続します。接続に失敗した場合、リトライします。 From 5ebd71b03d47b05b211c0fdb6004c6d65e5c8ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 12 Jul 2023 14:48:10 +0900 Subject: [PATCH 478/962] =?UTF-8?q?gzip=E3=82=B3=E3=83=9E=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index eebbaf3e..c93b2a0f 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -82,7 +82,7 @@ def exec(): mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # gzipコマンドを実行してdump結果を圧縮する - gzip_process = subprocess.Popen(['gzip'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # aws s3 cpコマンドを実行してアップロードする s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout, stderr=subprocess.PIPE) # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする From 44d6777960010ca54575f817262e91818d90e0d1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 12 Jul 2023 18:08:34 +0900 Subject: [PATCH 479/962] =?UTF-8?q?style:=20=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E7=B8=A6=E9=95=B7=E7=8F=BE=E8=B1=A1=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/css/masterMainte.css | 13 ++++- .../src/templates/instEmpCsvUL.html | 50 +++++++++---------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index 0b8b8a8e..863a9835 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -1,3 +1,9 @@ +/* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ +/* @see https://bootstrap-guide.com/content/reboot#page-defaults */ +table { + box-sizing: initial; +} + body{ background-color: LightCyan; font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; @@ -5,6 +11,7 @@ body{ h1{ margin-left : 1%; + font-weight: 700; } @@ -24,7 +31,10 @@ h1{ } .csvup_buttonSize{ - width: 85px; + font-size: initial; +} +.buttonSize{ + width: 85px; } /*////////////////////////*/ @@ -97,6 +107,7 @@ h1{ padding-bottom: 1%; border-bottom: solid 1px gray; width: 94%; + border-collapse: initial; } .inputLabelTd{ diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 50a1b2bd..9cdca845 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -12,9 +12,9 @@ document.getElementById("loading").style.display = "block"; document.getElementById("ulMsg").style.display = "none"; } - + function Form_Submit_Disp_Dialog(){ - var msg = '{{ mainte_csv_up.select_function_message() }}'; + var msg = '{{ mainte_csv_up.select_function_message() }}'; if (confirmDialog(msg)) { document.getElementById("loading").style.display = "block"; document.getElementById("ulMsg").style.display = "none"; @@ -31,7 +31,7 @@ formInsertBtDisabled(); }; - {% endif %} + {% endif %} @@ -41,9 +41,9 @@ 施設担当者データCSVアップロード {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} - - {% else %} - + + {% else %} + {% endif %} @@ -54,7 +54,7 @@ method="POST" enctype="multipart/form-data" {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} onsubmit="return Form_Submit_Disp_Dialog();" - {% else %} + {% else %} onsubmit="Form_Submit();" {% endif %} > @@ -65,8 +65,8 @@ 機能: -
{% if not mainte_csv_up.is_error_message_list_empty() %}
- {% for error in mainte_csv_up.error_message_list %} + {% for error in mainte_csv_up.error_message_list %} {{error.error_message}}
{% endfor %}
@@ -157,23 +157,23 @@ - {% for column_name in mainte_csv_up.upload_data_columns() %} - + {% for column_name in mainte_csv_up.upload_data_columns() %} + {% endfor %} - {% for item in mainte_csv_up.csv_upload_list %} + {% for item in mainte_csv_up.csv_upload_list %} {% for key, value in item.csv_row.items() %} - - {% endfor %} + + {% endfor %} {% endfor %}
{{column_name}}{{column_name}}
{{value}}{{value}}
- {% elif mainte_csv_up.is_insert %} + {% elif mainte_csv_up.is_insert %}
- {% for message in mainte_csv_up.result_message_list %} + {% for message in mainte_csv_up.result_message_list %} {{ message }}
{% endfor %}
From b3759b4ae9144a227881559837f7772df88483aa Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 10:29:01 +0900 Subject: [PATCH 480/962] =?UTF-8?q?feat:=20dump=E5=8F=96=E5=BE=97=E6=99=82?= =?UTF-8?q?=E3=80=81=E5=87=BA=E5=8A=9B=E5=85=88=E3=81=AE=E3=83=91=E3=82=B9?= =?UTF-8?q?=E3=82=92=E3=83=AD=E3=82=B0=E5=87=BA=E5=8A=9B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-dbdump/Dockerfile | 2 +- ecs/jskult-dbdump/src/jobctrl_dbdump.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile index 9c6838cb..3c410b72 100644 --- a/ecs/jskult-dbdump/Dockerfile +++ b/ecs/jskult-dbdump/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-bullseye +FROM python:3.9 ENV TZ="Asia/Tokyo" diff --git a/ecs/jskult-dbdump/src/jobctrl_dbdump.py b/ecs/jskult-dbdump/src/jobctrl_dbdump.py index c93b2a0f..3dac256f 100644 --- a/ecs/jskult-dbdump/src/jobctrl_dbdump.py +++ b/ecs/jskult-dbdump/src/jobctrl_dbdump.py @@ -64,8 +64,8 @@ def exec(): dt_now = datetime.datetime.now() converted_value = dt_now.strftime('%Y%m%d%H%M%S') - file_name = f'backup_rds_src05_{converted_value}.gz' - s3_file_name = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{file_name}' + dump_file_name = f'backup_rds_src05_{converted_value}.gz' + s3_file_path = f's3://{environment.JSKULT_BACKUP_BUCKET}/{environment.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' # mysqldumpコマンドを実行し、dumpを取得する command = [ @@ -79,12 +79,12 @@ def exec(): '--set-gtid-purged=OFF', environment.DB_SCHEMA ] - + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # gzipコマンドを実行してdump結果を圧縮する gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # aws s3 cpコマンドを実行してアップロードする - s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_name], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする mysqldump_process.stdout.close() # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする @@ -114,6 +114,7 @@ def exec(): return constants.BATCH_EXIT_CODE_SUCCESS logger.info('日次バッチ処理前DBダンプ取得:終了(正常終了)') + logger.info(f'出力ファイルパス: {s3_file_path}') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: From 54f600488f6337022c94be99aad81be4afee3738 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 10:31:44 +0900 Subject: [PATCH 481/962] =?UTF-8?q?feat:=20=E4=B8=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=AEimport=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index c97d40eb..bc0c621f 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -1,10 +1,13 @@ +from io import BytesIO, TextIOWrapper from typing import Optional + from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel from src.model.view.inst_emp_csv_download_view_model import \ InstEmpCsvDownloadViewModel from src.model.view.inst_emp_csv_upload_view_model import \ @@ -18,9 +21,6 @@ from src.services.master_mainte_service import MasterMainteService from src.services.session_service import set_session from src.system_var import constants from src.templates import templates -from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel -from fastapi import APIRouter, File, Form, Request -from io import TextIOWrapper, BytesIO router = APIRouter() router.route_class = AuthenticatedRoute From 9e305515f6fdc19d4f936487a3ae128c8ae0ec90 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 12:03:38 +0900 Subject: [PATCH 482/962] =?UTF-8?q?style:=20=E6=88=BB=E3=82=8B=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=82=E5=B7=A8=E5=A4=A7=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/masterMainte.css | 1 + ecs/jskult-webapp/src/templates/instEmpCsvUL.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index 863a9835..07f8bbe8 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -31,6 +31,7 @@ h1{ } .csvup_buttonSize{ + width: 7rem; font-size: initial; } .buttonSize{ diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 9cdca845..35ae1087 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -41,7 +41,7 @@ 施設担当者データCSVアップロード {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} - + {% else %} {% endif %} From f82d48e0b0477c5e3ecc11e681a9c5770c0642a5 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 12:04:07 +0900 Subject: [PATCH 483/962] =?UTF-8?q?refactor:=20css=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E5=90=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/masterMainte.css | 2 +- ecs/jskult-webapp/src/templates/instEmpCsvUL.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index 07f8bbe8..95cdc6e5 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -30,7 +30,7 @@ h1{ width: 20%; } -.csvup_buttonSize{ +.header_buttonSize{ width: 7rem; font-size: initial; } diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 35ae1087..9968a6f4 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -41,9 +41,9 @@ 施設担当者データCSVアップロード {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} - + {% else %} - + {% endif %} From ecbff882bf2819e0d56edf452522596be5fb9168 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 15:41:38 +0900 Subject: [PATCH 484/962] =?UTF-8?q?=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BOM3byte目の0xBFを判定するとき、UTF-8バイトシーケンスに含まれる0xBFを誤検知して、正しく末尾行が抽出できなかった --- .../src/batch/vjsk/vjsk_data_load_manager.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 0cc8a248..11764edf 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -91,26 +91,14 @@ class VjskDataLoadManager: # memo: UTF-8 バイトシーケンスとして、b'\n' が全角文字の一部にはならない if char == b'\n': break - # ファイル先頭のBOMを検出したらループ終了 - if char == b'\xbf': + # ファイル先頭のBOM3byte目の BF を検出したらループ終了 + # memo: UTF-8 バイトシーケンスとして、b'\xbf' が全角文字の一部の可能性がある(例:全角片仮名の「タ」) + # memo: charに代入したときのfile.read(1)によって、ファイルポインタは2→3になっている前提のロジック + if char == b'\xbf' and file.tell() == 3: break last_line = file.readline().decode('utf-8-sig').rstrip('\n') buf_count = last_line.count('\t') - # # ファイルの末尾から2バイト手前に、シーク位置を移動 - # # memo: 1byte戻るだけだと、直後のread(1)で末尾行のLFを見てしまうので、-2移動 - # file.seek(-2, os.SEEK_END) - # # 改行文字を見つけるまで逆方向に読み進める - # # memo: read(1)することでシーク位置は1byte前に進む - # while file.read(1) != b'\n': - # # シーク位置を1バイト戻って再度読み込み - # # memo: read(1)でシーク位置が1byte進んでいるので、その戻しと合わせて-2移動 - # file.seek(-2, os.SEEK_CUR) - # # 末尾行を抽出 - # last_line = file.readline().decode().rstrip('\n') - # # 末尾行に含まれるタブ文字の数を抽出 - # buf_count = last_line.count('\t') - return buf_count @classmethod From 241838ef71e29a02f3a7db343ad6ffa7e5133da3 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 14 Jul 2023 12:54:59 +0900 Subject: [PATCH 485/962] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/vjsk/vjsk_data_load_manager.py | 35 +++++++++++++ .../src/batch/vjsk/vjsk_recv_file_mapper.py | 51 +++++++++++++++++++ .../batch/vjsk/vjsk_file_check/conftest.py | 1 - .../batch/vjsk/vjsk_load/test_vjsk_load.py | 3 ++ 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 11764edf..af23490b 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -11,10 +11,21 @@ mapper = VjskReceiveFileMapper() class VjskDataLoadManager: + """ + V実消化データ取込機能クラス + """ + def __init__(self): pass def _import_to_db(src_file_name: str, condkey: str): + """ + 概要 + 指定されたtsvファイル src_file_name を策席スキーマに登録する + 引数 + src_file_name: ローカルストレージにある取込対象tsvファイルパス + condkey: 受領データの種類を一意に示す値(VjskReceiveFileMapperクラスで管理されているCONDKEY値) + """ logger.debug(f"_import_to_db start (src_file_name : {src_file_name}, condkey : {condkey})") db = Database.get_instance() @@ -24,6 +35,7 @@ class VjskDataLoadManager: upsert_sql = mapper.get_upsert_sql(condkey) try: + # データベース接続 db.connect() db.execute("SET SESSION sql_mode = 'TRADITIONAL';") @@ -52,17 +64,27 @@ class VjskDataLoadManager: # MEMO: https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount logger.info(f'{table_name_org}を{table_name_src}にUPSERT') + # データベースコミット db.commit() + except Exception as e: db.rollback() raise BatchOperationException(e) + finally: + # データベース切断 db.disconnect() logger.debug("_import_to_db done") return def _get_tsv_last_row_tab_count(src_file_name: str) -> int: + """ + 概要 + 指定されたtsvファイル src_file_name の末尾行に含まれるタブ文字数を取得する + 引数 + src_file_name: ローカルストレージにある取込対象tsvファイルパス + """ # memo: tsvファイルが数百MBに及ぶことを想定して、末尾から1行分を参照する # memo: 前提1 行区切りは LF('\n') # memo: 前提2 正常時のファイル終端にある文字は、末尾行の LF('\n') @@ -103,12 +125,25 @@ class VjskDataLoadManager: @classmethod def load(self, target: dict): + """ + 概要 + 取込対象受領ファイル target をデータベースに登録する + 引数 + target: { + condkey: 受領データの種類を一意に示す値(VjskReceiveFileMapperクラスで管理されているCONDKEY値) + src_file_path: ローカルストレージにある取込対象tsvファイルパス + } + """ logger.debug(f'load start target:{target}') # S3からローカルストレージにdownloadした登録対象のtsvファイルパスを取得 local_file_name = target["src_file_path"] # tsvファイル末尾行のTABの数が総定数と一致しない場合は例外をスロー + # memo: + # 対向元システムで生成されるファイルは稀に途中欠落が発生することがある。 + # これを、ファイルMySQL8.0のLOADステートメントで発生するWARNING/ERRORでは検知不可能なので、 + # LOADステートメント実行前に、物理的に途中欠落があるかを検知してエラーとすることが目的。 tsv_tabs = self._get_tsv_last_row_tab_count(local_file_name) expect_tabs = mapper.get_file_column_separators(target["condkey"]) if tsv_tabs != expect_tabs: diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py index 19f70067..21264c42 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_recv_file_mapper.py @@ -2,6 +2,9 @@ import textwrap class VjskReceiveFileMapper: + """ + V実消化データファイルI/Fマッピング定義クラス + """ CONDKEY_SLIP_DATA = "SLIP_DATA" # 販売実績データ CONDKEY_HLD_MST = "HLD_MST" # V卸ホールディングスマスタ CONDKEY_WHS_MST = "WHS_MST" # V卸マスタ @@ -1489,27 +1492,75 @@ class VjskReceiveFileMapper: return ret def get_data_name(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル論理名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_DATA_NAME) def get_file_prefix(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル名接頭辞を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_FILE_PREFIX) def get_file_suffix(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、ファイル拡張子を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_FILE_SUFFIX) def get_file_column_separators(self, condkey: str) -> int: + """ + 概要 + 受領ファイルI/Fが想定する、1行あたりのタブ文字数を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return int(self._get_interface_property(condkey, self._KEY_FILE_COLUMN_SEPARATORS)) def get_org_table(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、LOAD先ロードスキーマテーブル名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_ORG_TABLE) def get_src_table(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、登録先蓄積スキーマテーブル名を取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_SRC_TABLE) def get_upsert_sql(self, condkey: str) -> str: + """ + 概要 + 受領ファイルI/Fが想定する、upsert (ロードスキーマ→蓄積スキーマ) CMLステートメントを取得する + 引数 + condkey: 受領データの種類を一意に示す値(このクラスのメンバ CONDKEY_* の値) + """ return self._get_interface_property(condkey, self._KEY_UPSERT_SQL) def get_condkey_by_s3_file_path(self, s3_file_path: str) -> str: + """ + 概要 + S3受領バケットに受領したファイル名から、I/F想定に該当する condkey 値を取得する + 引数 + s3_file_path: S3受領バケットにある受領したファイルパス + """ ret = None filename = s3_file_path[s3_file_path.rfind("/") + 1:] for condkey in self._VJSK_INTERFACE_MAPPING: diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py index dccdd0df..bf9b2629 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_file_check/conftest.py @@ -23,7 +23,6 @@ def receive_folder(): return os.environ["VJSK_DATA_RECEIVE_FOLDER"] -# TODO 共通fixtureにして15個固定でput/delete、各個別fixtureで15個から引き算でdeleteする @pytest.fixture def init_check_received_files_ok1(s3_client, bucket_name, receive_folder): # setup diff --git a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py index 70504795..d2fb07ac 100644 --- a/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py +++ b/ecs/jskult-batch-daily/tests/batch/vjsk/vjsk_load/test_vjsk_load.py @@ -17,6 +17,9 @@ from tests.testing_vjsk_utility import (assert_table_results, class TestImportFileToDb: + """ + V実消化データ取込-データベース登録処理 テストクラス + """ db: Database batch_context: BatchContext test_file_path_import_all: str From a1d71275f045b33c76cffc16d282ec72ec8661d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 14 Jul 2023 14:28:36 +0900 Subject: [PATCH 486/962] =?UTF-8?q?feat:=20CSV=E3=83=80=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E7=94=BB=E9=9D=A2=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 1 + .../src/controller/master_mainte.py | 138 ++++++++++++- .../src/model/internal/master_mainte_csv.py | 4 + .../src/model/request/master_mainte_csvdl.py | 169 ++++++++++++++++ .../src/model/request/master_mainte_csvup.py | 2 +- .../view/inst_emp_csv_download_view_model.py | 23 +++ .../repositories/emp_chg_inst_repository.py | 127 ++++++++++++ .../src/services/master_mainte_service.py | 44 ++++- .../static/function/businessLogicScript.js | 40 +--- ecs/jskult-webapp/src/system_var/constants.py | 36 ++++ .../src/system_var/environment.py | 1 + .../src/templates/instEmpCsvDL.html | 181 ++++++++++-------- 12 files changed, 636 insertions(+), 130 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index 0630afe4..10844a21 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -10,6 +10,7 @@ COGNITO_CLIENT_SECRET=****************************** SESSION_TABLE_NAME=*********************** ##S3 BIO_ACCESS_LOG_BUCKET=******************* +MASTER_MAINTENANCE_BUCKET=mbj-newdwh2021-staging-jskult-master-maintenance #MySQL DB_HOST=************ DB_PORT=************ diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index c97d40eb..638f4595 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -1,9 +1,13 @@ +from datetime import datetime from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse from starlette import status +from src.error.exceptions import DBException +import pandas as pd from src.depends.services import get_service +from src.logging.get_logger import get_logger from src.model.internal.session import UserSession from src.model.view.inst_emp_csv_download_view_model import \ InstEmpCsvDownloadViewModel @@ -19,9 +23,11 @@ from src.services.session_service import set_session from src.system_var import constants from src.templates import templates from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel -from fastapi import APIRouter, File, Form, Request +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel from io import TextIOWrapper, BytesIO +logger = get_logger('マスターメンテ') + router = APIRouter() router.route_class = AuthenticatedRoute @@ -133,7 +139,7 @@ async def inst_emp_csv_upload( # 画面表示用のモデル mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( - TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read())), + TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), csv_upload_form.csv_file.filename, csv_upload_form) # セッション書き換え @@ -217,7 +223,9 @@ def inst_emp_csv_download_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - view_model = InstEmpCsvDownloadViewModel() + mainte_csv_dl = InstEmpCsvDownloadViewModel( + is_search=False + ) # セッション書き換え session.update( actions=[ @@ -230,7 +238,98 @@ def inst_emp_csv_download_view( 'instEmpCsvDL.html', { 'request': request, - 'view': view_model + 'mainte_csv_dl': mainte_csv_dl + }, + headers={'session_key': session.session_key} + ) + return templates_response + + +@router.post('/download', response_class=HTMLResponse) +async def inst_emp_csv_download( + request: Request, + csv_download_form: Optional[MasterMainteCsvDlModel] = Depends(MasterMainteCsvDlModel.as_form), + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg != '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) + + search_result_df, _ = _search_emp_chg_inst_data(master_mainte_service, csv_download_form) + download_file_url = '' + if search_result_df.size > 0: + extract_df = _extract_output_df(search_result_df) + + # ファイル名に使用するタイムスタンプを初期化しておく + current_timestamp = datetime.now() + download_file_name = f'Result_{session.user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv' + + # ファイルを書き出し(CSV) + local_file_path = _write_emp_chg_inst_data_to_file(master_mainte_service, extract_df, download_file_name) + + # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する + try: + master_mainte_service.upload_emp_chg_inst_data_file(local_file_path) + download_file_url = master_mainte_service.generate_download_file_url(local_file_path) + except Exception as e: + logger.exception(f'S3 アクセスエラー{e}') + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'aws_error', 'message': e.args} + ) + if csv_download_form.select_table == 'dummy': + result_msg = f'ダミーテーブルのデータ{search_result_df.size}件をCSVファイルに出力しました' + else: + result_msg = f'本番テーブルのデータ{search_result_df.size}件をCSVファイルに出力しました' + else: + result_msg = '該当データが存在しないためCSVファイルを出力しませんでした' + + # 画面表示用のモデル + mainte_csv_dl = InstEmpCsvDownloadViewModel( + is_search=True, + ta_cd=csv_download_form.ta_cd, + inst_cd=csv_download_form.inst_cd, + emp_cd=csv_download_form.emp_cd, + apply_date=csv_download_form.apply_date, + start_date_from=csv_download_form.start_date_from, + start_date_to=csv_download_form.start_date_to, + end_date_from=csv_download_form.end_date_from, + end_date_to=csv_download_form.end_date_to, + create_date_from=csv_download_form.create_date_from, + create_date_to=csv_download_form.create_date_to, + update_date_from=csv_download_form.update_date_from, + update_date_to=csv_download_form.update_date_to, + select_table=csv_download_form.select_table, + data_count=search_result_df.size, + download_file_url=download_file_url, + file_name=constants.MENTE_CSV_DOWNLOAD_FILE_NAME, + result_msg=result_msg + ) + + # セッション書き換え + 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, + 'mainte_csv_dl': mainte_csv_dl }, headers={'session_key': session.session_key} ) @@ -275,3 +374,34 @@ def table_override_view( headers={'session_key': session.session_key} ) return templates_response + + +def _search_emp_chg_inst_data(master_mainte_service: MasterMainteService, + csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame: + try: + csv_download_form.unescape() + # 施設担当者データを検索 + search_result_df, query = master_mainte_service.search_download_emp_chg_inst_data(csv_download_form) + except DBException as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + + return search_result_df, query + + +def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: + return search_result_df[constants.MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS] + + +def _write_emp_chg_inst_data_to_file( + master_mainte_service: MasterMainteService, + df: pd.DataFrame, + download_file_name: str +) -> str: + logger.info('CSVファイルを出力する') + local_file_path = master_mainte_service.write_csv_file( + df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name) + + return local_file_path diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index c093fe0c..0d3017c1 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -203,6 +203,8 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) + # get_csv_value() indexerrorでキャッチするメソッドを追加する + self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO] self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO] self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO] @@ -324,6 +326,8 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): bu_master_repository, emp_chginst_repository ) + # self.bu_cd = get_csv_value(constants.CSV_CHANGE_BU_CD_COL_NO) ← IndexErrorでtry catch + self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO] self.bu_name = self.csv_row[constants.CSV_CHANGE_BU_NAME_COL_NO] self.org_cd = self.csv_row[constants.CSV_CHANGE_ORG_CD_COL_NO] diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py new file mode 100644 index 00000000..293674e3 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -0,0 +1,169 @@ +from typing import Optional + +from fastapi import Form + +from src.util.sanitize import sanitize + +from src.model.request.request_base_model import RequestBaseModel +from src.util.string_util import is_not_empty + + +@sanitize +class MasterMainteCsvDlModel(RequestBaseModel): + ta_cd: Optional[str] + adapt_ta_cd: Optional[str] + inst_cd: Optional[str] + adapt_inst_cd: Optional[str] + emp_cd: Optional[str] + adapt_emp_cd: Optional[str] + apply_date: Optional[str] + adapt_apply_date: Optional[str] + start_date_from: Optional[str] + adapt_start_date_from: Optional[str] + start_date_to: Optional[str] + adapt_start_date_to: Optional[str] + end_date_from: Optional[str] + adapt_end_date_from: Optional[str] + end_date_to: Optional[str] + adapt_end_date_to: Optional[str] + select_table: Optional[str] + create_date_from: Optional[str] + adapt_create_date_from: Optional[str] + create_date_to: Optional[str] + adapt_create_date_to: Optional[str] + update_date_from: Optional[str] + adapt_update_date_from: Optional[str] + update_date_to: Optional[str] + adapt_update_date_to: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_ta_cd: Optional[str] = Form(None), + ctrl_inst_cd: Optional[str] = Form(None), + ctrl_emp_cd: Optional[str] = Form(None), + ctrl_apply_date: Optional[str] = Form(None), + ctrl_start_date_from: Optional[str] = Form(None), + ctrl_start_date_to: Optional[str] = Form(None), + ctrl_end_date_from: Optional[str] = Form(None), + ctrl_end_date_to: Optional[str] = Form(None), + radio_select_table: Optional[str] = Form(None), + ctrl_create_date_from: Optional[str] = Form(None), + ctrl_create_date_to: Optional[str] = Form(None), + ctrl_update_date_from: Optional[str] = Form(None), + ctrl_update_date_to: Optional[str] = Form(None) + ): + return cls.__convert_request_param( + cls, + ctrl_ta_cd, + ctrl_inst_cd, + ctrl_emp_cd, + ctrl_apply_date, + ctrl_start_date_from, + ctrl_start_date_to, + ctrl_end_date_from, + ctrl_end_date_to, + radio_select_table, + ctrl_create_date_from, + ctrl_create_date_to, + ctrl_update_date_from, + ctrl_update_date_to + ) + + def __convert_request_param( + cls, + ctrl_ta_cd: str, + ctrl_inst_cd: str, + ctrl_emp_cd: str, + ctrl_apply_date: str, + ctrl_start_date_from: str, + ctrl_start_date_to: str, + ctrl_end_date_from: str, + ctrl_end_date_to: str, + radio_select_table: str, + ctrl_create_date_from: str, + ctrl_create_date_to: str, + ctrl_update_date_from: str, + ctrl_update_date_to: str + ): + ctrl_ta_cd = ctrl_ta_cd if is_not_empty(ctrl_ta_cd) else '' + ctrl_inst_cd = ctrl_inst_cd if is_not_empty(ctrl_inst_cd) else '' + ctrl_emp_cd = ctrl_emp_cd if is_not_empty(ctrl_emp_cd) else '' + + adapt_apply_date = '' + if is_not_empty(ctrl_apply_date): + adapt_apply_date = ctrl_apply_date.replace('/', '') + else: + ctrl_apply_date = '' + + adapt_start_date_from = '' + adapt_start_date_to = '' + if is_not_empty(ctrl_start_date_from): + adapt_start_date_from = ctrl_start_date_from.replace('/', '') + else: + ctrl_start_date_from = '' + if is_not_empty(ctrl_start_date_to): + adapt_start_date_to = ctrl_start_date_to.replace('/', '') + else: + ctrl_start_date_to = '' + + adapt_end_date_from = '' + adapt_end_date_to = '' + if is_not_empty(ctrl_end_date_from): + adapt_end_date_from = ctrl_end_date_from.replace('/', '') + else: + ctrl_end_date_from = '' + if is_not_empty(ctrl_end_date_to): + adapt_end_date_to = ctrl_end_date_to.replace('/', '') + else: + ctrl_end_date_to = '' + + adapt_create_date_from = '' + adapt_create_date_to = '' + if is_not_empty(ctrl_create_date_from): + adapt_create_date_from = ctrl_create_date_from.replace('/', '') + else: + ctrl_create_date_from = '' + if is_not_empty(ctrl_create_date_to): + adapt_create_date_to = ctrl_create_date_to.replace('/', '') + else: + ctrl_create_date_to = '' + + adapt_update_date_from = '' + adapt_update_date_to = '' + if is_not_empty(ctrl_update_date_from): + adapt_update_date_from = ctrl_update_date_from.replace('/', '') + else: + ctrl_update_date_from = '' + if is_not_empty(ctrl_update_date_to): + adapt_update_date_to = ctrl_update_date_to.replace('/', '') + else: + ctrl_update_date_to = '' + + return cls( + ta_cd=ctrl_ta_cd, + adapt_ta_cd=ctrl_ta_cd, + inst_cd=ctrl_inst_cd, + adapt_inst_cd=ctrl_inst_cd, + emp_cd=ctrl_emp_cd, + adapt_emp_cd=ctrl_emp_cd, + apply_date=ctrl_apply_date, + adapt_apply_date=adapt_apply_date, + start_date_from=ctrl_start_date_from, + adapt_start_date_from=adapt_start_date_from, + start_date_to=ctrl_start_date_to, + adapt_start_date_to=adapt_start_date_to, + select_table=radio_select_table, + end_date_from=ctrl_end_date_from, + adapt_end_date_from=adapt_end_date_from, + end_date_to=ctrl_end_date_to, + adapt_end_date_to=adapt_end_date_to, + create_date_from=ctrl_create_date_from, + adapt_create_date_from=adapt_create_date_from, + create_date_to=ctrl_create_date_to, + adapt_create_date_to=adapt_create_date_to, + update_date_from=ctrl_update_date_from, + adapt_update_date_from=adapt_update_date_from, + update_date_to=ctrl_update_date_to, + adapt_update_date_to=adapt_update_date_to + ) diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py index 55f5a470..2f24bd8b 100644 --- a/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvup.py @@ -21,7 +21,7 @@ class MasterMainteCsvUpModel(RequestBaseModel): ctrl_csv_file: UploadFile = Form(None), ctrl_select_function: Optional[str] = Form(None), ctrl_select_table: Optional[str] = Form(None), - ctrl_json_upload_data: Optional[str] = Form(None), + ctrl_json_upload_data: Optional[str] = Form(None) ): return cls( csv_file=ctrl_csv_file, diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py index 220294ba..e630615e 100644 --- a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -1,5 +1,28 @@ from pydantic import BaseModel +from typing import Optional +from src.util.string_util import is_not_empty class InstEmpCsvDownloadViewModel(BaseModel): subtitle: str = '施設担当者データCSVダウンロード' + is_search: Optional[bool] = False + ta_cd: Optional[str] = '' + inst_cd: Optional[str] = '' + emp_cd: Optional[str] = '' + apply_date: Optional[str] = '' + start_date_from: Optional[str] = '' + start_date_to: Optional[str] = '' + end_date_from: Optional[str] = '' + end_date_to: Optional[str] = '' + create_date_from: Optional[str] = '' + create_date_to: Optional[str] = '' + update_date_from: Optional[str] = '' + update_date_to: Optional[str] = '' + select_table: Optional[str] = '' + data_count: Optional[int] = 0 + result_msg: Optional[str] = '' + download_file_url: Optional[str] = '' + file_name: Optional[str] = '' + + def is_select_table_empty(self): + return not is_not_empty(self.select_table) diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index abcd93ea..4ef7b836 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -1,5 +1,9 @@ from src.repositories.base_repository import BaseRepository +from src.db.sql_condition import SQLCondition +from src.db import sql_condition as condition from src.model.db.master_mente_count import MasterMenteCountModel +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.util.string_util import is_not_empty from src.logging.get_logger import get_logger logger = get_logger('従業員担当施設マスタ') @@ -153,3 +157,126 @@ class EmpChgInstRepository(BaseRepository): raise e finally: self._database.disconnect() + + FETCH_SQL = """\ + SELECT DISTINCT + eci.inst_cd AS inst_cd, + mi.inst_name AS inst_name, + eci.ta_cd AS ta_cd, + eci.emp_cd AS emp_cd, + CONCAT(emp.emp_name_family, " ", emp.emp_name_first) AS emp_name_full, + eci.bu_cd AS bu_cd, + bu.bu_name AS bu_name, + eci.start_date AS start_date, + eci.end_date AS end_date, + eci.creater AS creater, + eci.create_date AS create_date, + eci.updater AS updater, + eci.update_date AS update_date + FROM + {table_name} AS eci + LEFT JOIN mst_inst AS mi + ON eci.inst_cd = mi.inst_cd + LEFT JOIN emp + ON eci.emp_cd = emp.emp_cd + LEFT JOIN bu + ON eci.bu_cd = bu.bu_cd + WHERE + {where_clause} + """ + + def fetch_as_data_frame(self, table_name: str, parameter: MasterMainteCsvDlModel): + try: + self._database.connect() + logger.debug('DB参照実行') + where_clause = self.__build_condition(parameter) + query = self.FETCH_SQL.format(table_name=table_name, where_clause=where_clause) + logger.debug(f'SQL: {query}') + df = self._to_data_frame(query, parameter) + logger.debug(f'count= {len(df.index)}') + # ログ出力のため、クエリも返却 + return df, query + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() + + def __build_condition(self, parameter: MasterMainteCsvDlModel): + where_clauses: list[SQLCondition] = [] + + # 領域コードが入力されていた場合 + if is_not_empty(parameter.ta_cd): + parameter.adapt_ta_cd = f'%{parameter.ta_cd}%' + where_clauses.append(SQLCondition('eci.ta_cd', condition.LIKE, 'adapt_ta_cd')) + + # 施設コードが入力されていた場合 + if is_not_empty(parameter.inst_cd): + parameter.adapt_inst_cd = f'%{parameter.inst_cd}%' + where_clauses.append(SQLCondition('eci.inst_cd', condition.LIKE, 'adapt_inst_cd')) + + # MUIDが入力されていた場合 + if is_not_empty(parameter.emp_cd): + parameter.adapt_emp_cd = f'%{parameter.emp_cd}%' + where_clauses.append(SQLCondition('eci.emp_cd', condition.LIKE, 'adapt_emp_cd')) + + # 適用期間内が入力されていた場合 + if is_not_empty(parameter.adapt_apply_date): + where_clauses.append(SQLCondition('eci.START_DATE', + condition.LE, + 'adapt_apply_date')) + where_clauses.append(SQLCondition('eci.END_DATE', + condition.GE, + 'adapt_apply_date')) + + # 適用開始日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_start_date_from): + where_clauses.append(SQLCondition('eci.START_DATE', + condition.GE, + 'adapt_start_date_from')) + + # 適用開始日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_start_date_to): + where_clauses.append(SQLCondition('eci.START_DATE', + condition.LE, + 'adapt_start_date_to')) + + # 適用終了日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_end_date_from): + where_clauses.append(SQLCondition('eci.END_DATE', + condition.GE, + 'adapt_end_date_from')) + + # 適用終了日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_end_date_to): + where_clauses.append(SQLCondition('eci.END_DATE', + condition.LE, + 'adapt_end_date_to')) + + # データ作成日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_create_date_from): + where_clauses.append(SQLCondition('eci.CREATE_DATE', + condition.GE, + 'adapt_create_date_from')) + + # データ作成日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_create_date_to): + where_clauses.append(SQLCondition('eci.CREATE_DATE', + condition.LE, + 'adapt_create_date_to')) + + # データ作成日(FROM)が入力されていた場合 + if is_not_empty(parameter.adapt_update_date_from): + where_clauses.append(SQLCondition('eci.UPDATE_DATE', + condition.GE, + 'adapt_update_date_from')) + + # データ作成日(TO)が入力されていた場合 + if is_not_empty(parameter.adapt_update_date_to): + where_clauses.append(SQLCondition('eci.UPDATE_DATE', + condition.LE, + 'adapt_update_date_to')) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + logger.debug(f'条件設定終了:{where_clauses_str}') + return where_clauses_str diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 3d0d24f9..8d37d182 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -1,7 +1,12 @@ +import os import json import html + +import pandas as pd + from io import TextIOWrapper from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client from src.repositories.base_repository import BaseRepository from src.services.base_service import BaseService from src.model.internal.master_mainte_csv import MasterMainteCSVItems @@ -9,6 +14,7 @@ from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel from src.logging.get_logger import get_logger from src.model.view.mainte_csv_upload_model import CsvUploadModel from src.model.view.mainte_csv_error_model import CsvErrorModel @@ -16,7 +22,7 @@ from src.repositories.mst_inst_repository import MstInstRepository from src.repositories.bu_master_cd_repository import BuMasterRepository from src.repositories.emp_master_repository import EmpMasterRepository from src.repositories.emp_chg_inst_repository import EmpChgInstRepository -from src.system_var import constants +from src.system_var import constants, environment logger = get_logger('マスターメンテ') @@ -29,10 +35,15 @@ class MasterMainteService(BaseService): 'emp_chginst_repository': EmpChgInstRepository, } + CLIENTS = { + 's3_client': S3Client + } + mst_inst_repository: MstInstRepository emp_master_repository: EmpMasterRepository bu_master_repository: BuMasterRepository emp_chginst_repository: EmpChgInstRepository + s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) @@ -40,6 +51,7 @@ class MasterMainteService(BaseService): self.emp_master_repository = repositories['emp_master_repository'] self.bu_master_repository = repositories['bu_master_repository'] self.emp_chginst_repository = repositories['emp_chginst_repository'] + self.s3_client = clients['s3_client'] def prepare_mainte_csv_up_view(self, file: TextIOWrapper, @@ -125,6 +137,36 @@ class MasterMainteService(BaseService): ) return mainte_csv_up + def search_download_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel): + (table_name, _) = self.__target_table(csv_download_form.select_table) + search_result_df, query = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form) + return search_result_df, query + + def write_csv_file(self, data_frame: pd.DataFrame, header: list[str], download_file_name: str): + # csvに書き込み + output_file_path = os.path.join(constants.MENTE_CSV_TEMPORARY_FILE_DIR_PATH, download_file_name) + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + output_df.to_csv(output_file_path, index=False, header=False) + + return output_file_path + + def upload_emp_chg_inst_data_file(self, local_file_path: str) -> None: + bucket_name = environment.MASTER_MAINTENANCE_BUCKET + file_key = f'data/{os.path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + def generate_download_file_url(self, local_file_path: str) -> str: + bucket_name = environment.MASTER_MAINTENANCE_BUCKET + file_key = f'data/{os.path.basename(local_file_path)}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, constants.MENTE_CSV_DOWNLOAD_FILE_NAME) + def __target_table(self, select_table: str): if select_table == 'dummy': table_name = 'src05.emp_chg_inst_wrk' diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 8e711fbe..6b860ca3 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -226,21 +226,7 @@ function checkNumberOnlyForm($this) // メニューへボタンの関数 // 機能概要:マスターメンテメニュー画面に遷移する function backToMainteMenu(){ - location.href = "/masterMainte/masterMainteMenu.php"; -} - -// クリアボタンの関数 -// 利用条件1:form名がsearch -// 引数にはクリアしたいinputの数 -// 上から順番にクリアされる -function clrMainte(elementNum){ - for (var i = 1; i <= elementNum; i++) { - // document.form名[要素名].value="いれたい値"; - var elementsName = "textbox_" + i; - document.search[elementsName].value = ""; - } - // ボタンの非活性化 - formBtDisabled(elementNum); + location.href = "/menu/"; } // 確認ダイアログ @@ -249,30 +235,6 @@ function confirmDialog(strMesssage) { return result; } -// 検索ボタンの活性非活性関数 -// 利用条件1:form名がsearch -// 利用条件2:textbox名がtextbox_数字(1から連番) -// 引数にはテキストボックスの数 -function formBtDisabled(elementNum){ - var validFlg = false; - for (var i = 1; i <= elementNum; i++) { - var elementsName = "textbox_" + i; - if(document.search[elementsName].value.length > 0){ - validFlg = true; - break; - } - } - - if (validFlg == true) { - $('#csvDL').removeAttr('disabled'); - $('#clear').removeAttr('disabled'); - } - else { - $('#csvDL').attr('disabled', 'disabled'); - $('#clear').attr('disabled', 'disabled'); - } -} - function formInsertBtDisabled(){ var validFlg = false; if(document.getElementById("excelFile").value === ""){ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 54e4c575..f94d65de 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -219,3 +219,39 @@ CSV_CHANGE_COL_COUNT = 14 # 施設担当者変更登録CSV # CSVアップロードテーブル名(マスターメンテ) CSV_REAL_TABLE_NAME = '本番テーブル' CSV_CHANGE_TABLE_NAME = 'ダミーテーブル' + +MENTE_CSV_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data') + +MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS = [ + 'inst_cd', + 'inst_name', + 'ta_cd', + 'emp_cd', + 'emp_name_full', + 'bu_cd', + 'bu_name', + 'start_date', + 'end_date', + 'creater', + 'create_date', + 'updater', + 'update_date' +] + +MENTE_CSV_DOWNLOAD_HEADER = [ + '施設コード', + '施設名', + '領域コード', + 'MUID', + '担当者名', + 'ビジネスユニットコード', + 'ビジネスユニット名', + '適用開始日', + '適用終了日', + '作成者', + '作成日', + '更新者', + '更新日' +] + +MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv' diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index c5bf66ef..bbb40223 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -11,6 +11,7 @@ COGNITO_CLIENT_SECRET = os.environ['COGNITO_CLIENT_SECRET'] AWS_REGION = os.environ['AWS_REGION'] SESSION_TABLE_NAME = os.environ['SESSION_TABLE_NAME'] BIO_ACCESS_LOG_BUCKET = os.environ['BIO_ACCESS_LOG_BUCKET'] +MASTER_MAINTENANCE_BUCKET = os.environ['MASTER_MAINTENANCE_BUCKET'] DB_HOST = os.environ['DB_HOST'] DB_PORT = int(os.environ['DB_PORT']) diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 1209f8e2..9d0b69d8 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -4,26 +4,31 @@ {% with subtitle = mainte_csv_dl.subtitle %} {% include '_header.html' %} {% endwith %} - <!-- <?php echo $instEmpCsvDL ?> --> - - - + + -

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

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

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

- +

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

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

- - - - From 08da78a96bc0e46b57d92260d8e8bb3ee3dc898b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 14 Jul 2023 15:21:36 +0900 Subject: [PATCH 487/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=83=BC=E3=82=AB?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=81=8C?= =?UTF-8?q?=E6=8A=9C=E3=81=91=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/services/master_mainte_service.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 8d37d182..17a3c4a4 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -161,6 +161,8 @@ class MasterMainteService(BaseService): bucket_name = environment.MASTER_MAINTENANCE_BUCKET file_key = f'data/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) + # アップロード後、ローカルからは削除する + self.delete_local_file(local_file_path) def generate_download_file_url(self, local_file_path: str) -> str: bucket_name = environment.MASTER_MAINTENANCE_BUCKET @@ -177,3 +179,6 @@ class MasterMainteService(BaseService): else: raise Exception(f'登録テーブルの選択値が不正です: {select_table}') return (table_name, selected_table_msg) + + def delete_local_file(self, local_file_path: str): + os.remove(local_file_path) From 3d9ffc6689686de7cdf3d42e7db79afc915fa369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 14 Jul 2023 18:29:56 +0900 Subject: [PATCH 488/962] =?UTF-8?q?feat:=20=E3=83=86=E3=83=BC=E3=83=96?= =?UTF-8?q?=E3=83=AB=E4=B8=8A=E6=9B=B8=E3=81=8D=E3=82=B3=E3=83=94=E3=83=BC?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 46 +++++++++- .../src/model/internal/master_mainte_csv.py | 86 ++++++++++--------- .../view/inst_emp_csv_upload_view_model.py | 4 +- .../model/view/table_override_view_model.py | 3 + .../repositories/emp_chg_inst_repository.py | 20 +++++ .../src/services/master_mainte_service.py | 42 ++++++--- ecs/jskult-webapp/src/system_var/constants.py | 38 ++++---- .../src/templates/tableOverride.html | 43 ++++------ 8 files changed, 181 insertions(+), 101 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 71b9d18f..f251f57b 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -359,7 +359,7 @@ def table_override_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - view_model = TableOverrideViewModel() + table_override = TableOverrideViewModel() # セッション書き換え session.update( actions=[ @@ -372,7 +372,49 @@ def table_override_view( 'tableOverride.html', { 'request': request, - 'view': view_model + 'table_override': table_override + }, + headers={'session_key': session.session_key} + ) + return templates_response + + +@router.post('/tableOverride', response_class=HTMLResponse) +def table_override_result_view( + request: Request, + master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + + # マスタメンテメニューへのアクセス権がない場合、ログアウトさせる + if session.master_mainte_flg != '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) + + # 画面表示用のモデル + table_override = master_mainte_service.prepare_mainte_table_override_view() + + # セッション書き換え + 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, + 'table_override': table_override }, headers={'session_key': session.session_key} ) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 0d3017c1..c889a37e 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -216,28 +216,28 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): self.end_date = self.csv_row[constants.CSV_NEW_END_DATE] def csv_row_data(self) -> dict: - return {constants.NEW_INST_EMP_CSV_MAP[i]: self.csv_row[i] for i in range(len(self.csv_row))} + return {constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} def check_require(self) -> list[str]: error_list = [] if len(self.inst_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO])) if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_TA_CD_COL_NO])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_TA_CD_COL_NO])) if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO])) if len(self.bu_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO])) if len(self.start_date) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE])) if len(self.end_date) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE])) + self.line_num, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE])) return error_list @@ -246,7 +246,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): if super().is_exist_inst_cd() is False: error_list.append( - f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_INST_CD_COL_NO]}\ + f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO]}\ は施設マスタに存在しないコードです。') return error_list @@ -256,7 +256,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): return error_list if super().is_error_emp_cd(self.start_date) is True: - error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_EMP_CD_COL_NO]}\ + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list @@ -264,7 +264,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): error_list = [] if super().is_exist_bu_cd() is False: - error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_BU_CD_COL_NO]}\ + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO]}\ はビジネスユニットマスタに存在しないコードです。') return error_list @@ -273,14 +273,14 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): (error_list, start_date_time, end_date_time) = super().check_term_date( self.start_date, self.end_date, - constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE], - constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]) + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE], + constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]) if len(error_list) > 0 or self.start_date is None or self.end_date is None: return error_list if start_date_time > end_date_time: - error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_START_DATE]}\ -が{constants.NEW_INST_EMP_CSV_MAP[constants.CSV_NEW_END_DATE]}よりも後の日付になっています。') + error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE]}\ +が{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]}よりも後の日付になっています。') return error_list def check_item_count(self) -> list[str]: @@ -344,55 +344,60 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): self.comment = self.csv_row[constants.CSV_CHANGE_COMMENT] def csv_row_data(self) -> dict: - return {constants.CHANGE_INST_EMP_MAP[i]: self.csv_row[i] for i in range(len(self.csv_row))} + return {constants.CHANGE_INST_CSV_LOGICAL_NAMES[i]: self.csv_row[i] for i in range(len(self.csv_row))} def check_require(self) -> list[str]: error_list = [] if self.comment == '追加': if len(self.bu_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO])) if len(self.inst_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.inst_emp_end_date) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '終了': if len(self.inst_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) if len(self.change_end_date) == 0: - error_list.append(self.make_require_error_message(self.line_num, constants.CHANGE_INST_EMP_MAP[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) + error_list.append(self.make_require_error_message(self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) elif self.comment == '担当者修正': if len(self.inst_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO])) if len(self.ta_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_TA_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_TA_CD_COL_NO])) if len(self.emp_cd) == 0: error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO])) + self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO])) if len(self.inst_emp_start_date) == 0: - error_list.append(self.make_require_error_message( - self.line_num, constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) + error_list.append(self.make_require_error_message(self.line_num, + constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO])) else: error_list.append(f'{self.line_num}行目のコメントが不正です。 「追加」「終了」「担当者修正」のいずれかを入力してください。') return error_list @@ -401,7 +406,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): error_list = [] if super().is_exist_inst_cd() is False: - error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_CD_COL_NO]}\ + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO]}\ は施設マスタに存在しないコードです。') return error_list @@ -412,7 +417,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): return error_list if super().is_error_emp_cd(self.inst_emp_start_date) is True: - error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_EMP_CD_COL_NO]}\ は従業員マスタに存在しない もしくは 適用期間外のIDです。') return error_list @@ -422,7 +427,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if super().is_exist_bu_cd() is False: - error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_BU_CD_COL_NO]}\ + error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO]}\ はビジネスユニットマスタに存在しないコードです。') return error_list @@ -432,19 +437,22 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if self.comment == '追加' or self.comment == '終了': if self.comment == '追加': end_date = self.inst_emp_end_date - end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] + end_date_col_name = constants.CHANGE_INST_CSV_LOGICAL_NAMES[ + constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO] compare_error_message = f'\ -{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' +{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が\ +{end_date_col_name}よりも後の日付になっています。' else: end_date = self.change_end_date - end_date_col_name = constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] + end_date_col_name = constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO] compare_error_message = f'\ -{constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が{end_date_col_name}よりも後の日付になっています。' +{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が\ +{end_date_col_name}よりも後の日付になっています。' (error_list, start_date_time, end_date_time) = super().check_term_date( start_date, end_date, - constants.CHANGE_INST_EMP_MAP[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], + constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], end_date_col_name) if len(error_list) > 0 or start_date is None or end_date is None: return error_list 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 index f9bbc0e9..417059bf 100644 --- 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 @@ -42,9 +42,9 @@ class InstEmpCsvUploadViewModel(BaseModel): def __inst_emp_columns(self) -> list[str]: if self.select_function == 'new': - return constants.NEW_INST_EMP_CSV_MAP + return constants.NEW_INST_EMP_CSV_LOGICAL_NAMES if self.select_function == 'change': - return constants.CHANGE_INST_EMP_MAP + return constants.CHANGE_INST_CSV_LOGICAL_NAMES return [] def __real_table(self): 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 index e03b1fd0..d97a1928 100644 --- a/ecs/jskult-webapp/src/model/view/table_override_view_model.py +++ b/ecs/jskult-webapp/src/model/view/table_override_view_model.py @@ -1,5 +1,8 @@ from pydantic import BaseModel +from typing import Optional class TableOverrideViewModel(BaseModel): subtitle: str = 'テーブル上書きコピー' + + is_override: Optional[bool] = False diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 4ef7b836..b73700a8 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -280,3 +280,23 @@ class EmpChgInstRepository(BaseRepository): where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) logger.debug(f'条件設定終了:{where_clauses_str}') return where_clauses_str + + DELETE_SQL = "DELETE FROM emp_chg_inst_wrk" + + def delete_dummy_table(self): + try: + query = self.DELETE_SQL + self._database.execute(query) + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + + COPY_TABLE_SQL = "INSERT INTO emp_chg_inst_wrk SELECT * FROM emp_chg_inst" + + def copy_real_to_dummy(self): + try: + query = self.COPY_TABLE_SQL + self._database.execute(query) + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 17a3c4a4..c3d4131e 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -7,22 +7,24 @@ import pandas as pd from io import TextIOWrapper from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client -from src.repositories.base_repository import BaseRepository from src.services.base_service import BaseService -from src.model.internal.master_mainte_csv import MasterMainteCSVItems -from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg -from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg -from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel -from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel -from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel -from src.logging.get_logger import get_logger -from src.model.view.mainte_csv_upload_model import CsvUploadModel -from src.model.view.mainte_csv_error_model import CsvErrorModel +from src.system_var import constants, environment +from src.repositories.base_repository import BaseRepository from src.repositories.mst_inst_repository import MstInstRepository from src.repositories.bu_master_cd_repository import BuMasterRepository from src.repositories.emp_master_repository import EmpMasterRepository from src.repositories.emp_chg_inst_repository import EmpChgInstRepository -from src.system_var import constants, environment +from src.model.internal.master_mainte_csv import MasterMainteCSVItems +from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg +from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg +from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel +from src.model.view.table_override_view_model import TableOverrideViewModel +from src.model.view.mainte_csv_upload_model import CsvUploadModel +from src.model.view.mainte_csv_error_model import CsvErrorModel +from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel +from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel +from src.logging.get_logger import get_logger + logger = get_logger('マスターメンテ') @@ -137,6 +139,24 @@ class MasterMainteService(BaseService): ) return mainte_csv_up + def prepare_mainte_table_override_view(self) -> TableOverrideViewModel: + try: + self.emp_chginst_repository.connect() + self.emp_chginst_repository.begin() + self.emp_chginst_repository.delete_dummy_table() + self.emp_chginst_repository.copy_real_to_dummy() + self.emp_chginst_repository.commit() + except Exception as e: + self.emp_chginst_repository.rollback() + raise e + finally: + self.emp_chginst_repository.disconnect() + + table_override = TableOverrideViewModel( + is_override=True + ) + return table_override + def search_download_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel): (table_name, _) = self.__target_table(csv_download_form.select_table) search_result_df, query = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index f94d65de..be90eede 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -133,7 +133,8 @@ LOGOUT_REASON_MESSAGE_MAP = { LOGOUT_REASON_UNEXPECTED: '予期しないエラーが発生しました。
再度Loginするか、
管理者に問い合わせてください。' } -NEW_INST_EMP_CSV_MAP = [ +# 新規施設担当者登録CSV(マスターメンテ) +NEW_INST_EMP_CSV_LOGICAL_NAMES = [ '施設コード', '施設名', '領域コード', @@ -144,25 +145,6 @@ NEW_INST_EMP_CSV_MAP = [ '適用開始日', '適用終了日' ] - -CHANGE_INST_EMP_MAP = [ - 'ビジネスユニットコード', - 'ビジネスユニット名', - '組織コード', - '組織名略称', - '施設コード', - '施設名', - '領域コード', - '説明', - 'MUID', - '担当者名', - '施設担当_開始日', - '施設担当_終了日', - '終了日の変更', - 'コメント' -] - -# 新規施設担当者登録CSV(マスターメンテ) # 施設コードの列No CSV_NEW_INST_CD_COL_NO = 0 # 施設名の列No @@ -183,6 +165,22 @@ CSV_NEW_START_DATE = 7 CSV_NEW_END_DATE = 8 # 施設担当者変更登録CSV(マスターメンテ) +CHANGE_INST_CSV_LOGICAL_NAMES = [ + 'ビジネスユニットコード', + 'ビジネスユニット名', + '組織コード', + '組織名略称', + '施設コード', + '施設名', + '領域コード', + '説明', + 'MUID', + '担当者名', + '施設担当_開始日', + '施設担当_終了日', + '終了日の変更', + 'コメント' +] # ビジネスユニットコードの列No CSV_CHANGE_BU_CD_COL_NO = 0 # ビジネスユニット名の列No diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 2d6c624f..92648fd5 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -1,17 +1,15 @@ - {% with subtitle = view.subtitle %} + {% with subtitle = table_override.subtitle %} {% include '_header.html' %} {% endwith %} + - <!-- <?php echo $tableOverride; ?> --> - + -

テーブル上書きコピー

-

- - + +
テーブル上書きコピー

@@ -38,35 +34,28 @@ - + - + {% if table_override.is_override %} +

+

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

+ {% endif %} - - - From de9bf1a0649d2cf6050a14e93e7b7223ccf90971 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 14 Jul 2023 18:44:26 +0900 Subject: [PATCH 489/962] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E5=AE=9F=E8=A1=8C=E7=94=A8=E3=82=B3=E3=83=9E?= =?UTF-8?q?=E3=83=B3=E3=83=89=E8=BF=BD=E5=8A=A0=E3=80=81=E3=81=8A=E3=82=88?= =?UTF-8?q?=E3=81=B3readme=E3=81=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/Pipfile | 4 +- ecs/jskult-batch-daily/README.md | 100 +++++++++++++++++++++++++++---- 2 files changed, 90 insertions(+), 14 deletions(-) diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile index 1e6adf91..6dc0871b 100644 --- a/ecs/jskult-batch-daily/Pipfile +++ b/ecs/jskult-batch-daily/Pipfile @@ -5,7 +5,9 @@ name = "pypi" [scripts] "test:ultmarc" = "pytest tests/batch/ultmarc/" -"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" +"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/vjsk/" +"test:vjsk" = "pytest tests/batch/vjsk/" +"test:vjsk:cov" = "pytest --cov=src/batch/vjsk/ --cov-branch --cov-report=term-missing tests/batch/vjsk/" [packages] boto3 = "*" diff --git a/ecs/jskult-batch-daily/README.md b/ecs/jskult-batch-daily/README.md index d0f37149..144cf9b8 100644 --- a/ecs/jskult-batch-daily/README.md +++ b/ecs/jskult-batch-daily/README.md @@ -44,7 +44,7 @@ - 「entrypoint.py」が、バッチ処理のエントリーポイント。 - 実際の処理は、「src/jobctrl_daily.py」で行っている。 -## 単体テスト +## 単体テスト(アルトマーク取込処理) アルトマーク取込処理は、単体テストコードを使用してテスト自動化を行う @@ -68,7 +68,7 @@ | コマンド | 概要 | | ---------------- | -------------------------------------------------------------------------------------------- | | test:ultmarc | tests/batch/ultmarc フォルダ配下のユニットテストを実行する | -| test:ultmarc:cov | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) | +| test:ultmarc:cov | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) | ### テスト共通関数の仕様 @@ -156,6 +156,43 @@ - テスト結果データと期待値データを突き合わせ、期待値どおりとなっているかを確認する - ignore_col_nameに指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする + +## 単体テスト(実消化データ取込処理) + +実消化データは、単体テストコードを使用してテスト自動化を行う + +### テスト準備 + +※単体テスト(アルトマーク取込処理)と同じ + +### テスト用のサブコマンド一覧 + +- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる + - `Pipfile`内の「scripts」セクションに宣言されている + +| コマンド | 概要 | +| ---------------- | -------------------------------------------------------------------------------------------- | +| test:vjsk | tests/batch/vjsk フォルダ配下のユニットテストを実行する | +| test:vjsk:cov | tests/batch/vjsk フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) | + +### テスト共通関数の仕様 + +- tests/testing_vjsk_utility.py内の共通関数の仕様について記載する + +#### create_vjsk_assertion_list + +- 概要 + - DB登録期待値リストを作成する +- Args: + - file_path (str): DB登録期待値ファイル(tsvファイル)のパス + - memo: ※DB登録期待値ファイルの前提 + - memo: 受領データファイルと同じ + - memo: BOM付きtsv形式 + - memo: 一行目はカラム名になっているヘッダ行 + - Returns: + - List(dict) DB登録期待値辞書リスト + + ## フォルダ構成 ```text @@ -203,16 +240,53 @@ └── tests -- ユニットテストのルートディレクト ├── batch │ └── ultmarc -- アルトマーク関連のユニットテストを格納する - │ └── utmp_tables - │ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る - │ └── com_alma - │ ├── test_com_alma_mapper.py -- テストコード本体 - │ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。 - │ ... - │ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。 - │ ... - │ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。 - │ ... + │ │ └── utmp_tables + │ │ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る + │ │ └── com_alma + │ │ ├── test_com_alma_mapper.py -- テストコード本体 + │ │ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。 + │ │ ... + │ │ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。 + │ │ ... + │ │ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。 + │ │ ... + │ └─vjsk -- 実消化データ取込処理関連のユニットテストを格納する + │ │ + │ ├─vjsk_file_check -- 受領ファイルチェック処理関連のユニットテストを格納する + │ │ ├─conftest.py -- テスト内で共通利用できるフィクスチャの宣言 + │ │ └─test_vjsk_file_check.py -- テストクラス本体 + │ │ + │ └─vjsk_load -- 受領データ登録処理関連のユニットテストを格納する + │ │ conftest.py -- テスト内で共通利用できるフィクスチャの宣言 + │ │ test_vjsk_load.py -- テストクラス本体 + │ │ + │ └─testdata -- テストモジュールが使用するテストデータを格納する + │ │ bio_slip_data_202304280000.tsv -- 正常ケースの単体確認用 + │ │ ... -- *20230428* は新規4件の登録確認用 + │ │ whs_mst_202304290000.tsv -- *20230429* は更新2件+追加新規2件の登録確認用 + │ │ + │ ├─NoData -- 正常ケースの単体確認用 + │ │ bio_slip_data_nodatarecord.tsv -- ヘッダ行のみでデータが0件の動作確認用 + │ │ ... + │ │ whs_mst_nodatarecord.tsv + │ │ + │ ├─TestFormatErrorFile -- 異常ケースの単体確認用 + │ │ bio_slip_data_formaterror.tsv -- 末尾行のタブ数が想定と異なる(ファイル欠落がある)ときの動作確認用 + │ │ ... + │ │ whs_mst_formaterror.tsv + │ │ + │ ├─TestImportFileToDb -- 正常ケースの単体確認用 + │ │ bio_slip_data_202304270000.gz -- 対向元システムから送られてきた状態(gz圧縮)の受領データファイルの動作確認用 + │ │ ... + │ │ whs_mst_202304270000.gz + │ │ + │ └─UnzipError -- 異常ケースの単体確認用 + │ bio_slip_data_202304270000.gz -- gz圧縮ファイルが解凍できないときの動作確認用 + │ ... + │ whs_mst_202304270000.gz + │ ├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ) - └── testing_utility.py -- テストの共通関数 + ├── testing_utility.py -- テストの共通関数 + └── testing_vjsk_utility.py -- テストの共通関数(実消化データ取込処理関連) ``` + From 63c3340fe8bb91256b286355eac6c500f5359868 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 14 Jul 2023 18:51:49 +0900 Subject: [PATCH 490/962] =?UTF-8?q?=E3=82=B3=E3=83=94=E3=83=9A=E5=A2=97?= =?UTF-8?q?=E6=AE=96=E3=81=97=E3=81=A6=E5=A4=89=E3=81=88=E3=82=8B=E3=82=82?= =?UTF-8?q?=E3=81=AE=E3=82=92=E5=A4=89=E3=81=88=E3=81=99=E3=81=8E=E3=81=A6?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=81=A7=E5=85=83=E3=81=AB=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/Pipfile b/ecs/jskult-batch-daily/Pipfile index 6dc0871b..a40e6c17 100644 --- a/ecs/jskult-batch-daily/Pipfile +++ b/ecs/jskult-batch-daily/Pipfile @@ -5,7 +5,7 @@ name = "pypi" [scripts] "test:ultmarc" = "pytest tests/batch/ultmarc/" -"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/vjsk/" +"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/" "test:vjsk" = "pytest tests/batch/vjsk/" "test:vjsk:cov" = "pytest --cov=src/batch/vjsk/ --cov-branch --cov-report=term-missing tests/batch/vjsk/" From d2d5b5f9b6ac56921abc4e616c2c3163fa712b12 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Jul 2023 09:22:49 +0900 Subject: [PATCH 491/962] =?UTF-8?q?feat:=20=E3=83=AA=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=A2=E7=94=A8=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-restore-backup/.dockerignore | 12 +++ ecs/jskult-restore-backup/.env.example | 9 +++ ecs/jskult-restore-backup/.gitignore | 11 +++ ecs/jskult-restore-backup/.vscode/launch.json | 17 +++++ .../.vscode/recommended_settings.json | 31 ++++++++ ecs/jskult-restore-backup/Dockerfile | 40 ++++++++++ ecs/jskult-restore-backup/Pipfile | 16 ++++ ecs/jskult-restore-backup/Pipfile.lock | 69 +++++++++++++++++ ecs/jskult-restore-backup/README.md | 65 ++++++++++++++++ ecs/jskult-restore-backup/entrypoint.py | 10 +++ .../mysql_dpkg_selection.txt | 3 + ecs/jskult-restore-backup/src/__init__.py | 0 .../src/logging/get_logger.py | 37 ++++++++++ .../src/restore_backup.py | 74 +++++++++++++++++++ .../src/system_var/__init__.py | 0 .../src/system_var/constants.py | 2 + .../src/system_var/environment.py | 14 ++++ 17 files changed, 410 insertions(+) create mode 100644 ecs/jskult-restore-backup/.dockerignore create mode 100644 ecs/jskult-restore-backup/.env.example create mode 100644 ecs/jskult-restore-backup/.gitignore create mode 100644 ecs/jskult-restore-backup/.vscode/launch.json create mode 100644 ecs/jskult-restore-backup/.vscode/recommended_settings.json create mode 100644 ecs/jskult-restore-backup/Dockerfile create mode 100644 ecs/jskult-restore-backup/Pipfile create mode 100644 ecs/jskult-restore-backup/Pipfile.lock create mode 100644 ecs/jskult-restore-backup/README.md create mode 100644 ecs/jskult-restore-backup/entrypoint.py create mode 100644 ecs/jskult-restore-backup/mysql_dpkg_selection.txt create mode 100644 ecs/jskult-restore-backup/src/__init__.py create mode 100644 ecs/jskult-restore-backup/src/logging/get_logger.py create mode 100644 ecs/jskult-restore-backup/src/restore_backup.py create mode 100644 ecs/jskult-restore-backup/src/system_var/__init__.py create mode 100644 ecs/jskult-restore-backup/src/system_var/constants.py create mode 100644 ecs/jskult-restore-backup/src/system_var/environment.py diff --git a/ecs/jskult-restore-backup/.dockerignore b/ecs/jskult-restore-backup/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-restore-backup/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-restore-backup/.env.example b/ecs/jskult-restore-backup/.env.example new file mode 100644 index 00000000..2bda940a --- /dev/null +++ b/ecs/jskult-restore-backup/.env.example @@ -0,0 +1,9 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +JSKULT_BACKUP_DUMP_S3_FILE_PATH=******************* + +LOG_LEVEL=INFO diff --git a/ecs/jskult-restore-backup/.gitignore b/ecs/jskult-restore-backup/.gitignore new file mode 100644 index 00000000..cf44449e --- /dev/null +++ b/ecs/jskult-restore-backup/.gitignore @@ -0,0 +1,11 @@ +.vscode/settings.json +.env +my.cnf + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-restore-backup/.vscode/launch.json b/ecs/jskult-restore-backup/.vscode/launch.json new file mode 100644 index 00000000..a0178c26 --- /dev/null +++ b/ecs/jskult-restore-backup/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)jskult batch dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-restore-backup/.vscode/recommended_settings.json b/ecs/jskult-restore-backup/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-restore-backup/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-restore-backup/Dockerfile b/ecs/jskult-restore-backup/Dockerfile new file mode 100644 index 00000000..3c410b72 --- /dev/null +++ b/ecs/jskult-restore-backup/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.25-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-restore-backup/Pipfile b/ecs/jskult-restore-backup/Pipfile new file mode 100644 index 00000000..f032c7ea --- /dev/null +++ b/ecs/jskult-restore-backup/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-restore-backup/Pipfile.lock b/ecs/jskult-restore-backup/Pipfile.lock new file mode 100644 index 00000000..f948e3df --- /dev/null +++ b/ecs/jskult-restore-backup/Pipfile.lock @@ -0,0 +1,69 @@ +{ + "_meta": { + "hash": { + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-restore-backup/README.md b/ecs/jskult-restore-backup/README.md new file mode 100644 index 00000000..f955ff97 --- /dev/null +++ b/ecs/jskult-restore-backup/README.md @@ -0,0 +1,65 @@ +# 実消化&アルトマークダンプ復元スクリプト + +## 概要 + +実消化&アルトマークダンプ復元スクリプト + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/restore_backup.py」で行っている。 + +## フォルダ構成 + +```txt +. +├── .env.example -- 環境変数のサンプル値 +├── Dockerfile -- Dockerイメージ作成用 +├── Pipfile -- pythonの依存関係管理 +├── Pipfile.lock -- 依存関係バージョン固定 +├── README.md -- 当ファイル +├── entrypoint.py -- エントリーポイントとなるファイル +├── mysql_dpkg_selection.txt -- Dockerイメージでdpkgを使うときに外部から注入する選択値 +└── src -- ソースコードフォルダ + ├── logging + │ └── get_logger.py -- ロガー + ├── restore_backup.py -- dump復元処理本体 + └── system_var + ├── constants.py -- 定数ファイル + └── environment.py -- 環境変数ファイル +``` diff --git a/ecs/jskult-restore-backup/entrypoint.py b/ecs/jskult-restore-backup/entrypoint.py new file mode 100644 index 00000000..2bacdf0c --- /dev/null +++ b/ecs/jskult-restore-backup/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" +from src import restore_backup + +if __name__ == '__main__': + try: + exit(restore_backup.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-restore-backup/mysql_dpkg_selection.txt b/ecs/jskult-restore-backup/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/jskult-restore-backup/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/jskult-restore-backup/src/__init__.py b/ecs/jskult-restore-backup/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-restore-backup/src/logging/get_logger.py b/ecs/jskult-restore-backup/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-restore-backup/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-restore-backup/src/restore_backup.py b/ecs/jskult-restore-backup/src/restore_backup.py new file mode 100644 index 00000000..da481eaf --- /dev/null +++ b/ecs/jskult-restore-backup/src/restore_backup.py @@ -0,0 +1,74 @@ +"""実消化&アルトマークダンプ復元スクリプト""" + +import os +import re +import subprocess +import textwrap + +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('実消化&アルトマークダンプ復元スクリプト') + + +def exec(): + try: + logger.info('実消化&アルトマークダンプ復元スクリプト:開始') + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + # 復元対象のダンプファイルを特定 + s3_file_path = environment.JSKULT_BACKUP_DUMP_S3_FILE_PATH + + # S3 URIになっているか確認 + s3_file_path_pattern = r"s3://([\w-]+)/dump/(\d{4})/(\d{2})/(\d{2})/backup_rds_(\d+).gz" + if re.match(s3_file_path_pattern, s3_file_path) is None: + logger.warning('環境変数[JSKULT_BACKUP_DUMP_S3_FILE_PATH]に指定された、S3 URIの形式が不正です。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # aws s3 cpコマンドを実行してdumpファイルを標準出力に取得する + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, '-'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gunzipコマンドを実行してdumpファイルを解凍する + gunzip_process = subprocess.Popen(['gzip', '-c'], stdin=s3_cp_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # mysqldumpコマンドを実行し、dumpを取得する + mysql_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], + stdin=gunzip_process.stdout, stderr=subprocess.PIPE + ) + # aws s3 cpの標準出力をgunzipに接続したため、標準出力をクローズする + s3_cp_process.stdout.close() + # gunzipの標準出力をaws mysqlに接続したため、標準出力をクローズする + gunzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + _, error = gunzip_process.communicate() + if gunzip_process.returncode != 0: + logger.error(f'`gunzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + _, error = mysql_process.communicate() + if mysql_process.returncode != 0: + logger.error(f'`mysql`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + + logger.info('[NOTICE]実消化&アルトマークダンプ復元スクリプト:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + logger.exception(f'実消化&アルトマークダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-restore-backup/src/system_var/__init__.py b/ecs/jskult-restore-backup/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-restore-backup/src/system_var/constants.py b/ecs/jskult-restore-backup/src/system_var/constants.py new file mode 100644 index 00000000..8a555af3 --- /dev/null +++ b/ecs/jskult-restore-backup/src/system_var/constants.py @@ -0,0 +1,2 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 diff --git a/ecs/jskult-restore-backup/src/system_var/environment.py b/ecs/jskult-restore-backup/src/system_var/environment.py new file mode 100644 index 00000000..4ab083e0 --- /dev/null +++ b/ecs/jskult-restore-backup/src/system_var/environment.py @@ -0,0 +1,14 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +JSKULT_BACKUP_DUMP_S3_FILE_PATH = os.environ['JSKULT_BACKUP_DUMP_FILE_PATH'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From d615b3bca2177cf1ba3194eb8a55d1354984ec8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Jul 2023 11:37:22 +0900 Subject: [PATCH 492/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 24 +--- .../src/model/db/bio_sales_view.py | 110 +++++++++++++----- .../src/model/view/bio_disp_model.py | 6 - .../src/model/view/bio_view_model.py | 11 ++ .../repositories/bio_sales_view_repository.py | 75 ++++++++---- .../src/services/bio_view_service.py | 3 + ecs/jskult-webapp/src/system_var/constants.py | 6 +- .../src/templates/bioSearchList.html | 57 ++++----- 8 files changed, 182 insertions(+), 110 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 8ff711c8..61d326b4 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -61,8 +61,7 @@ async def download_bio_data( return {'status': 'ok', 'download_url': None} # ファイルに打ち出すカラムを抽出 - # TODO: SQLクエリを修正するため、この処理は不要になる - extract_df = _extract_output_df(search_result_df) + extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] # ファイルを書き出し(Excel or CSV) local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) @@ -116,27 +115,6 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i return search_result_df, query -def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - - # 値を変換 - # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( - lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) - # データ区分の区分の日本語名を設定 - extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) - # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( - lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') - - return extract_df - - def _write_bio_data_to_file( bio_service: BioViewService, download_param: BioDownloadModel, diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 325ccbbc..8b28f225 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -5,70 +5,120 @@ from src.model.db.base_db_model import BaseDBModel class BioSalesViewModel(BaseDBModel): - conv_cd: Optional[int] - rec_data: Optional[str] + # conv_cd: Optional[int] + # rec_data: Optional[str] + # rec_whs_cd: Optional[str] + # rec_whs_sub_cd: Optional[str] + # rec_whs_org_cd: Optional[str] + # rec_cust_cd: Optional[str] + # rec_comm_cd: Optional[str] + # rec_tran_kbn: Optional[str] + # rev_hsdnymd_wrk: Optional[str] + # rev_hsdnymd_srk: Optional[str] + # rec_urag_num: Optional[str] + # rec_comm_name: Optional[str] + # rec_nonyu_fcl_name: Optional[str] + # rec_nonyu_fcl_addr: Optional[str] + # rec_lot_num: Optional[str] + # qty: Optional[str] + # rec_ymd: Optional[str] + # sale_data_cat: Optional[str] + # slip_file_name: Optional[str] + # slip_mgt_num: Optional[str] + # row_num: Optional[int] + # hsdn_ymd: Optional[str] + # exec_dt: Optional[str] + # v_tran_cd: Optional[int] + # tran_kbn_name: Optional[str] + # whs_org_cd: Optional[str] + # v_whsorg_cd: Optional[str] + # whs_org_name: Optional[str] + # whs_org_kn: Optional[str] + # v_whs_cd: Optional[int] + # whs_name: Optional[str] + # nonyu_fcl_cd: Optional[str] + # v_inst_cd: Optional[str] + # v_inst_kn: Optional[str] + # v_inst_nm: Optional[str] + # v_inst_addr: Optional[str] + # comm_cd: Optional[str] + # product_name: Optional[str] + # whs_rep_comm_name: Optional[str] + # whs_rep_nonyu_fcl_name: Optional[str] + # whs_rep_nonyu_fcl_addr: Optional[str] + # mkr_inf_1: Optional[str] + # mkr_cd: Optional[str] + # htdnymd_err_kbn: Optional[str] + # prd_exis_kbn: Optional[str] + # fcl_exis_kbn: Optional[str] + # amt: Optional[int] + # slip_org_kbn: Optional[str] + # bef_slip_mgt_num: Optional[str] + # lot_no_err_flg: Optional[str] + # iko_flg: Optional[str] + # kjyo_ym: Optional[str] + # tksnbk_kbn: Optional[str] + # fcl_exec_kbn: Optional[str] + # rec_sts_kbn: Optional[str] + # ins_dt: Optional[datetime] + # ins_usr: Optional[str] + # dcf_inst_cd: Optional[str] + # inst_cd: Optional[str] + # inst_name_form: Optional[str] + # address: Optional[str] + # tel_num: Optional[str] + # data_kbn: Optional[str] + # ser_no: Optional[str] + # lot_num: Optional[str] + # expr_dt: Optional[date] + # amt_fugo: Optional[str] + slip_mgt_num: Optional[str] + conv_cdR: Optional[int] rec_whs_cd: Optional[str] rec_whs_sub_cd: Optional[str] rec_whs_org_cd: Optional[str] - rec_cust_cd: Optional[str] rec_comm_cd: Optional[str] rec_tran_kbn: Optional[str] - rev_hsdnymd_wrk: Optional[str] rev_hsdnymd_srk: Optional[str] rec_urag_num: Optional[str] rec_comm_name: Optional[str] rec_nonyu_fcl_name: Optional[str] rec_nonyu_fcl_addr: Optional[str] rec_lot_num: Optional[str] - rec_qty: Optional[str] rec_ymd: Optional[str] - sale_data_cat: Optional[str] - slip_file_name: Optional[str] - slip_mgt_num: Optional[str] - row_num: Optional[int] - hsdn_ymd: Optional[str] - exec_dt: Optional[str] v_tran_cd: Optional[int] tran_kbn_name: Optional[str] whs_org_cd: Optional[str] - v_whsorg_cd: Optional[str] + v_whsorg_cd: Optional[int] whs_org_name: Optional[str] - whs_org_kn: Optional[str] v_whs_cd: Optional[int] whs_name: Optional[str] nonyu_fcl_cd: Optional[str] v_inst_cd: Optional[str] v_inst_kn: Optional[str] - v_inst_nm: Optional[str] + v_inst_name: Optional[str] v_inst_addr: Optional[str] comm_cd: Optional[str] product_name: Optional[str] - whs_rep_comm_nm: Optional[str] - whs_rep_nnskfcl_nm: Optional[str] - whs_rep_nnsk_fcl_addr: Optional[str] + whs_rep_comm_name: Optional[str] + whs_rep_nonyu_fcl_name: Optional[str] + whs_rep_nonyu_fcl_addr: Optional[str] mkr_inf_1: Optional[str] mkr_cd: Optional[str] - htdnymd_err_kbn: Optional[str] - prd_exis_kbn: Optional[str] - fcl_exis_kbn: Optional[str] - amt: Optional[int] + qty: Optional[int] slip_org_kbn: Optional[str] bef_slip_mgt_num: Optional[str] lot_no_err_flg: Optional[str] iko_flg: Optional[str] - kjyo_ym: Optional[str] - tksnbk_kbn: Optional[str] - fcl_exec_kbn: Optional[str] rec_sts_kbn: Optional[str] - ins_dt: Optional[datetime] + ins_dt: Optional[str] ins_usr: Optional[str] - dcf_inst_cd: Optional[str] + dwh_upd_dt: Optional[datetime] inst_cd: Optional[str] inst_name_form: Optional[str] address: Optional[str] - tel_no: Optional[str] + tel_num: Optional[str] data_kbn: Optional[str] - ser_no: Optional[str] - lot_num: Optional[str] + data_kind: Optional[str] + err_dtl_kind: Optional[str] expr_dt: Optional[date] - amt_fugo: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index e78d4f29..2ebf2c00 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -1,5 +1,4 @@ from src.model.db.bio_sales_view import BioSalesViewModel -from src.system_var import constants from src.util.sanitize import sanitize @@ -8,11 +7,6 @@ class BisDisplayModel(BioSalesViewModel): def __init__(self, param: BioSalesViewModel) -> None: super().__init__(**param.dict()) - # 区分・フラグの正式名称を設定 - self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) - self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) - self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット if (self.bef_slip_mgt_num is None): self.ins_dt = "" 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 8f5e4875..1cd4f4a1 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -55,6 +55,17 @@ class BioViewModel(BaseModel): return obj.isoformat() if hasattr(obj, 'isoformat') else obj return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) + def make_whs_name(self): + if not self.is_form_submitted(): + return '' + if self.form_data.rec_whs_cd is None: + return '' + + form_wholesaler_full_name = \ + f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' + + return form_wholesaler_full_name + def is_selected_whs_name(self, selected_wholesaler): if not self.is_form_submitted(): return '' diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 46eb2b91..0b3a52a5 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -12,30 +12,65 @@ logger = get_logger('生物由来参照') class BioSalesViewRepository(BaseRepository): FETCH_SQL = """\ SELECT - ( - CASE - WHEN LEFT(bs.v_tran_cd, 1) = 2 - AND bs.qty >= 1 THEN CONCAT('-', bs.qty) - ELSE bs.qty - END - ) AS amt_fugo, - bs.*, - ln.ser_num, - ln.lot_num, - ln.expr_dt + slip_mgt_num, + conv_cd, + rec_whs_cd, + rec_whs_sub_cd, + rec_whs_org_cd, + rec_comm_cd, + rec_tran_kbn, + rev_hsdnymd_srk, + rec_urag_num, + rec_comm_name, + rec_nonyu_fcl_name, + rec_nonyu_fcl_addr, + rec_lot_num, + rec_ymd, + v_tran_cd, + tran_kbn_name, + whs_org_cd, + v_whsorg_cd, + whs_org_name, + v_whs_cd, + whs_name, + nonyu_fcl_cd, + v_inst_cd, + v_inst_kn, + v_inst_name, + v_inst_addr, + comm_cd, + product_name, + whs_rep_comm_name, + whs_rep_nonyu_fcl_name, + whs_rep_nonyu_fcl_addr, + mkr_inf_1, + mkr_cd, + qty, + slip_org_kbn, + bef_slip_mgt_num, + lot_no_err_flg, + iko_flg, + rec_sts_kbn, + ins_dt, + ins_usr, + dwh_upd_dt, + inst_cd, + inst_name_form, + address, + tel_num, + data_kbn, + data_kind, + err_dtl_kind, + expr_dt FROM - src05.bio_sales_view bs - LEFT OUTER JOIN - src05.lot_num_mst ln - ON bs.mkr_cd = ln.ser_num - AND bs.rec_lot_num = ln.lot_num + src05.bio_sales_lot WHERE {where_clause} ORDER BY - bs.rec_whs_cd, - bs.rec_whs_sub_cd, - bs.rev_hsdnymd_srk, - bs.slip_mgt_num + rec_whs_cd, + rec_whs_sub_cd, + rev_hsdnymd_srk, + slip_mgt_num ASC\ """ diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index d1102598..73cc06f5 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -119,6 +119,9 @@ class BioViewService(BaseService): logger.info(parameter_message) access_logger.info(parameter_message) + # ログファイルクローズ + access_log_handler.close() + # S3にアップロード self.upload_bio_access_log_file(access_log_file_path) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 064d135b..184a3eb9 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -9,7 +9,7 @@ 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') BIO_EXTRACT_COLUMNS = [ - 'slip_org_kbn', + 'data_kind', 'slip_mgt_num', 'rec_ymd', 'rec_whs_cd', @@ -30,10 +30,10 @@ BIO_EXTRACT_COLUMNS = [ 'rec_nonyu_fcl_addr', 'whs_rep_nonyu_fcl_addr', 'rec_lot_num', - 'amt_fugo', + 'qty', 'expr_dt', 'data_kbn', - 'lot_num_err_flg', + 'err_dtl_kind', 'bef_slip_mgt_num', 'ins_usr', 'ins_dt', diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index ae7a3d7c..89436d67 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -6,15 +6,15 @@ {% endwith %} - @@ -55,13 +55,11 @@ @@ -96,16 +94,14 @@ 発伝年月日: - ~ - @@ -186,6 +182,18 @@ {% endif %} +
+ + + + + + + + + + +
- {% if not mainte_csv_up.is_verified %} - - {% endif %} @@ -114,7 +105,7 @@ {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} {{mainte_csv_up.csv_file_name}} {% else %} - + {% endif %} @@ -127,7 +118,7 @@ {% else %} - + {% endif %} From 1bf03393d5fae0bed6262a306ce91a5c65b6b774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 18 Jul 2023 15:05:58 +0900 Subject: [PATCH 496/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 10 +++++----- .../model/view/inst_emp_csv_upload_view_model.py | 6 ++---- .../src/model/view/mainte_csv_error_model.py | 9 --------- .../src/model/view/mainte_csv_upload_model.py | 7 ------- .../src/services/master_mainte_service.py | 13 ++++--------- ecs/jskult-webapp/src/templates/instEmpCsvUL.html | 6 +++--- 6 files changed, 14 insertions(+), 37 deletions(-) delete mode 100644 ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py delete mode 100644 ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index d6344393..17585794 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -51,7 +51,7 @@ class MasterMainteCSVItem(metaclass=ABCMeta): error_list = [] # 項目数チェック error_list.extend(self.check_item_count()) - if len(error_list) > 0: + if len(error_list) == 0: # 必須チェック 及び コメントエラーチェック error_list.extend(self.check_require()) # 施設コード存在チェック @@ -487,16 +487,16 @@ class MasterMainteCSVItems: lines: list[MasterMainteCSVItem] __i: int = 0 - def reset(self): - self.__i = 0 - def to_json(self): # CSVをjsonに変換 - csv_row_dict_list: list[dict] = [row_item.csv_row_data() for row_item in self.lines] + csv_row_dict_list: list[dict] = self.to_dict() # json作成 return json.dumps(csv_row_dict_list, ensure_ascii=False) + def to_dict(self): + return [row_item.csv_row_data() for row_item in self.lines] + def __iter__(self): return self 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 index 417059bf..0fd15fcc 100644 --- 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 @@ -1,8 +1,6 @@ from typing import Optional from pydantic import BaseModel -from src.model.view.mainte_csv_upload_model import CsvUploadModel -from src.model.view.mainte_csv_error_model import CsvErrorModel from src.system_var import constants @@ -10,11 +8,11 @@ class InstEmpCsvUploadViewModel(BaseModel): subtitle: str = '施設担当者データCSVアップロード' is_verified: Optional[bool] is_insert: Optional[bool] - error_message_list: Optional[list[CsvErrorModel]] + error_message_list: Optional[list[str]] select_function: Optional[str] select_table: Optional[str] csv_file_name: Optional[str] - csv_upload_list: Optional[list[CsvUploadModel]] + csv_upload_list: Optional[list[dict]] json_upload_data: Optional[str] result_message_list: Optional[list[str]] dialog_msg: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py deleted file mode 100644 index 097ec780..00000000 --- a/ecs/jskult-webapp/src/model/view/mainte_csv_error_model.py +++ /dev/null @@ -1,9 +0,0 @@ -from pydantic import BaseModel -from typing import Optional - - -class CsvErrorModel(BaseModel): - error_message: Optional[str] - - # def __init__(self, error_message: str) -> None: - # super().__init__(error_message=error_message) diff --git a/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py b/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py deleted file mode 100644 index 2c227470..00000000 --- a/ecs/jskult-webapp/src/model/view/mainte_csv_upload_model.py +++ /dev/null @@ -1,7 +0,0 @@ -from pydantic import BaseModel -from typing import Optional - - -class CsvUploadModel(BaseModel): - subtitle: str = '施設担当者データCSVアップロード' - csv_row: Optional[dict] diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 65de4ca4..36015fe2 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -19,8 +19,6 @@ from src.model.internal.master_mainte_emp_chg_inst_function import NewEmpChgInst from src.model.internal.master_mainte_emp_chg_inst_function import ChangeEmpChgInstFunction from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel from src.model.view.table_override_view_model import TableOverrideViewModel -from src.model.view.mainte_csv_upload_model import CsvUploadModel -from src.model.view.mainte_csv_error_model import CsvErrorModel from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel from src.logging.get_logger import get_logger @@ -79,19 +77,16 @@ class MasterMainteService(BaseService): error_message_list = [] # CSVファイル0件(ヘッダ行のみ)チェック - if len(csv_items) == 0: + if len(csv_items.lines) == 0: error_message_list.append('選択されたExcelファイルの2行目以降に値が記入されておりません。') else: for row_item in csv_items: - error_message_list.extend([CsvErrorModel(data) for data in row_item.validate()]) + error_message_list.extend([data for data in row_item.validate()]) - csv_items.reset() csv_upload_list = [] json_upload_data = '' if len(error_message_list) == 0: - csv_upload_list: list[CsvUploadModel] = [CsvUploadModel( - csv_row=row_item.csv_row_data()) for row_item in csv_items] - + csv_upload_list: list[dict] = csv_items.to_dict() # json作成 json_upload_data = csv_items.to_json() @@ -134,7 +129,7 @@ class MasterMainteService(BaseService): (result_message_list, raw_error_list) = emp_chg_inst.save() error_message_list = [] - error_message_list.extend([CsvErrorModel(data) for data in raw_error_list]) + error_message_list.extend([data for data in raw_error_list]) mainte_csv_up = InstEmpCsvUploadViewModel( is_insert=True, diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index d3e6ec18..50331e20 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -137,8 +137,8 @@ {% if not mainte_csv_up.is_error_message_list_empty() %}
- {% for error in mainte_csv_up.error_message_list %} - {{error.error_message}}
+ {% for error_message in mainte_csv_up.error_message_list %} + {{error_message}}
{% endfor %}
{% elif mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} @@ -154,7 +154,7 @@ {% for item in mainte_csv_up.csv_upload_list %} - {% for key, value in item.csv_row.items() %} + {% for key, value in item.items() %} {{value}} {% endfor %} From 7d7e0640570cf3938c3df099f90f5ae3b09332ec Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Jul 2023 15:23:57 +0900 Subject: [PATCH 497/962] =?UTF-8?q?fix:=20=E3=82=B9=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=B3=E3=82=B0=E7=92=B0=E5=A2=83=E3=81=A7=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-restore-backup/.gitignore | 3 +- .../src/restore_backup.py | 39 ++++++++----------- .../src/system_var/environment.py | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-restore-backup/.gitignore b/ecs/jskult-restore-backup/.gitignore index cf44449e..d9a271c3 100644 --- a/ecs/jskult-restore-backup/.gitignore +++ b/ecs/jskult-restore-backup/.gitignore @@ -8,4 +8,5 @@ __pycache__ # python test .pytest_cache .coverage -.report/ \ No newline at end of file +.report/ +*.gz \ No newline at end of file diff --git a/ecs/jskult-restore-backup/src/restore_backup.py b/ecs/jskult-restore-backup/src/restore_backup.py index da481eaf..439fe4cf 100644 --- a/ecs/jskult-restore-backup/src/restore_backup.py +++ b/ecs/jskult-restore-backup/src/restore_backup.py @@ -33,39 +33,34 @@ def exec(): s3_file_path = environment.JSKULT_BACKUP_DUMP_S3_FILE_PATH # S3 URIになっているか確認 - s3_file_path_pattern = r"s3://([\w-]+)/dump/(\d{4})/(\d{2})/(\d{2})/backup_rds_(\d+).gz" + s3_file_path_pattern = r"s3://(.+)/dump/(\d{4})/(\d{2})/(\d{2})/backup_rds_src05_(\d+).gz" if re.match(s3_file_path_pattern, s3_file_path) is None: logger.warning('環境変数[JSKULT_BACKUP_DUMP_S3_FILE_PATH]に指定された、S3 URIの形式が不正です。') return constants.BATCH_EXIT_CODE_SUCCESS - # aws s3 cpコマンドを実行してdumpファイルを標準出力に取得する - s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, '-'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # gunzipコマンドを実行してdumpファイルを解凍する - gunzip_process = subprocess.Popen(['gzip', '-c'], stdin=s3_cp_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # mysqldumpコマンドを実行し、dumpを取得する - mysql_process = subprocess.Popen( - ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], - stdin=gunzip_process.stdout, stderr=subprocess.PIPE - ) - # aws s3 cpの標準出力をgunzipに接続したため、標準出力をクローズする - s3_cp_process.stdout.close() - # gunzipの標準出力をaws mysqlに接続したため、標準出力をクローズする - gunzip_process.stdout.close() - - # パイプラインを実行し、エラーハンドリング + # aws s3 cpコマンドを実行してdumpファイルをローカルにダウンロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS - _, error = gunzip_process.communicate() - if gunzip_process.returncode != 0: - logger.error(f'`gunzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') - return constants.BATCH_EXIT_CODE_SUCCESS + # S3コマンドの標準エラーはクローズしておく + s3_cp_process.stderr.close() + + # gzipコマンドを実行してdumpファイルを解凍する + gzip_process = subprocess.Popen(['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # mysqlコマンドを実行し、dumpを復元する + mysql_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], + stdin=gzip_process.stdout, stderr=subprocess.PIPE + ) + # gzipの標準出力をmysqlに接続したため、標準出力をクローズする + gzip_process.stdout.close() + _, error = mysql_process.communicate() if mysql_process.returncode != 0: - logger.error(f'`mysql`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS - logger.info('[NOTICE]実消化&アルトマークダンプ復元スクリプト:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-restore-backup/src/system_var/environment.py b/ecs/jskult-restore-backup/src/system_var/environment.py index 4ab083e0..ee0e9be3 100644 --- a/ecs/jskult-restore-backup/src/system_var/environment.py +++ b/ecs/jskult-restore-backup/src/system_var/environment.py @@ -8,7 +8,7 @@ DB_PASSWORD = os.environ['DB_PASSWORD'] DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS -JSKULT_BACKUP_DUMP_S3_FILE_PATH = os.environ['JSKULT_BACKUP_DUMP_FILE_PATH'] +JSKULT_BACKUP_DUMP_S3_FILE_PATH = os.environ['JSKULT_BACKUP_DUMP_S3_FILE_PATH'] # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From 5c310433ac7dfbf9ca4d26c1107d911e4b137029 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 18 Jul 2023 16:27:57 +0900 Subject: [PATCH 498/962] =?UTF-8?q?feat:=20=E8=A8=AD=E5=AE=9A=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E5=91=A8=E3=82=8A=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82*.gz=E3=82=92=E7=9C=81=E3=81=84=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-restore-backup/.dockerignore | 1 + ecs/jskult-restore-backup/.gitignore | 6 +++++- ecs/jskult-restore-backup/README.md | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-restore-backup/.dockerignore b/ecs/jskult-restore-backup/.dockerignore index 8b9da402..d826198a 100644 --- a/ecs/jskult-restore-backup/.dockerignore +++ b/ecs/jskult-restore-backup/.dockerignore @@ -10,3 +10,4 @@ Dockerfile pytest.ini README.md *.sql +*.gz diff --git a/ecs/jskult-restore-backup/.gitignore b/ecs/jskult-restore-backup/.gitignore index d9a271c3..339d80cc 100644 --- a/ecs/jskult-restore-backup/.gitignore +++ b/ecs/jskult-restore-backup/.gitignore @@ -1,6 +1,5 @@ .vscode/settings.json .env -my.cnf # python __pycache__ @@ -9,4 +8,9 @@ __pycache__ .pytest_cache .coverage .report/ + +# mysql config file +my.cnf + +# compress file *.gz \ No newline at end of file diff --git a/ecs/jskult-restore-backup/README.md b/ecs/jskult-restore-backup/README.md index f955ff97..e9dfa8f7 100644 --- a/ecs/jskult-restore-backup/README.md +++ b/ecs/jskult-restore-backup/README.md @@ -48,7 +48,9 @@ ```txt . -├── .env.example -- 環境変数のサンプル値 +├── .env.example -- ローカル実行用の環境変数のサンプル値。 +├── .dockerignore -- docker build時のコンテキストに含めるファイルの抑制リスト +├── .gitignore -- Git差分管理除外リスト ├── Dockerfile -- Dockerイメージ作成用 ├── Pipfile -- pythonの依存関係管理 ├── Pipfile.lock -- 依存関係バージョン固定 From 34e5be3e6864d522cd9ae27ab0d2783d847ba8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 18 Jul 2023 16:50:50 +0900 Subject: [PATCH 499/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 70 ++--------------- .../view/inst_emp_csv_download_view_model.py | 3 + .../repositories/emp_chg_inst_repository.py | 2 +- .../src/services/master_mainte_service.py | 77 +++++++++++++++---- .../static/function/businessLogicScript.js | 61 ++++++++------- .../src/templates/instEmpCsvDL.html | 4 +- .../src/templates/tableOverride.html | 4 +- 7 files changed, 108 insertions(+), 113 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index f251f57b..3fe61846 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -1,14 +1,9 @@ from io import BytesIO, TextIOWrapper -from datetime import datetime from typing import Optional -import pandas as pd from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse from starlette import status -from src.error.exceptions import DBException - - from src.depends.services import get_service from src.logging.get_logger import get_logger from src.model.internal.session import UserSession @@ -269,34 +264,12 @@ async def inst_emp_csv_download( if batch_status_service.is_dump_processing(): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) - search_result_df, _ = _search_emp_chg_inst_data(master_mainte_service, csv_download_form) - download_file_url = '' - if search_result_df.size > 0: - extract_df = _extract_output_df(search_result_df) + search_result_df = master_mainte_service.search_emp_chg_inst_data(csv_download_form) - # ファイル名に使用するタイムスタンプを初期化しておく - current_timestamp = datetime.now() - download_file_name = f'Result_{session.user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv' - - # ファイルを書き出し(CSV) - local_file_path = _write_emp_chg_inst_data_to_file(master_mainte_service, extract_df, download_file_name) - - # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する - try: - master_mainte_service.upload_emp_chg_inst_data_file(local_file_path) - download_file_url = master_mainte_service.generate_download_file_url(local_file_path) - except Exception as e: - logger.exception(f'S3 アクセスエラー{e}') - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail={'error': 'aws_error', 'message': e.args} - ) - if csv_download_form.select_table == 'dummy': - result_msg = f'ダミーテーブルのデータ{search_result_df.size}件をCSVファイルに出力しました' - else: - result_msg = f'本番テーブルのデータ{search_result_df.size}件をCSVファイルに出力しました' - else: - result_msg = '該当データが存在しないためCSVファイルを出力しませんでした' + (result_msg, download_file_url) = master_mainte_service.upload_emp_chg_inst_data_file( + search_result_df, + session.user_id, + csv_download_form.select_table) # 画面表示用のモデル mainte_csv_dl = InstEmpCsvDownloadViewModel( @@ -400,7 +373,7 @@ def table_override_result_view( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - table_override = master_mainte_service.prepare_mainte_table_override_view() + table_override = master_mainte_service.copy_data_real_to_dummy() # セッション書き換え session.update( @@ -419,34 +392,3 @@ def table_override_result_view( headers={'session_key': session.session_key} ) return templates_response - - -def _search_emp_chg_inst_data(master_mainte_service: MasterMainteService, - csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame: - try: - csv_download_form.unescape() - # 施設担当者データを検索 - search_result_df, query = master_mainte_service.search_download_emp_chg_inst_data(csv_download_form) - except DBException as e: - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail={'error': 'db_error', 'message': e.args} - ) - - return search_result_df, query - - -def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: - return search_result_df[constants.MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS] - - -def _write_emp_chg_inst_data_to_file( - master_mainte_service: MasterMainteService, - df: pd.DataFrame, - download_file_name: str -) -> str: - logger.info('CSVファイルを出力する') - local_file_path = master_mainte_service.write_csv_file( - df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name) - - return local_file_path diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py index e630615e..f35aa7cb 100644 --- a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -26,3 +26,6 @@ class InstEmpCsvDownloadViewModel(BaseModel): def is_select_table_empty(self): return not is_not_empty(self.select_table) + + def is_download_file_url_empty(self): + return not is_not_empty(self.download_file_url) diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 562ad642..04e8b0d7 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -195,7 +195,7 @@ class EmpChgInstRepository(BaseRepository): df = self._to_data_frame(query, parameter) logger.debug(f'count= {len(df.index)}') # ログ出力のため、クエリも返却 - return df, query + return df except Exception as e: logger.exception(f"DB Error : Exception={e.args}") raise e diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 36015fe2..54849b98 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -4,9 +4,13 @@ import html import pandas as pd +from fastapi import HTTPException from io import TextIOWrapper from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client +from src.error.exceptions import DBException +from starlette import status +from datetime import datetime from src.services.base_service import BaseService from src.system_var import constants, environment from src.repositories.base_repository import BaseRepository @@ -63,7 +67,7 @@ class MasterMainteService(BaseService): if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') - (table_name, _) = self.__target_table(csv_upload_form.select_table) + (table_name, _) = self.__choose_target_table(csv_upload_form.select_table) csv_items = MasterMainteCSVItems( file, @@ -105,7 +109,7 @@ class MasterMainteService(BaseService): user_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: - (table_name, selected_table_msg) = self.__target_table(csv_upload_form.select_table) + (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data)) @@ -138,7 +142,7 @@ class MasterMainteService(BaseService): ) return mainte_csv_up - def prepare_mainte_table_override_view(self) -> TableOverrideViewModel: + def copy_data_real_to_dummy(self) -> TableOverrideViewModel: try: self.emp_chginst_repository.connect() self.emp_chginst_repository.begin() @@ -151,15 +155,29 @@ class MasterMainteService(BaseService): finally: self.emp_chginst_repository.disconnect() + # コピー完了をマークして画面に返却 table_override = TableOverrideViewModel( is_override=True ) return table_override + def search_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame: + try: + csv_download_form.unescape() + # 施設担当者データを検索 + search_result_df = self.search_download_emp_chg_inst_data(csv_download_form) + except DBException as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'db_error', 'message': e.args} + ) + + return search_result_df + def search_download_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel): - (table_name, _) = self.__target_table(csv_download_form.select_table) - search_result_df, query = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form) - return search_result_df, query + (table_name, _) = self.__choose_target_table(csv_download_form.select_table) + search_result_df = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form) + return search_result_df def write_csv_file(self, data_frame: pd.DataFrame, header: list[str], download_file_name: str): # csvに書き込み @@ -176,19 +194,52 @@ class MasterMainteService(BaseService): return output_file_path - def upload_emp_chg_inst_data_file(self, local_file_path: str) -> None: - bucket_name = environment.MASTER_MAINTENANCE_BUCKET - file_key = f'data/{os.path.basename(local_file_path)}' - self.s3_client.upload_file(local_file_path, bucket_name, file_key) - # アップロード後、ローカルからは削除する - self.delete_local_file(local_file_path) + def upload_emp_chg_inst_data_file(self, df: pd.DataFrame, user_id: str, select_table: str) -> tuple[str, str]: + if df.size == 0: + return '該当データが存在しないためCSVファイルを出力しませんでした', '' + + # ファイル名に使用するタイムスタンプを初期化しておく + current_timestamp = datetime.now() + download_file_name = f'Result_{user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv' + + # ファイルを書き出し(CSV) + local_file_path = self.__write_emp_chg_inst_data_to_file(df, download_file_name) + + # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する + download_file_url = '' + try: + bucket_name = environment.MASTER_MAINTENANCE_BUCKET + file_key = f'data/{os.path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + # アップロード後、ローカルからは削除する + self.delete_local_file(local_file_path) + download_file_url = self.generate_download_file_url(local_file_path) + except Exception as e: + logger.exception(f'S3 アクセスエラー{e}') + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={'error': 'aws_error', 'message': e.args} + ) + if select_table == 'dummy': + result_msg = f'ダミーテーブルのデータ{df.size}件をCSVファイルに出力しました' + else: + result_msg = f'本番テーブルのデータ{df.size}件をCSVファイルに出力しました' + + return result_msg, download_file_url def generate_download_file_url(self, local_file_path: str) -> str: bucket_name = environment.MASTER_MAINTENANCE_BUCKET file_key = f'data/{os.path.basename(local_file_path)}' return self.s3_client.generate_presigned_url(bucket_name, file_key, constants.MENTE_CSV_DOWNLOAD_FILE_NAME) - def __target_table(self, select_table: str): + def __write_emp_chg_inst_data_to_file(self, df: pd.DataFrame, download_file_name: str) -> str: + logger.info('CSVファイルを出力する') + local_file_path = self.write_csv_file( + df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name) + + return local_file_path + + def __choose_target_table(self, select_table: str): if select_table == 'dummy': table_name = 'src05.emp_chg_inst_wrk' selected_table_msg = constants.CSV_CHANGE_TABLE_NAME diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 6311df44..be1c4498 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -176,69 +176,68 @@ function allOn(){ // 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること // 条件:ボタンにクラス名 send がついていること function allOff(){ - $(".selected").prop("checked", false); - $(".send").prop('disabled',true); + $(".selected").prop("checked", false); + $(".send").prop('disabled',true); } // 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数 // 条件:チェックボックスのクラス名に"selected"というのがついていること // 条件:ボタンにクラス名 send がついていること function resultBtDisablead(){ - var cnt1 = $('.checkNum input:checkbox:checked').length; - console.log(cnt1); + var cnt1 = $('.checkNum input:checkbox:checked').length; + console.log(cnt1); if(cnt1 == 0) { $(".send").prop('disabled',true); } else { - $(".send").prop('disabled',false); + $(".send").prop('disabled',false); } } // 数字-以外を許さない入力チェック function checkNumberForm($this) { - var str=$this.value; - while(str.match(/[^\d\-]/)) - { - str=str.replace(/[^\d\-]/,""); - } - $this.value=str; + 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; + var str=$this.value; + while(str.match(/[^\d]/)) + { + str=str.replace(/[^\d]/,""); + } + $this.value=str; } // メニューへボタンの関数 // 機能概要:マスターメンテメニュー画面に遷移する function backToMainteMenu(){ - location.href = "/menu/"; + location.href = "/menu/"; } // 確認ダイアログ function confirmDialog(strMesssage) { - var result = confirm(strMesssage); - return result; + var result = confirm(strMesssage); + return result; } function formInsertBtDisabled(){ - var validFlg = false; - if(document.getElementById("csvFile").value === ""){ - validFlg = true; - } + var validFlg = false; + if(document.getElementById("csvFile").value === ""){ + validFlg = true; + } - if (validFlg == true) { - document.getElementById("confirm").disabled = true; - } - else { - document.getElementById("confirm").disabled = false; - } + if (validFlg == true) { + document.getElementById("confirm").disabled = true; + } + else { + document.getElementById("confirm").disabled = false; + } } - diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 9d0b69d8..e52de75a 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -15,7 +15,7 @@ // DatePickerを有効化 enableDatePicker(); // CSV自動ダウンロード処理 -{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 %} +{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 and mainte_csv_dl.is_download_file_url_empty == False %} var link_tag = document.createElement("a"); link_tag.Target="_blank"; link_tag.id = "download_url_link"; @@ -46,7 +46,7 @@ - +
施設担当者データCSVダウンロード
diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 92648fd5..08a62407 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -25,7 +25,7 @@ - +
テーブル上書きコピー
@@ -43,7 +43,7 @@
- +
From f3e6369f50eadef9f3662c9f8cc0329721501c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 18 Jul 2023 17:50:09 +0900 Subject: [PATCH 500/962] =?UTF-8?q?datepicker=E3=81=A8=E3=81=AE=E6=88=A6?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/bio_sales_view.py | 67 ------------------- .../static/function/businessLogicScript.js | 30 +++++---- ecs/jskult-webapp/src/templates/_header.html | 2 + .../src/templates/bioSearchList.html | 8 ++- 4 files changed, 26 insertions(+), 81 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 8b28f225..59192b86 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -5,73 +5,6 @@ from src.model.db.base_db_model import BaseDBModel class BioSalesViewModel(BaseDBModel): - # conv_cd: Optional[int] - # rec_data: Optional[str] - # rec_whs_cd: Optional[str] - # rec_whs_sub_cd: Optional[str] - # rec_whs_org_cd: Optional[str] - # rec_cust_cd: Optional[str] - # rec_comm_cd: Optional[str] - # rec_tran_kbn: Optional[str] - # rev_hsdnymd_wrk: Optional[str] - # rev_hsdnymd_srk: Optional[str] - # rec_urag_num: Optional[str] - # rec_comm_name: Optional[str] - # rec_nonyu_fcl_name: Optional[str] - # rec_nonyu_fcl_addr: Optional[str] - # rec_lot_num: Optional[str] - # qty: Optional[str] - # rec_ymd: Optional[str] - # sale_data_cat: Optional[str] - # slip_file_name: Optional[str] - # slip_mgt_num: Optional[str] - # row_num: Optional[int] - # hsdn_ymd: Optional[str] - # exec_dt: Optional[str] - # v_tran_cd: Optional[int] - # tran_kbn_name: Optional[str] - # whs_org_cd: Optional[str] - # v_whsorg_cd: Optional[str] - # whs_org_name: Optional[str] - # whs_org_kn: Optional[str] - # v_whs_cd: Optional[int] - # whs_name: Optional[str] - # nonyu_fcl_cd: Optional[str] - # v_inst_cd: Optional[str] - # v_inst_kn: Optional[str] - # v_inst_nm: Optional[str] - # v_inst_addr: Optional[str] - # comm_cd: Optional[str] - # product_name: Optional[str] - # whs_rep_comm_name: Optional[str] - # whs_rep_nonyu_fcl_name: Optional[str] - # whs_rep_nonyu_fcl_addr: Optional[str] - # mkr_inf_1: Optional[str] - # mkr_cd: Optional[str] - # htdnymd_err_kbn: Optional[str] - # prd_exis_kbn: Optional[str] - # fcl_exis_kbn: Optional[str] - # amt: Optional[int] - # slip_org_kbn: Optional[str] - # bef_slip_mgt_num: Optional[str] - # lot_no_err_flg: Optional[str] - # iko_flg: Optional[str] - # kjyo_ym: Optional[str] - # tksnbk_kbn: Optional[str] - # fcl_exec_kbn: Optional[str] - # rec_sts_kbn: Optional[str] - # ins_dt: Optional[datetime] - # ins_usr: Optional[str] - # dcf_inst_cd: Optional[str] - # inst_cd: Optional[str] - # inst_name_form: Optional[str] - # address: Optional[str] - # tel_num: Optional[str] - # data_kbn: Optional[str] - # ser_no: Optional[str] - # lot_num: Optional[str] - # expr_dt: Optional[date] - # amt_fugo: Optional[str] slip_mgt_num: Optional[str] conv_cdR: Optional[int] rec_whs_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 7ce3b9ba..7447572e 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -84,6 +84,7 @@ function selectDropDowList(id, selectedName){ function enableDatePicker() { // カレンダーの表示を日曜日始まりに変更 flatpickr.l10ns.ja.firstDayOfWeek = 0; + $('.date_picker').flatpickr( { locale: 'ja', // 日本語カレンダー @@ -93,20 +94,22 @@ function enableDatePicker() { ) } +function setDatePicker() { + // カレンダーの表示を日曜日始まりに変更 + flatpickr.l10ns.ja.firstDayOfWeek = 0; + + $(".date_picker").datepicker({ + locale: 'ja', + dateFormat: 'YYY/mm/dd' + }); + +} + // 日付入力チェック // 引数:チェックするテキストボックスNo function autoModifyDate($this){ // 日付フォーマットチェック - - if($this.value === "" || - (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) - { - $this.value = ""; - return; - } - - /** @type { string }*/ - let strFormat = $this.value;; + let strFormat = $this.value; // yyyyMMddの場合→yyyy/MM/dd const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); if (datePatternMatches){ @@ -117,15 +120,16 @@ function autoModifyDate($this){ // 開始日の場合 if ($this.name.includes('from')){ strFormat = strFormat.replace("00/00", "01/01"); - strFormat = strFormat.replace("00", "01"); + strFormat = strFormat.replace("/00", "/01"); } // 終了日の場合 else if ($this.name.includes('to')){ strFormat = strFormat.replace("00/00", "12/31"); const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); - strFormat = strFormat.replace("00", date.toString()); + strFormat = strFormat.replace("/00", "/"+date.toString()); } - $this.value = strFormat; + $this.value = strFormat; + return false; } diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 01a1521a..adfa228d 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -15,3 +15,5 @@ + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 89436d67..7d07a22b 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -13,7 +13,8 @@ // ボタン、テキストボックス初期化 formBtDisabled(); // DatePickerを有効化 - enableDatePicker(); + setDatePicker(); + }); @@ -55,11 +56,13 @@ @@ -97,11 +100,13 @@ @@ -342,6 +347,7 @@ ` }) } + From e7c78ec8ae0c410689ca913285c78e478f7de6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 18 Jul 2023 17:58:22 +0900 Subject: [PATCH 501/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 4 +++- ecs/jskult-webapp/src/services/master_mainte_service.py | 3 +++ ecs/jskult-webapp/src/system_var/constants.py | 2 ++ ecs/jskult-webapp/src/templates/instEmpCsvDL.html | 4 ++-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 3fe61846..1538e02a 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -136,8 +136,10 @@ async def inst_emp_csv_upload( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル + csv_buf = await csv_upload_form.csv_file.read() mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( - TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), + TextIOWrapper(BytesIO(csv_buf), encoding='utf-8'), + len(csv_buf), csv_upload_form.csv_file.filename, csv_upload_form) # セッション書き換え diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 54849b98..b63ad123 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -59,6 +59,7 @@ class MasterMainteService(BaseService): def prepare_mainte_csv_up_view(self, file: TextIOWrapper, + file_size: int, csv_file_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: @@ -83,6 +84,8 @@ class MasterMainteService(BaseService): # CSVファイル0件(ヘッダ行のみ)チェック if len(csv_items.lines) == 0: error_message_list.append('選択されたExcelファイルの2行目以降に値が記入されておりません。') + elif file_size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE: + error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') else: for row_item in csv_items: error_message_list.extend([data for data in row_item.validate()]) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 0c021b73..e220249c 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -249,3 +249,5 @@ MENTE_CSV_DOWNLOAD_HEADER = [ ] MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv' + +MENTE_CSV_UPLOAD_MAX_FILE_SIZE = 104857600 diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index e52de75a..78bc147e 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -14,13 +14,13 @@ formBtDisabled(); // DatePickerを有効化 enableDatePicker(); +{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 and mainte_csv_dl.is_download_file_url_empty() == False %} // CSV自動ダウンロード処理 -{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 and mainte_csv_dl.is_download_file_url_empty == False %} var link_tag = document.createElement("a"); link_tag.Target="_blank"; link_tag.id = "download_url_link"; + link_tag.style.display = 'none'; link_tag.setAttribute("href", "{{mainte_csv_dl.download_file_url | safe}}"); - link_tag.setAttribute("type", "hidden"); link_tag.setAttribute("download", "{{mainte_csv_dl.file_name}}"); document.getElementById("notification").appendChild(link_tag); document.getElementById("download_url_link").click(); From 84053eebf550a0c73aa803ad32aa7ed5dd9eba56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 19 Jul 2023 09:37:20 +0900 Subject: [PATCH 502/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 22 ++++++++++++++----- .../repositories/emp_chg_inst_repository.py | 2 -- .../src/services/master_mainte_service.py | 5 +---- ecs/jskult-webapp/src/system_var/constants.py | 3 ++- .../src/templates/instEmpCsvDL.html | 3 +-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 1538e02a..f3fbd220 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -136,12 +136,22 @@ async def inst_emp_csv_upload( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - csv_buf = await csv_upload_form.csv_file.read() - mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( - TextIOWrapper(BytesIO(csv_buf), encoding='utf-8'), - len(csv_buf), - csv_upload_form.csv_file.filename, - csv_upload_form) + csv_upload_form.csv_file.file.seek(0, 2) + if csv_upload_form.csv_file.file.tell() >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: + error_message_list = [] + error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') + mainte_csv_up = InstEmpCsvUploadViewModel( + is_verified=True, + error_message_list=error_message_list, + select_function=csv_upload_form.select_function, + select_table=csv_upload_form.select_table + ) + else: + csv_upload_form.csv_file.file.seek(0) + mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( + TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), + csv_upload_form.csv_file.filename, + csv_upload_form) # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 04e8b0d7..ec6e5df3 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -188,13 +188,11 @@ class EmpChgInstRepository(BaseRepository): def fetch_as_data_frame(self, table_name: str, parameter: MasterMainteCsvDlModel): try: self._database.connect() - logger.debug('DB参照実行') where_clause = self.__build_condition(parameter) query = self.FETCH_SQL.format(table_name=table_name, where_clause=where_clause) logger.debug(f'SQL: {query}') df = self._to_data_frame(query, parameter) logger.debug(f'count= {len(df.index)}') - # ログ出力のため、クエリも返却 return df except Exception as e: logger.exception(f"DB Error : Exception={e.args}") diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index b63ad123..863ddfae 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -59,7 +59,6 @@ class MasterMainteService(BaseService): def prepare_mainte_csv_up_view(self, file: TextIOWrapper, - file_size: int, csv_file_name: str, csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel: @@ -84,8 +83,6 @@ class MasterMainteService(BaseService): # CSVファイル0件(ヘッダ行のみ)チェック if len(csv_items.lines) == 0: error_message_list.append('選択されたExcelファイルの2行目以降に値が記入されておりません。') - elif file_size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE: - error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') else: for row_item in csv_items: error_message_list.extend([data for data in row_item.validate()]) @@ -136,7 +133,7 @@ class MasterMainteService(BaseService): (result_message_list, raw_error_list) = emp_chg_inst.save() error_message_list = [] - error_message_list.extend([data for data in raw_error_list]) + error_message_list.extend(raw_error_list) mainte_csv_up = InstEmpCsvUploadViewModel( is_insert=True, diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index e220249c..a50d498e 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -250,4 +250,5 @@ MENTE_CSV_DOWNLOAD_HEADER = [ MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv' -MENTE_CSV_UPLOAD_MAX_FILE_SIZE = 104857600 +# CSVアップロードの制限サイズ=100MB +MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE = 104857600 diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 78bc147e..3a370f37 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -8,13 +8,12 @@ - - \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 7d07a22b..3a1fa7ab 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -13,8 +13,7 @@ // ボタン、テキストボックス初期化 formBtDisabled(); // DatePickerを有効化 - setDatePicker(); - + enableDatePicker(); }); @@ -56,13 +55,11 @@ @@ -100,13 +97,11 @@ From 0679ad944c946dca0d6d0ccf6164d1f5927bf3de Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 19 Jul 2023 15:13:44 +0900 Subject: [PATCH 505/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-restore-backup/entrypoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-restore-backup/entrypoint.py b/ecs/jskult-restore-backup/entrypoint.py index 2bacdf0c..70f48060 100644 --- a/ecs/jskult-restore-backup/entrypoint.py +++ b/ecs/jskult-restore-backup/entrypoint.py @@ -1,4 +1,4 @@ -"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" +"""実消化&アルトマーク DBダンプ復元のエントリーポイント""" from src import restore_backup if __name__ == '__main__': From 7bf776fd369c75753f4541f040f5d8792a174bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 19 Jul 2023 15:19:01 +0900 Subject: [PATCH 506/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=81=A8=E5=8D=98?= =?UTF-8?q?=E4=BD=93=E8=A9=A6=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 7 ++----- .../src/static/function/businessLogicScript.js | 2 +- ecs/jskult-webapp/src/templates/instEmpCsvDL.html | 4 ++-- ecs/jskult-webapp/src/templates/instEmpCsvUL.html | 2 +- ecs/jskult-webapp/src/templates/tableOverride.html | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index f3fbd220..f4274604 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -136,18 +136,15 @@ async def inst_emp_csv_upload( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - csv_upload_form.csv_file.file.seek(0, 2) - if csv_upload_form.csv_file.file.tell() >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: + if csv_upload_form.csv_file.size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: error_message_list = [] error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') mainte_csv_up = InstEmpCsvUploadViewModel( is_verified=True, error_message_list=error_message_list, select_function=csv_upload_form.select_function, - select_table=csv_upload_form.select_table - ) + select_table=csv_upload_form.select_table) else: - csv_upload_form.csv_file.file.seek(0) mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), csv_upload_form.csv_file.filename, diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index be1c4498..d3cd0d96 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -219,7 +219,7 @@ function checkNumberOnlyForm($this) // メニューへボタンの関数 // 機能概要:マスターメンテメニュー画面に遷移する function backToMainteMenu(){ - location.href = "/menu/"; + location.href = "/masterMainte/masterMainteMenu/"; } // 確認ダイアログ diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index fc105c2e..00ddd204 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -44,7 +44,7 @@

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

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

@@ -85,7 +85,7 @@ 適用期間内: - diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 50331e20..fe64b3cd 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -29,7 +29,7 @@

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

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

{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 08a62407..30fac4ea 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -24,7 +24,7 @@

- +
テーブル上書きコピー

テーブル上書きコピー

From 7a15f4a2b910f1e673b409e92723f99fc6d84b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 19 Jul 2023 15:58:31 +0900 Subject: [PATCH 507/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 3 --- .../src/services/bio_view_service.py | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index d02a709e..454ff857 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -60,9 +60,6 @@ async def download_bio_data( logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} - # ファイルに打ち出すカラムを抽出 - # extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - # ファイルを書き出し(Excel or CSV) local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 42885c83..97f7f22b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -162,8 +162,10 @@ class BioViewService(BaseService): def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -171,8 +173,10 @@ class BioViewService(BaseService): def upload_bio_access_log_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'log/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -180,8 +184,10 @@ class BioViewService(BaseService): def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) From 8329ad0b5138983d632a940f5b47f5e49eda4767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 19 Jul 2023 17:38:43 +0900 Subject: [PATCH 508/962] =?UTF-8?q?feat:=20=E3=82=AB=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=94=E3=83=83=E3=82=AB=E3=83=BC=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=81=AE=E5=8F=96=E3=82=8A=E8=BE=BC=E3=81=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/function/businessLogicScript.js | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index d3cd0d96..768a0ac1 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -84,51 +84,54 @@ function selectDropDowList(id, selectedName){ function enableDatePicker() { // カレンダーの表示を日曜日始まりに変更 flatpickr.l10ns.ja.firstDayOfWeek = 0; - $('.date_picker').flatpickr( - { + + $(".date_picker").each(function(i, elem) { + const date_picker_name = elem.name; + + flatpickr(elem, { locale: 'ja', // 日本語カレンダー allowInput: true, // 入力可能にする - dateFormat: 'Y/m/d' // 日付のフォーマットを修正 - } - ) + dateFormat: "YYYY/MM/DD", // 日付のフォーマット + onChange(_dates, currentDateString, _picker, _data) { + }, + parseDate: function(strFormat, format) { + + // yyyyMMddの場合→yyyy/MM/dd + const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); + if (datePatternMatches){ + strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; + } + + // yyyy/00/00~yyyy/00/00の場合→yyyy/01/01~yyyy/12/31 + // yyyy/MM/00~yyyy/MM/01の場合→yyyy/MM/01~yyyy/MM/末日 + // 開始日の場合 + if (date_picker_name.includes('from')){ + strFormat = strFormat.replace("/00/00", "/01/01"); + strFormat = strFormat.replace("/00", "/01"); + } + // 終了日の場合 + else if (date_picker_name.includes('to')){ + strFormat = strFormat.replace("/00/00", "/12/31"); + const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); + strFormat = strFormat.replace("/00", "/"+date.toString()); + } + return new Date(strFormat); + }, + formatDate: (date, format) => { + // 日付の整合性チェック、不正の場合は空表示 + if(isNaN(date.getDate())){ + return; + } + + // フォーマットを設定 + const formatted = flatpickr.formatDate(date,'Y/m/d'); + return formatted; + + } + }) + }); } -// 日付入力チェック -// 引数:チェックするテキストボックスNo -function autoModifyDate($this){ - // 日付フォーマットチェック - - if($this.value === "" || - (!$this.value.match(/^\d{4}\/\d{2}\/\d{2}$/) && !$this.value.match(/^\d{4}\d{2}\d{2}$/))) - { - $this.value = ""; - return; - } - - /** @type { string }*/ - let strFormat = $this.value;; - // yyyyMMddの場合→yyyy/MM/dd - const datePatternMatches = strFormat.match(/^(\d{4})(\d{2})(\d{2})$/); - if (datePatternMatches){ - strFormat = `${datePatternMatches[1]}/${datePatternMatches[2]}/${datePatternMatches[3]}`; - } - // yyyy/00/00~yyyy/00/00の場合→yyyy/01/01~yyyy/12/31 - // yyyy/MM/00~yyyy/MM/01の場合→yyyy/MM/01~yyyy/MM/末日 - // 開始日の場合 - if ($this.name.includes('from')){ - strFormat = strFormat.replace("00/00", "01/01"); - strFormat = strFormat.replace("00", "01"); - } - // 終了日の場合 - else if ($this.name.includes('to')){ - strFormat = strFormat.replace("00/00", "12/31"); - const date = new Date(strFormat.slice(0, 4), strFormat.slice(5, 7), 0).getDate(); - strFormat = strFormat.replace("00", date.toString()); - } - $this.value = strFormat; -} - - // 前のスペースを許さない入力チェック function checkSpaceForm($this) { From a4d38e73956542e2e4df9bdb9c737a9467f91fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 20 Jul 2023 09:44:27 +0900 Subject: [PATCH 509/962] =?UTF-8?q?feat:=20datepicker=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=81=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 2 +- .../src/model/request/master_mainte_csvdl.py | 22 ++++++++-------- .../view/inst_emp_csv_download_view_model.py | 2 +- .../repositories/emp_chg_inst_repository.py | 26 +++++++++---------- .../src/repositories/emp_master_repository.py | 4 +-- .../src/templates/instEmpCsvDL.html | 2 +- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index f4274604..93882d06 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -286,7 +286,7 @@ async def inst_emp_csv_download( ta_cd=csv_download_form.ta_cd, inst_cd=csv_download_form.inst_cd, emp_cd=csv_download_form.emp_cd, - apply_date=csv_download_form.apply_date, + apply_date_from=csv_download_form.apply_date_from, start_date_from=csv_download_form.start_date_from, start_date_to=csv_download_form.start_date_to, end_date_from=csv_download_form.end_date_from, diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py index 293674e3..48b29db5 100644 --- a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -16,8 +16,8 @@ class MasterMainteCsvDlModel(RequestBaseModel): adapt_inst_cd: Optional[str] emp_cd: Optional[str] adapt_emp_cd: Optional[str] - apply_date: Optional[str] - adapt_apply_date: Optional[str] + apply_date_from: Optional[str] + adapt_apply_date_from: Optional[str] start_date_from: Optional[str] adapt_start_date_from: Optional[str] start_date_to: Optional[str] @@ -42,7 +42,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd: Optional[str] = Form(None), ctrl_inst_cd: Optional[str] = Form(None), ctrl_emp_cd: Optional[str] = Form(None), - ctrl_apply_date: Optional[str] = Form(None), + ctrl_apply_date_from: Optional[str] = Form(None), ctrl_start_date_from: Optional[str] = Form(None), ctrl_start_date_to: Optional[str] = Form(None), ctrl_end_date_from: Optional[str] = Form(None), @@ -58,7 +58,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd, ctrl_inst_cd, ctrl_emp_cd, - ctrl_apply_date, + ctrl_apply_date_from, ctrl_start_date_from, ctrl_start_date_to, ctrl_end_date_from, @@ -75,7 +75,7 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_ta_cd: str, ctrl_inst_cd: str, ctrl_emp_cd: str, - ctrl_apply_date: str, + ctrl_apply_date_from: str, ctrl_start_date_from: str, ctrl_start_date_to: str, ctrl_end_date_from: str, @@ -90,11 +90,11 @@ class MasterMainteCsvDlModel(RequestBaseModel): ctrl_inst_cd = ctrl_inst_cd if is_not_empty(ctrl_inst_cd) else '' ctrl_emp_cd = ctrl_emp_cd if is_not_empty(ctrl_emp_cd) else '' - adapt_apply_date = '' - if is_not_empty(ctrl_apply_date): - adapt_apply_date = ctrl_apply_date.replace('/', '') + adapt_apply_date_from = '' + if is_not_empty(ctrl_apply_date_from): + adapt_apply_date_from = ctrl_apply_date_from.replace('/', '') else: - ctrl_apply_date = '' + ctrl_apply_date_from = '' adapt_start_date_from = '' adapt_start_date_to = '' @@ -147,8 +147,8 @@ class MasterMainteCsvDlModel(RequestBaseModel): adapt_inst_cd=ctrl_inst_cd, emp_cd=ctrl_emp_cd, adapt_emp_cd=ctrl_emp_cd, - apply_date=ctrl_apply_date, - adapt_apply_date=adapt_apply_date, + apply_date_from=ctrl_apply_date_from, + adapt_apply_date_from=adapt_apply_date_from, start_date_from=ctrl_start_date_from, adapt_start_date_from=adapt_start_date_from, start_date_to=ctrl_start_date_to, diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py index f35aa7cb..a0bd7f3d 100644 --- a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -9,7 +9,7 @@ class InstEmpCsvDownloadViewModel(BaseModel): ta_cd: Optional[str] = '' inst_cd: Optional[str] = '' emp_cd: Optional[str] = '' - apply_date: Optional[str] = '' + apply_date_from: Optional[str] = '' start_date_from: Optional[str] = '' start_date_to: Optional[str] = '' end_date_from: Optional[str] = '' diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index ec6e5df3..fbcfc962 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -219,59 +219,59 @@ class EmpChgInstRepository(BaseRepository): where_clauses.append(SQLCondition('eci.emp_cd', condition.LIKE, 'adapt_emp_cd')) # 適用期間内が入力されていた場合 - if is_not_empty(parameter.adapt_apply_date): - where_clauses.append(SQLCondition('eci.START_DATE', + if is_not_empty(parameter.adapt_apply_date_from): + where_clauses.append(SQLCondition('eci.start_date', condition.LE, - 'adapt_apply_date')) - where_clauses.append(SQLCondition('eci.END_DATE', + 'adapt_apply_date_from')) + where_clauses.append(SQLCondition('eci.end_date', condition.GE, - 'adapt_apply_date')) + 'adapt_apply_date_from')) # 適用開始日(FROM)が入力されていた場合 if is_not_empty(parameter.adapt_start_date_from): - where_clauses.append(SQLCondition('eci.START_DATE', + where_clauses.append(SQLCondition('eci.start_date', condition.GE, 'adapt_start_date_from')) # 適用開始日(TO)が入力されていた場合 if is_not_empty(parameter.adapt_start_date_to): - where_clauses.append(SQLCondition('eci.START_DATE', + where_clauses.append(SQLCondition('eci.start_date', condition.LE, 'adapt_start_date_to')) # 適用終了日(FROM)が入力されていた場合 if is_not_empty(parameter.adapt_end_date_from): - where_clauses.append(SQLCondition('eci.END_DATE', + where_clauses.append(SQLCondition('eci.end_date', condition.GE, 'adapt_end_date_from')) # 適用終了日(TO)が入力されていた場合 if is_not_empty(parameter.adapt_end_date_to): - where_clauses.append(SQLCondition('eci.END_DATE', + where_clauses.append(SQLCondition('eci.end_date', condition.LE, 'adapt_end_date_to')) # データ作成日(FROM)が入力されていた場合 if is_not_empty(parameter.adapt_create_date_from): - where_clauses.append(SQLCondition('eci.CREATE_DATE', + where_clauses.append(SQLCondition('eci.create_date', condition.GE, 'adapt_create_date_from')) # データ作成日(TO)が入力されていた場合 if is_not_empty(parameter.adapt_create_date_to): - where_clauses.append(SQLCondition('eci.CREATE_DATE', + where_clauses.append(SQLCondition('eci.create_date', condition.LE, 'adapt_create_date_to')) # データ作成日(FROM)が入力されていた場合 if is_not_empty(parameter.adapt_update_date_from): - where_clauses.append(SQLCondition('eci.UPDATE_DATE', + where_clauses.append(SQLCondition('eci.update_date', condition.GE, 'adapt_update_date_from')) # データ作成日(TO)が入力されていた場合 if is_not_empty(parameter.adapt_update_date_to): - where_clauses.append(SQLCondition('eci.UPDATE_DATE', + where_clauses.append(SQLCondition('eci.update_date', condition.LE, 'adapt_update_date_to')) diff --git a/ecs/jskult-webapp/src/repositories/emp_master_repository.py b/ecs/jskult-webapp/src/repositories/emp_master_repository.py index 6dfc08f5..8c278177 100644 --- a/ecs/jskult-webapp/src/repositories/emp_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_master_repository.py @@ -13,9 +13,9 @@ class EmpMasterRepository(BaseRepository): FROM src05.emp WHERE - emp.EMP_CD = :emp_cd + emp.emp_cd = :emp_cd AND str_to_date(emp.start_date, '%Y%m%d') <= str_to_date(:start_work_date, '%Y%m%d') - AND str_to_date(:start_work_date, '%Y%m%d') <= str_to_date(emp.END_DATE ,'%Y%m%d') + AND str_to_date(:start_work_date, '%Y%m%d') <= str_to_date(emp.end_date ,'%Y%m%d') """ def fetch_count(self, emp_cd, start_work_date) -> MasterMenteCountModel: diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 00ddd204..d8ac4d5b 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -85,7 +85,7 @@

適用期間内: - From 8cebb2c13251869213326f5647ccd627a4c3029c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 20 Jul 2023 10:14:09 +0900 Subject: [PATCH 510/962] =?UTF-8?q?feat:=202023=E5=B9=B47=E6=9C=88?= =?UTF-8?q?=E3=81=AE=E8=84=86=E5=BC=B1=E6=80=A7=E3=82=B9=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 707 +++++++++--------- .../check-view-security-option/Pipfile.lock | 62 +- 2 files changed, 398 insertions(+), 371 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 57f14241..37a67585 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,19 +26,19 @@ }, "boto3": { "hashes": [ - "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8", - "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434" + "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", + "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" ], "index": "pypi", - "version": "==1.26.156" + "version": "==1.28.5" }, "botocore": { "hashes": [ - "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda", - "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4" + "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", + "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" ], "markers": "python_version >= '3.7'", - "version": "==1.29.156" + "version": "==1.31.5" }, "certifi": { "hashes": [ @@ -119,109 +119,113 @@ }, "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" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "version": "==3.2.0" }, "cryptography": { "hashes": [ - "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" + "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", + "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", + "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", + "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", + "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", + "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", + "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", + "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", + "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", + "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", + "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", + "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", + "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", + "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", + "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", + "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", + "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", + "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", + "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", + "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", + "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", + "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" ], "markers": "python_version >= '3.7'", - "version": "==41.0.1" + "version": "==41.0.2" }, "idna": { "hashes": [ @@ -248,94 +252,109 @@ }, "lxml": { "hashes": [ - "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7", - "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726", - "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03", - "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140", - "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a", - "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05", - "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03", - "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419", - "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4", - "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e", - "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67", - "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50", - "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894", - "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf", - "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947", - "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1", - "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd", - "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3", - "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92", - "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3", - "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457", - "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74", - "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf", - "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1", - "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4", - "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975", - "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5", - "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe", - "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7", - "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1", - "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2", - "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409", - "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f", - "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f", - "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5", - "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24", - "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e", - "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4", - "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a", - "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c", - "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de", - "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f", - "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b", - "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5", - "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7", - "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a", - "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c", - "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9", - "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e", - "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab", - "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941", - "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5", - "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45", - "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7", - "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892", - "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746", - "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c", - "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53", - "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe", - "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184", - "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38", - "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df", - "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9", - "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b", - "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2", - "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0", - "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda", - "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b", - "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5", - "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380", - "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33", - "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8", - "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1", - "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889", - "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9", - "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f", - "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c" + "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3", + "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d", + "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a", + "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", + "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305", + "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287", + "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", + "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52", + "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", + "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4", + "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584", + "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f", + "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693", + "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef", + "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", + "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02", + "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc", + "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7", + "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", + "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a", + "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", + "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", + "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", + "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601", + "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", + "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", + "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2", + "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c", + "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129", + "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", + "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2", + "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1", + "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", + "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", + "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477", + "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d", + "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", + "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7", + "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2", + "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574", + "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", + "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", + "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98", + "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12", + "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", + "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", + "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", + "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", + "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d", + "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", + "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", + "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4", + "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", + "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", + "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2", + "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", + "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96", + "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d", + "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", + "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", + "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", + "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", + "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", + "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458", + "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", + "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c", + "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", + "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", + "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", + "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", + "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf", + "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb", + "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b", + "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833", + "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", + "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85", + "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e", + "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", + "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8", + "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", + "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", + "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5", + "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190", + "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", + "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", + "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", + "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9", + "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0", + "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", + "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", + "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", + "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.2" + "version": "==4.9.3" }, "platformdirs": { "hashes": [ - "sha256:57e28820ca8094678b807ff529196506d7a21e17156cb1cddb3e74cebce54640", - "sha256:ffa199e3fbab8365778c4a10e1fbf1b9cd50707de826eb304b50e57ec0cc8d38" + "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421", + "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f" ], "markers": "python_version >= '3.7'", - "version": "==3.6.0" + "version": "==3.9.1" }, "pycparser": { "hashes": [ @@ -346,11 +365,11 @@ }, "pyjwt": { "hashes": [ - "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", - "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074" + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "markers": "python_version >= '3.7'", - "version": "==2.7.0" + "version": "==2.8.0" }, "python-dateutil": { "hashes": [ @@ -450,19 +469,19 @@ }, "boto3": { "hashes": [ - "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8", - "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434" + "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", + "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" ], "index": "pypi", - "version": "==1.26.156" + "version": "==1.28.5" }, "botocore": { "hashes": [ - "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda", - "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4" + "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", + "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" ], "markers": "python_version >= '3.7'", - "version": "==1.29.156" + "version": "==1.31.5" }, "certifi": { "hashes": [ @@ -543,84 +562,84 @@ }, "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" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "version": "==3.2.0" }, "coverage": { "extras": [ @@ -693,36 +712,40 @@ }, "cryptography": { "hashes": [ - "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" + "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", + "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", + "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", + "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", + "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", + "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", + "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", + "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", + "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", + "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", + "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", + "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", + "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", + "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", + "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", + "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", + "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", + "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", + "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", + "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", + "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", + "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" ], "markers": "python_version >= '3.7'", - "version": "==41.0.1" + "version": "==41.0.2" }, "exceptiongroup": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5", + "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" ], "markers": "python_version < '3.11'", - "version": "==1.1.1" + "version": "==1.1.2" }, "flake8": { "hashes": [ @@ -830,11 +853,11 @@ }, "moto": { "hashes": [ - "sha256:5003126c46ce70fe351ff1cb67dc8d9a5983f403fae13b7628b0fb503d19039e", - "sha256:f3e966ba1460751e19eab5356545813b29c05478b47eb0da445d688949339be2" + "sha256:9650d05d89b6f97043695548fbc0d8fb293f4177daaebbcee00bb0d171367f1a", + "sha256:dd3e2ad920ab8b058c4f62fa7c195b788bd1f018cc701a1868ff5d5c4de6ed47" ], "index": "pypi", - "version": "==4.1.11" + "version": "==4.1.13" }, "packaging": { "hashes": [ @@ -846,11 +869,11 @@ }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.7'", + "version": "==1.2.0" }, "py": { "hashes": [ @@ -885,11 +908,11 @@ }, "pytest": { "hashes": [ - "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295", - "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b" + "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", + "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a" ], "index": "pypi", - "version": "==7.3.2" + "version": "==7.4.0" }, "pytest-cov": { "hashes": [ @@ -925,49 +948,49 @@ }, "pyyaml": { "hashes": [ - "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", - "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", - "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", - "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", - "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", - "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", - "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", - "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", - "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", - "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", - "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", - "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", - "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", - "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", - "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", - "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", - "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", - "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", - "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", - "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", - "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", - "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", - "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", - "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", - "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", - "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", - "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", - "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", - "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", - "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", - "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", - "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", - "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", - "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", - "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", - "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", - "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", - "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", - "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", - "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "markers": "python_version >= '3.6'", - "version": "==6.0" + "version": "==6.0.1" }, "requests": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index 20ed5593..f3ad1a40 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -43,19 +43,19 @@ }, "boto3": { "hashes": [ - "sha256:3a60283676399ae94b49b7a170fb0f42ca2ddcde490988fb0af7fd5a64440ab8", - "sha256:455b6e1f12768b21b5f3990cf1fadeed9bf1c6b36e5a7a303352b927f530c434" + "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", + "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" ], "index": "pypi", - "version": "==1.26.156" + "version": "==1.28.5" }, "botocore": { "hashes": [ - "sha256:21d0c2cb1461f2676e41a896e6e551c7da09e923f416322182520851b179ebda", - "sha256:44b26a5468402bb9e5028d8f9ef2eba973cde016979aa72f87db32ef9000dab4" + "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", + "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" ], "markers": "python_version >= '3.7'", - "version": "==1.29.156" + "version": "==1.31.5" }, "cffi": { "hashes": [ @@ -128,28 +128,32 @@ }, "cryptography": { "hashes": [ - "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" + "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", + "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", + "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", + "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", + "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", + "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", + "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", + "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", + "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", + "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", + "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", + "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", + "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", + "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", + "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", + "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", + "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", + "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", + "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", + "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", + "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", + "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" ], "index": "pypi", - "version": "==41.0.1" + "version": "==41.0.2" }, "jmespath": { "hashes": [ @@ -168,11 +172,11 @@ }, "pymysql": { "hashes": [ - "sha256:3dda943ef3694068a75d69d071755dbecacee1adf9a1fc5b206830d2b67d25e8", - "sha256:89fc6ae41c0aeb6e1f7710cdd623702ea2c54d040565767a78b00a5ebb12f4e5" + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", - "version": "==1.0.3" + "version": "==1.1.0" }, "python-dateutil": { "hashes": [ From 68339d28a03a95db1fc287e7e4595fd027e4b70c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 21 Jul 2023 15:08:11 +0900 Subject: [PATCH 511/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 3 ++- .../src/model/request/master_mainte_csvdl.py | 8 ++++---- .../view/inst_emp_csv_upload_view_model.py | 5 +---- .../repositories/emp_chg_inst_repository.py | 6 +++--- .../src/services/master_mainte_service.py | 19 +++++++++++++------ .../src/templates/instEmpCsvUL.html | 6 +++--- 6 files changed, 26 insertions(+), 21 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 93882d06..e6778b02 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -296,7 +296,7 @@ async def inst_emp_csv_download( update_date_from=csv_download_form.update_date_from, update_date_to=csv_download_form.update_date_to, select_table=csv_download_form.select_table, - data_count=search_result_df.size, + data_count=search_result_df.shape[0], download_file_url=download_file_url, file_name=constants.MENTE_CSV_DOWNLOAD_FILE_NAME, result_msg=result_msg @@ -310,6 +310,7 @@ async def inst_emp_csv_download( ] ) set_session(session) + templates_response = templates.TemplateResponse( 'instEmpCsvDL.html', { diff --git a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py index 48b29db5..4155fa73 100644 --- a/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py +++ b/ecs/jskult-webapp/src/model/request/master_mainte_csvdl.py @@ -121,22 +121,22 @@ class MasterMainteCsvDlModel(RequestBaseModel): adapt_create_date_from = '' adapt_create_date_to = '' if is_not_empty(ctrl_create_date_from): - adapt_create_date_from = ctrl_create_date_from.replace('/', '') + adapt_create_date_from = ctrl_create_date_from.replace('/', '-') + ' 00:00:00' else: ctrl_create_date_from = '' if is_not_empty(ctrl_create_date_to): - adapt_create_date_to = ctrl_create_date_to.replace('/', '') + adapt_create_date_to = ctrl_create_date_to.replace('/', '-') + ' 23:59:59' else: ctrl_create_date_to = '' adapt_update_date_from = '' adapt_update_date_to = '' if is_not_empty(ctrl_update_date_from): - adapt_update_date_from = ctrl_update_date_from.replace('/', '') + adapt_update_date_from = ctrl_update_date_from.replace('/', '-') + ' 00:00:00' else: ctrl_update_date_from = '' if is_not_empty(ctrl_update_date_to): - adapt_update_date_to = ctrl_update_date_to.replace('/', '') + adapt_update_date_to = ctrl_update_date_to.replace('/', '-') + ' 23:59:59' else: ctrl_update_date_to = '' 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 index 0fd15fcc..b2ab8051 100644 --- 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 @@ -15,10 +15,7 @@ class InstEmpCsvUploadViewModel(BaseModel): csv_upload_list: Optional[list[dict]] json_upload_data: Optional[str] result_message_list: Optional[list[str]] - dialog_msg: Optional[str] - - def select_function_message(self): - return '新規施設登録' if self.select_function == 'new' else '施設担当者変更' + select_function_message: Optional[str] def select_table_message(self): return self.__dummy_table() if self.select_table == 'dummy' else self.__real_table() diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index fbcfc962..84de084f 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -192,7 +192,7 @@ class EmpChgInstRepository(BaseRepository): query = self.FETCH_SQL.format(table_name=table_name, where_clause=where_clause) logger.debug(f'SQL: {query}') df = self._to_data_frame(query, parameter) - logger.debug(f'count= {len(df.index)}') + logger.debug(f'count= {df.shape[0]}') return df except Exception as e: logger.exception(f"DB Error : Exception={e.args}") @@ -263,13 +263,13 @@ class EmpChgInstRepository(BaseRepository): condition.LE, 'adapt_create_date_to')) - # データ作成日(FROM)が入力されていた場合 + # データ更新日(FROM)が入力されていた場合 if is_not_empty(parameter.adapt_update_date_from): where_clauses.append(SQLCondition('eci.update_date', condition.GE, 'adapt_update_date_from')) - # データ作成日(TO)が入力されていた場合 + # データ更新日(TO)が入力されていた場合 if is_not_empty(parameter.adapt_update_date_to): where_clauses.append(SQLCondition('eci.update_date', condition.LE, diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 863ddfae..74da9b68 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -67,7 +67,7 @@ class MasterMainteService(BaseService): if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real': raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}') - (table_name, _) = self.__choose_target_table(csv_upload_form.select_table) + (table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table) csv_items = MasterMainteCSVItems( file, @@ -101,7 +101,10 @@ class MasterMainteService(BaseService): select_table=csv_upload_form.select_table, csv_upload_list=csv_upload_list, json_upload_data=json_upload_data, - csv_file_name=csv_file_name + csv_file_name=csv_file_name, + select_function_message=self.__make_dialog_confirm_message( + csv_upload_form.select_function, + selected_table_msg) ) return mainte_csv_up @@ -190,12 +193,12 @@ class MasterMainteService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + output_df.to_csv(output_file_path, encoding="utf-8_sig", index=False, header=False) return output_file_path def upload_emp_chg_inst_data_file(self, df: pd.DataFrame, user_id: str, select_table: str) -> tuple[str, str]: - if df.size == 0: + if df.shape[0] == 0: return '該当データが存在しないためCSVファイルを出力しませんでした', '' # ファイル名に使用するタイムスタンプを初期化しておく @@ -221,9 +224,9 @@ class MasterMainteService(BaseService): detail={'error': 'aws_error', 'message': e.args} ) if select_table == 'dummy': - result_msg = f'ダミーテーブルのデータ{df.size}件をCSVファイルに出力しました' + result_msg = f'ダミーテーブルのデータ{df.shape[0]}件をCSVファイルに出力しました' else: - result_msg = f'本番テーブルのデータ{df.size}件をCSVファイルに出力しました' + result_msg = f'本番テーブルのデータ{df.shape[0]}件をCSVファイルに出力しました' return result_msg, download_file_url @@ -250,5 +253,9 @@ class MasterMainteService(BaseService): raise Exception(f'登録テーブルの選択値が不正です: {select_table}') return (table_name, selected_table_msg) + def __make_dialog_confirm_message(self, select_function: str, selected_table_msg: str) -> str: + select_function_msg = '新規施設登録' if select_function == 'new' else '施設担当者変更' + return f'{selected_table_msg}に{select_function_msg}を行いますか?' + def delete_local_file(self, local_file_path: str): os.remove(local_file_path) diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index fe64b3cd..178bdd18 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -13,7 +13,7 @@ } function Form_Submit_Disp_Dialog(){ - var msg = '{{ mainte_csv_up.select_function_message() }}'; + var msg = '{{ mainte_csv_up.select_function_message }}'; if (confirmDialog(msg)) { document.getElementById("loading").style.display = "block"; document.getElementById("ulMsg").style.display = "none"; @@ -29,7 +29,7 @@

- + - + @@ -75,7 +75,7 @@ From 27cd48aeddb04bf2dba9453af1a8d6cc5322af88 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 5 Oct 2023 10:34:06 +0900 Subject: [PATCH 754/962] =?UTF-8?q?fix:=20=E3=83=80=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E6=99=82=E3=81=AB=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E5=AF=9D=E5=85=B7=E3=81=8C=E5=87=BA=E3=81=AA=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/bioSearchList.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 9acfdbba..8bdfbaeb 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -194,7 +194,7 @@ // CSV/Excelダウンロード処理 function download(ext) { // ローディング開始 - const loading = new Loading(''); + const loading = new Loading(); loading.start(); // ダウンロード固有のパラメータを設定 From 4fc3ed927ce66cbcd289752207fcfb15d01978cf Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 5 Oct 2023 15:05:03 +0900 Subject: [PATCH 755/962] =?UTF-8?q?feat:=20=E4=BB=B6=E6=95=B0=E3=81=AE?= =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7=E3=83=A5=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio_api.py | 3 +++ ecs/jskult-webapp/src/model/internal/session.py | 5 ++++- ecs/jskult-webapp/src/services/bio_view_service.py | 8 +++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_api.py b/ecs/jskult-webapp/src/controller/bio_api.py index 9107b109..982ef8d2 100644 --- a/ecs/jskult-webapp/src/controller/bio_api.py +++ b/ecs/jskult-webapp/src/controller/bio_api.py @@ -69,6 +69,9 @@ def search_bio_data( actions=[ UserSession.last_access_time.set(UserSession.new_last_access_time()), UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()), + # 検索結果をキャッシュする + UserSession.bio_search_condition.set(bio_form.model_dump()), + UserSession.bio_search_count.set(bio_sales_lot_count), ] ) set_session(session) diff --git a/ecs/jskult-webapp/src/model/internal/session.py b/ecs/jskult-webapp/src/model/internal/session.py index 99233a1e..cba115a3 100644 --- a/ecs/jskult-webapp/src/model/internal/session.py +++ b/ecs/jskult-webapp/src/model/internal/session.py @@ -1,7 +1,8 @@ import datetime import uuid -from pynamodb.attributes import NumberAttribute, UnicodeAttribute +from pynamodb.attributes import (JSONAttribute, NumberAttribute, + UnicodeAttribute) from pynamodb.models import Model as DynamoDBTableModel from src.system_var import environment @@ -23,6 +24,8 @@ class UserSession(DynamoDBTableModel): csrf_token = UnicodeAttribute() last_access_time = NumberAttribute() record_expiration_time = NumberAttribute() + bio_search_condition = JSONAttribute(null=True, default=None) + bio_search_count = NumberAttribute(null=True, default=None) @classmethod def new_last_access_time(cls): diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 1402bbd0..bbf01bcb 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -72,7 +72,13 @@ class BioViewService(BaseService): return display_bio_data def count_bio_data(self, search_params: BioModel, session: UserSession) -> int: - # 生物由来データの件数を取得 + # 検索値が前回検索時と変更がない場合、キャッシュした件数を返す + previous_search_params = session.bio_search_condition + current_search_params = search_params.model_dump() + if previous_search_params == current_search_params: + return session.bio_search_count + + # 生物由来データの件数をDBから取得 bio_sales_data_count = self.bio_sales_repository.fetch_count(parameter=search_params) return bio_sales_data_count From 5ab68522275ab50b90a093918447ebfde605861c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 5 Oct 2023 15:10:25 +0900 Subject: [PATCH 756/962] =?UTF-8?q?feat:=20=E4=BE=9D=E5=AD=98=E9=96=A2?= =?UTF-8?q?=E4=BF=82=E6=9C=80=E6=96=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/Pipfile.lock | 1018 +++++++++++++++++--------------- 1 file changed, 529 insertions(+), 489 deletions(-) diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock index 2cdd0507..3bb85765 100644 --- a/ecs/jskult-webapp/Pipfile.lock +++ b/ecs/jskult-webapp/Pipfile.lock @@ -26,27 +26,27 @@ }, "anyio": { "hashes": [ - "sha256:48d53f0b141f5757c38d648309e6fe254857fae092d67f938fa248d7c0f36804", - "sha256:596b09c520820e7eed961ddc889540972f92d5e8fcb081117fc054c409df34ae" + "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", + "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" ], - "markers": "python_version >= '3.8'", - "version": "==4.0.0rc1" + "markers": "python_version >= '3.7'", + "version": "==3.7.1" }, "boto3": { "hashes": [ - "sha256:87ecac82d2a68430c0292b7946512c8b1f01ea6971b43dc5832582fcb176c0dd", - "sha256:f2ec3e6f173fe8d141d512ea7d90138db5a58af130773e26ce8e72bdbfd2cddc" + "sha256:d5f270c2c9a051f78c308cbba4268458e8df441057b73ba140742707ac1bc7ea", + "sha256:dccb49cc10b31314b8553c6c9614c44b2249e0d0285d73f608a5d2010f6e1d82" ], "index": "pypi", - "version": "==1.28.18" + "version": "==1.28.60" }, "botocore": { "hashes": [ - "sha256:909db57f5d6ca765fc9dc9dcae962a87566d0123da1d2bd5be32432493d5785e", - "sha256:c4c01fae2ba32c242ce62175cad719aa49415618560d6e215ed76dab91991dc5" + "sha256:578470a15a5bd64f67437a81f23feccba85084167acf63c56acada2c1c1d95d8", + "sha256:b6de7a6a03ca3da18b78615a2cb5221c9fdb9483d3f50cb4281ae038b3f22d9f" ], "markers": "python_version >= '3.7'", - "version": "==1.31.18" + "version": "==1.31.60" }, "certifi": { "hashes": [ @@ -58,189 +58,193 @@ }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "version": "==1.15.1" + "markers": "python_version >= '3.8'", + "version": "==1.16.0" }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", + "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", + "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", + "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", + "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", + "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", + "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", + "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", + "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", + "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", + "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", + "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", + "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", + "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", + "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", + "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", + "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", + "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", + "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", + "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", + "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", + "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", + "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", + "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", + "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", + "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", + "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", + "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", + "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", + "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", + "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", + "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", + "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", + "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", + "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", + "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", + "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", + "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", + "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", + "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", + "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", + "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", + "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", + "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", + "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", + "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", + "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", + "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", + "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", + "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", + "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", + "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", + "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", + "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", + "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", + "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", + "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", + "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", + "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", + "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", + "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", + "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", + "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", + "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", + "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", + "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", + "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", + "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", + "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", + "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", + "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", + "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", + "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", + "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", + "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", + "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", + "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", + "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", + "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", + "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", + "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", + "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", + "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", + "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", + "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", + "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", + "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", + "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", + "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", + "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" + "version": "==3.3.0" }, "click": { "hashes": [ - "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", - "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.6" + "version": "==8.1.7" }, "cryptography": { "hashes": [ - "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306", - "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84", - "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47", - "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d", - "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116", - "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207", - "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81", - "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087", - "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd", - "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507", - "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858", - "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae", - "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34", - "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906", - "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd", - "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922", - "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7", - "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4", - "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574", - "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1", - "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c", - "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e", - "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de" + "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67", + "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311", + "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8", + "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13", + "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143", + "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f", + "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829", + "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd", + "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397", + "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac", + "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d", + "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a", + "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839", + "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e", + "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6", + "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9", + "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860", + "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca", + "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91", + "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d", + "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714", + "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb", + "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f" ], - "version": "==41.0.3" + "version": "==41.0.4" }, "et-xmlfile": { "hashes": [ @@ -252,84 +256,87 @@ }, "exceptiongroup": { "hashes": [ - "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5", - "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.1.2" + "version": "==1.1.3" }, "fastapi": { "hashes": [ - "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23", - "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32" + "sha256:3270de872f0fe9ec809d4bd3d4d890c6d5cc7b9611d721d6438f9dacc8c4ef2e", + "sha256:75a11f6bfb8fc4d2bec0bd710c2d5f2829659c0e8c0afd5560fdda6ce25ec653" ], "index": "pypi", - "version": "==0.100.1" + "version": "==0.103.2" }, "greenlet": { "hashes": [ - "sha256:0a9dfcadc1d79696e90ccb1275c30ad4ec5fd3d1ab3ae6671286fac78ef33435", - "sha256:0f313771cb8ee0a04dfdf586b7d4076180d80c94be09049daeea018089b5b957", - "sha256:17503397bf6cbb5e364217143b6150c540020c51a3f6b08f9a20cd67c25e2ca8", - "sha256:180ec55cb127bc745669eddc9793ffab6e0cf7311e67e1592f183d6ca00d88c1", - "sha256:1b3f3568478bc21b85968e8038c4f98f4bf0039a692791bc324b5e0d1522f4b1", - "sha256:1bd4ea36f0aeb14ca335e0c9594a5aaefa1ac4e2db7d86ba38f0be96166b3102", - "sha256:21ebcb570e0d8501457d6a2695a44c5af3b6c2143dc6644ec73574beba067c90", - "sha256:24071eee113d75fedebaeb86264d94f04b5a24e311c5ba3e8003c07d00112a7e", - "sha256:270432cfdd6a50016b8259b3bbf398a3f7c06a06f2c68c7b93e49f53bc193bcf", - "sha256:271ed380389d2f7e4c1545b6e0837986e62504ab561edbaff05da9c9f3f98f96", - "sha256:2840187a94e258445e62ff1545e34f0b1a14aef4d0078e5c88246688d2b6515e", - "sha256:2cda110faee67613fed221f90467003f477088ef1cc84c8fc88537785a5b4de9", - "sha256:2e160a65cc6023a237be870f2072513747d512a1d018efa083acce0b673cccc0", - "sha256:2fcf7af83516db35af3d0ed5d182dea8585eddd891977adff1b74212f4bfd2fd", - "sha256:36cebce1f30964d5672fd956860e7e7b69772da69658d5743cb676b442eeff36", - "sha256:42bfe67824a9b53e73f568f982f0d1d4c7ac0f587d2e702a23f8a7b505d7b7c2", - "sha256:450a7e52a515402fd110ba807f1a7d464424bfa703be4effbcb97e1dfbfcc621", - "sha256:463d63ca5d8c236788284a9a44b9715372a64d5318a6b5eee36815df1ea0ba3d", - "sha256:4d0c0ffd732466ff324ced144fad55ed5deca36f6036c1d8f04cec69b084c9d6", - "sha256:4ff2a765f4861fc018827eab4df1992f7508d06c62de5d2fe8a6ac2233d4f1d0", - "sha256:53abf19b7dc62795c67b8d0a3d8ef866db166b21017632fff2624cf8fbf3481c", - "sha256:5552d7be37d878e9b6359bbffa0512d857bb9703616a4c0656b49c10739d5971", - "sha256:585810056a8adacd3152945ebfcd25deb58335d41f16ae4e0f3d768918957f9a", - "sha256:5942b1d6ba447cff1ec23a21ec525dde2288f00464950bc647f4e0f03bd537d1", - "sha256:5c355c99be5bb23e85d899b059a4f22fdf8a0741c57e7029425ee63eb436f689", - "sha256:5f61df4fe07864561f49b45c8bd4d2c42e3f03d2872ed05c844902a58b875028", - "sha256:665942d3a954c3e4c976581715f57fb3b86f4cf6bae3ac30b133f8ff777ac6c7", - "sha256:68368e908f14887fb202a81960bfbe3a02d97e6d3fa62b821556463084ffb131", - "sha256:6aac94ff957b5dea0216af71ab59c602e1b947b394e4f5e878a5a65643090038", - "sha256:889934aa8d72b6bfc46babd1dc4b817a56c97ec0f4a10ae7551fb60ab1f96fae", - "sha256:a00550757fca1b9cbc479f8eb1cf3514dbc0103b3f76eae46341c26ddcca67a9", - "sha256:a4a2d6ed0515c05afd5cc435361ced0baabd9ba4536ddfe8ad9a95bcb702c8ce", - "sha256:a8dd92fd76a61af2abc8ccad0c6c6069b3c4ebd4727ecc9a7c33aae37651c8c7", - "sha256:ab81f9ff3e3c2ca65e824454214c10985a846cd9bee5f4d04e15cd875d9fe13b", - "sha256:ac10196b8cde7a082e4e371ff171407270d3337c8d57ed43030094eb01d9c95c", - "sha256:b767930af686551dc96a5eb70af3736709d547ffa275c11a5e820bfb3ae61d8d", - "sha256:b9a1f4d256b81f59ba87bb7a29b9b38b1c018e052dba60a543cb0ddb5062d159", - "sha256:ba94c08321b5d345100fc64eb1ab235f42faf9aabba805cface55ebe677f1c2c", - "sha256:bab71f73001cd15723c4e2ca398f2f48e0a3f584c619eefddb1525e8986e06eb", - "sha256:bce5cf2b0f0b29680396c5c98ab39a011bd70f2dfa8b8a6811a69ee6d920cf9f", - "sha256:c02e514c72e745e49a3ae7e672a1018ba9b68460c21e0361054e956e5d595bc6", - "sha256:c3fb459ced6c5e3b2a895f23f1400f93e9b24d85c30fbe2d637d4f7706a1116b", - "sha256:cd31ab223e43ac64fd23f8f5dad249addadac2a459f040546200acbf7e84e353", - "sha256:ce70aa089ec589b5d5fab388af9f8c9f9dfe8fe4ad844820a92eb240d8628ddf", - "sha256:d47b2e1ad1429da9aa459ef189fbcd8a74ec28a16bc4c3f5f3cf3f88e36535eb", - "sha256:d61bad421c1f496f9fb6114dbd7c30a1dac0e9ff90e9be06f4472cbd8f7a1704", - "sha256:d7ba2e5cb119eddbc10874b41047ad99525e39e397f7aef500e6da0d6f46ab91", - "sha256:dde0ab052c7a1deee8d13d72c37f2afecee30ebdf6eb139790157eaddf04dd61", - "sha256:df34b52aa50a38d7a79f3abc9fda7e400791447aa0400ed895f275f6d8b0bb1f", - "sha256:e0fc20e6e6b298861035a5fc5dcf9fbaa0546318e8bda81112591861a7dcc28f", - "sha256:e20d5e8dc76b73db9280464d6e81bea05e51a99f4d4dd29c5f78dc79f294a5d3", - "sha256:e31d1a33dc9006b278f72cb0aacfe397606c2693aa2fdc0c2f2dcddbad9e0b53", - "sha256:e3a99f890f2cc5535e1b3a90049c6ca9ff9da9ec251cc130c8d269997f9d32ee", - "sha256:e7b192c3df761d0fdd17c2d42d41c28460f124f5922e8bd524018f1d35610682", - "sha256:ed0f4fad4c3656e34d20323a789b6a2d210a6bb82647d9c86dded372f55c58a1", - "sha256:f34ec09702be907727fd479046193725441aaaf7ed4636ca042734f469bb7451", - "sha256:f3530c0ec1fc98c43d5b7061781a8c55bd0db44f789f8152e19d9526cbed6021", - "sha256:f5672082576d0e9f52fa0fa732ff57254d65faeb4a471bc339fe54b58b3e79d2", - "sha256:ffb9f8969789771e95d3c982a36be81f0adfaa7302a1d56e29f168ca15e284b8" + "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a", + "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c", + "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9", + "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d", + "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14", + "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383", + "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b", + "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99", + "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7", + "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17", + "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314", + "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66", + "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed", + "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c", + "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f", + "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464", + "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b", + "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c", + "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4", + "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362", + "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692", + "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365", + "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9", + "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e", + "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb", + "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06", + "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695", + "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f", + "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04", + "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f", + "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b", + "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7", + "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9", + "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce", + "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c", + "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35", + "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b", + "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4", + "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51", + "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a", + "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355", + "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7", + "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625", + "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99", + "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779", + "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd", + "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0", + "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705", + "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c", + "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f", + "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c", + "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870", + "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353", + "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2", + "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423", + "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a", + "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6", + "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1", + "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947", + "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810", + "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f", + "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.0a1" + "version": "==3.0.0" }, "gunicorn": { "hashes": [ @@ -417,8 +424,11 @@ "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", @@ -426,6 +436,7 @@ "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", @@ -434,6 +445,7 @@ "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", @@ -441,9 +453,12 @@ "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", @@ -462,7 +477,9 @@ "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" ], "markers": "python_version >= '3.7'", "version": "==2.1.3" @@ -492,34 +509,41 @@ }, "numpy": { "hashes": [ - "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2", - "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55", - "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf", - "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01", - "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca", - "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901", - "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d", - "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4", - "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf", - "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380", - "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044", - "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545", - "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f", - "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f", - "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3", - "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364", - "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9", - "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418", - "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f", - "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295", - "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3", - "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187", - "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926", - "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357", - "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760" + "sha256:020cdbee66ed46b671429c7265cf00d8ac91c046901c55684954c3958525dab2", + "sha256:0621f7daf973d34d18b4e4bafb210bbaf1ef5e0100b5fa750bd9cde84c7ac292", + "sha256:0792824ce2f7ea0c82ed2e4fecc29bb86bee0567a080dacaf2e0a01fe7654369", + "sha256:09aaee96c2cbdea95de76ecb8a586cb687d281c881f5f17bfc0fb7f5890f6b91", + "sha256:166b36197e9debc4e384e9c652ba60c0bacc216d0fc89e78f973a9760b503388", + "sha256:186ba67fad3c60dbe8a3abff3b67a91351100f2661c8e2a80364ae6279720299", + "sha256:306545e234503a24fe9ae95ebf84d25cba1fdc27db971aa2d9f1ab6bba19a9dd", + "sha256:436c8e9a4bdeeee84e3e59614d38c3dbd3235838a877af8c211cfcac8a80b8d3", + "sha256:4a873a8180479bc829313e8d9798d5234dfacfc2e8a7ac188418189bb8eafbd2", + "sha256:4acc65dd65da28060e206c8f27a573455ed724e6179941edb19f97e58161bb69", + "sha256:51be5f8c349fdd1a5568e72713a21f518e7d6707bcf8503b528b88d33b57dc68", + "sha256:546b7dd7e22f3c6861463bebb000646fa730e55df5ee4a0224408b5694cc6148", + "sha256:5671338034b820c8d58c81ad1dafc0ed5a00771a82fccc71d6438df00302094b", + "sha256:637c58b468a69869258b8ae26f4a4c6ff8abffd4a8334c830ffb63e0feefe99a", + "sha256:767254ad364991ccfc4d81b8152912e53e103ec192d1bb4ea6b1f5a7117040be", + "sha256:7d484292eaeb3e84a51432a94f53578689ffdea3f90e10c8b203a99be5af57d8", + "sha256:7f6bad22a791226d0a5c7c27a80a20e11cfe09ad5ef9084d4d3fc4a299cca505", + "sha256:86f737708b366c36b76e953c46ba5827d8c27b7a8c9d0f471810728e5a2fe57c", + "sha256:8c6adc33561bd1d46f81131d5352348350fc23df4d742bb246cdfca606ea1208", + "sha256:914b28d3215e0c721dc75db3ad6d62f51f630cb0c277e6b3bcb39519bed10bd8", + "sha256:b44e6a09afc12952a7d2a58ca0a2429ee0d49a4f89d83a0a11052da696440e49", + "sha256:bb0d9a1aaf5f1cb7967320e80690a1d7ff69f1d47ebc5a9bea013e3a21faec95", + "sha256:c0b45c8b65b79337dee5134d038346d30e109e9e2e9d43464a2970e5c0e93229", + "sha256:c2e698cb0c6dda9372ea98a0344245ee65bdc1c9dd939cceed6bb91256837896", + "sha256:c78a22e95182fb2e7874712433eaa610478a3caf86f28c621708d35fa4fd6e7f", + "sha256:e062aa24638bb5018b7841977c360d2f5917268d125c833a686b7cbabbec496c", + "sha256:e5e18e5b14a7560d8acf1c596688f4dfd19b4f2945b245a71e5af4ddb7422feb", + "sha256:eae430ecf5794cb7ae7fa3808740b015aa80747e5266153128ef055975a72b99", + "sha256:ee84ca3c58fe48b8ddafdeb1db87388dce2c3c3f701bf447b05e4cfcc3679112", + "sha256:f042f66d0b4ae6d48e70e28d487376204d3cbf43b84c03bac57e28dac6151581", + "sha256:f8db2f125746e44dce707dd44d4f4efeea8d7e2b43aace3f8d1f235cfa2733dd", + "sha256:f93fc78fe8bf15afe2b8d6b6499f1c73953169fad1e9a8dd086cdff3190e7fdf" ], - "markers": "python_version < '3.10'", - "version": "==1.25.2" + "markers": "python_version < '3.11'", + "version": "==1.26.0" }, "openpyxl": { "hashes": [ @@ -531,42 +555,42 @@ }, "packaging": { "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.1" + "version": "==23.2" }, "pandas": { "hashes": [ - "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682", - "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc", - "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b", - "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089", - "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5", - "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26", - "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210", - "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b", - "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641", - "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd", - "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78", - "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b", - "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e", - "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061", - "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0", - "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e", - "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8", - "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d", - "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0", - "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c", - "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183", - "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df", - "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8", - "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f", - "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02" + "sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614", + "sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97", + "sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2", + "sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8", + "sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0", + "sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750", + "sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea", + "sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2", + "sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2", + "sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa", + "sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4", + "sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb", + "sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6", + "sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d", + "sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e", + "sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98", + "sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a", + "sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0", + "sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4", + "sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49", + "sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd", + "sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e", + "sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317", + "sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b", + "sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363" ], "index": "pypi", - "version": "==2.0.3" + "version": "==2.1.1" }, "pycparser": { "hashes": [ @@ -577,121 +601,125 @@ }, "pydantic": { "hashes": [ - "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b", - "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70" + "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7", + "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1" ], "index": "pypi", - "version": "==2.1.1" + "version": "==2.4.2" }, "pydantic-core": { "hashes": [ - "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb", - "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed", - "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762", - "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7", - "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af", - "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59", - "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77", - "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db", - "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332", - "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1", - "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3", - "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b", - "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f", - "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969", - "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2", - "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8", - "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b", - "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678", - "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d", - "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9", - "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0", - "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37", - "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd", - "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c", - "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f", - "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1", - "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2", - "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da", - "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a", - "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4", - "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538", - "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07", - "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50", - "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114", - "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56", - "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3", - "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421", - "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8", - "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685", - "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86", - "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279", - "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3", - "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1", - "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813", - "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66", - "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be", - "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171", - "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce", - "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c", - "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30", - "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387", - "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673", - "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a", - "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e", - "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde", - "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0", - "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8", - "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399", - "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d", - "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b", - "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f", - "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41", - "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae", - "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725", - "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa", - "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09", - "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1", - "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735", - "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008", - "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec", - "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071", - "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060", - "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c", - "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012", - "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717", - "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa", - "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841", - "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb", - "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af", - "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f", - "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05", - "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41", - "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00", - "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf", - "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11", - "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c", - "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516", - "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5", - "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b", - "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661", - "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a", - "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc", - "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122", - "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a", - "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066", - "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5", - "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989", - "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064", - "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22", - "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b", - "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5" + "sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e", + "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33", + "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7", + "sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7", + "sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea", + "sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4", + "sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0", + "sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7", + "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94", + "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff", + "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82", + "sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd", + "sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893", + "sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e", + "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d", + "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901", + "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9", + "sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c", + "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7", + "sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891", + "sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f", + "sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a", + "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9", + "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5", + "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e", + "sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a", + "sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c", + "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f", + "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514", + "sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b", + "sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302", + "sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096", + "sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0", + "sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27", + "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884", + "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a", + "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357", + "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430", + "sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221", + "sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325", + "sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4", + "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05", + "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55", + "sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875", + "sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970", + "sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc", + "sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6", + "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f", + "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b", + "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d", + "sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15", + "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118", + "sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee", + "sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e", + "sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6", + "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208", + "sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede", + "sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3", + "sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e", + "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada", + "sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175", + "sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a", + "sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c", + "sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f", + "sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58", + "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f", + "sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a", + "sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a", + "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921", + "sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e", + "sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904", + "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776", + "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52", + "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf", + "sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8", + "sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f", + "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b", + "sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63", + "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c", + "sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f", + "sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468", + "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e", + "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab", + "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2", + "sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb", + "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb", + "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132", + "sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b", + "sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607", + "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934", + "sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698", + "sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e", + "sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561", + "sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de", + "sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b", + "sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a", + "sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595", + "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402", + "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881", + "sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429", + "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5", + "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7", + "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c", + "sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531", + "sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6", + "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521" ], "markers": "python_version >= '3.7'", - "version": "==2.4.0" + "version": "==2.10.1" }, "pyjwt": { - "extras": [], "hashes": [ "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" @@ -740,14 +768,16 @@ }, "pytz": { "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" + "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", + "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" ], - "version": "==2023.3" + "version": "==2023.3.post1" }, "pyyaml": { "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", @@ -755,7 +785,10 @@ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", @@ -763,9 +796,12 @@ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", @@ -780,7 +816,9 @@ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", @@ -800,11 +838,11 @@ }, "s3transfer": { "hashes": [ - "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", - "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a", + "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e" ], "markers": "python_version >= '3.7'", - "version": "==0.6.1" + "version": "==0.7.0" }, "six": { "hashes": [ @@ -824,50 +862,50 @@ }, "sqlalchemy": { "hashes": [ - "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c", - "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5", - "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1", - "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a", - "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9", - "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15", - "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6", - "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972", - "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad", - "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531", - "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148", - "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7", - "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828", - "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de", - "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae", - "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0", - "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b", - "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d", - "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106", - "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f", - "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8", - "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c", - "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0", - "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365", - "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e", - "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2", - "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3", - "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c", - "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7", - "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e", - "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145", - "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1", - "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84", - "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b", - "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2", - "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369", - "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12", - "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d", - "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2", - "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb", - "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b" + "sha256:014794b60d2021cc8ae0f91d4d0331fe92691ae5467a00841f7130fe877b678e", + "sha256:0268256a34806e5d1c8f7ee93277d7ea8cc8ae391f487213139018b6805aeaf6", + "sha256:05b971ab1ac2994a14c56b35eaaa91f86ba080e9ad481b20d99d77f381bb6258", + "sha256:141675dae56522126986fa4ca713739d00ed3a6f08f3c2eb92c39c6dfec463ce", + "sha256:1e7dc99b23e33c71d720c4ae37ebb095bebebbd31a24b7d99dfc4753d2803ede", + "sha256:2e617727fe4091cedb3e4409b39368f424934c7faa78171749f704b49b4bb4ce", + "sha256:3cf229704074bce31f7f47d12883afee3b0a02bb233a0ba45ddbfe542939cca4", + "sha256:3eb7c03fe1cd3255811cd4e74db1ab8dca22074d50cd8937edf4ef62d758cdf4", + "sha256:3f7d57a7e140efe69ce2d7b057c3f9a595f98d0bbdfc23fd055efdfbaa46e3a5", + "sha256:419b1276b55925b5ac9b4c7044e999f1787c69761a3c9756dec6e5c225ceca01", + "sha256:44ac5c89b6896f4740e7091f4a0ff2e62881da80c239dd9408f84f75a293dae9", + "sha256:4615623a490e46be85fbaa6335f35cf80e61df0783240afe7d4f544778c315a9", + "sha256:50a69067af86ec7f11a8e50ba85544657b1477aabf64fa447fd3736b5a0a4f67", + "sha256:513fd5b6513d37e985eb5b7ed89da5fd9e72354e3523980ef00d439bc549c9e9", + "sha256:6ff3dc2f60dbf82c9e599c2915db1526d65415be323464f84de8db3e361ba5b9", + "sha256:73c079e21d10ff2be54a4699f55865d4b275fd6c8bd5d90c5b1ef78ae0197301", + "sha256:7614f1eab4336df7dd6bee05bc974f2b02c38d3d0c78060c5faa4cd1ca2af3b8", + "sha256:785e2f2c1cb50d0a44e2cdeea5fd36b5bf2d79c481c10f3a88a8be4cfa2c4615", + "sha256:7ca38746eac23dd7c20bec9278d2058c7ad662b2f1576e4c3dbfcd7c00cc48fa", + "sha256:7f0c4ee579acfe6c994637527c386d1c22eb60bc1c1d36d940d8477e482095d4", + "sha256:87bf91ebf15258c4701d71dcdd9c4ba39521fb6a37379ea68088ce8cd869b446", + "sha256:89e274604abb1a7fd5c14867a412c9d49c08ccf6ce3e1e04fffc068b5b6499d4", + "sha256:8c323813963b2503e54d0944813cd479c10c636e3ee223bcbd7bd478bf53c178", + "sha256:a95aa0672e3065d43c8aa80080cdd5cc40fe92dc873749e6c1cf23914c4b83af", + "sha256:af520a730d523eab77d754f5cf44cc7dd7ad2d54907adeb3233177eeb22f271b", + "sha256:b19ae41ef26c01a987e49e37c77b9ad060c59f94d3b3efdfdbf4f3daaca7b5fe", + "sha256:b4eae01faee9f2b17f08885e3f047153ae0416648f8e8c8bd9bc677c5ce64be9", + "sha256:b69f1f754d92eb1cc6b50938359dead36b96a1dcf11a8670bff65fd9b21a4b09", + "sha256:b977bfce15afa53d9cf6a632482d7968477625f030d86a109f7bdfe8ce3c064a", + "sha256:bf8eebccc66829010f06fbd2b80095d7872991bfe8415098b9fe47deaaa58063", + "sha256:c111cd40910ffcb615b33605fc8f8e22146aeb7933d06569ac90f219818345ef", + "sha256:c2d494b6a2a2d05fb99f01b84cc9af9f5f93bf3e1e5dbdafe4bed0c2823584c1", + "sha256:c9cba4e7369de663611ce7460a34be48e999e0bbb1feb9130070f0685e9a6b66", + "sha256:cca720d05389ab1a5877ff05af96551e58ba65e8dc65582d849ac83ddde3e231", + "sha256:ccb99c3138c9bde118b51a289d90096a3791658da9aea1754667302ed6564f6e", + "sha256:d59cb9e20d79686aa473e0302e4a82882d7118744d30bb1dfb62d3c47141b3ec", + "sha256:e36339a68126ffb708dc6d1948161cea2a9e85d7d7b0c54f6999853d70d44430", + "sha256:ea7da25ee458d8f404b93eb073116156fd7d8c2a776d8311534851f28277b4ce", + "sha256:f9fefd6298433b6e9188252f3bff53b9ff0443c8fde27298b8a2b19f6617eeb9", + "sha256:fb87f763b5d04a82ae84ccff25554ffd903baafba6698e18ebaf32561f2fe4aa", + "sha256:fc6b15465fabccc94bf7e38777d665b6a4f95efd1725049d6184b3a39fd54880" ], "index": "pypi", - "version": "==2.0.19" + "version": "==2.0.21" }, "starlette": { "hashes": [ @@ -879,11 +917,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], - "markers": "python_version >= '3.7'", - "version": "==4.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.8.0" }, "tzdata": { "hashes": [ @@ -895,14 +933,16 @@ }, "urllib3": { "hashes": [ - "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" + "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21", + "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b" ], "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" + "version": "==1.26.17" }, "uvicorn": { - "extras": [], + "extras": [ + "standard" + ], "hashes": [ "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53", "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a" @@ -947,30 +987,30 @@ }, "watchfiles": { "hashes": [ - "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911", - "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda", - "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154", - "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af", - "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d", - "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c", - "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48", - "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c", - "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545", - "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e", - "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120", - "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7", - "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8", - "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc", - "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056", - "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193", - "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3", - "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf", - "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79", - "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1", - "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b", - "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0" + "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38", + "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db", + "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0", + "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a", + "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9", + "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf", + "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490", + "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193", + "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019", + "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164", + "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644", + "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce", + "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef", + "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95", + "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa", + "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49", + "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5", + "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c", + "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458", + "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e", + "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0", + "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3" ], - "version": "==0.19.0" + "version": "==0.20.0" }, "websockets": { "hashes": [ @@ -1059,11 +1099,11 @@ "develop": { "autopep8": { "hashes": [ - "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", - "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", - "version": "==2.0.2" + "version": "==2.0.4" }, "flake8": { "hashes": [ From 560184670607759891337f5cc09e84fd90fc4acd Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 6 Oct 2023 15:01:26 +0900 Subject: [PATCH 757/962] =?UTF-8?q?fix:=20=E3=82=AF=E3=83=AA=E3=82=A2?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=A7=E6=A4=9C=E7=B4=A2=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E3=81=8C=E3=81=86=E3=81=BE=E3=81=8F=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=82=A2=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/templates/bioSearchList.html | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 8bdfbaeb..b05b05a1 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -113,7 +113,7 @@ @@ -191,6 +191,24 @@ - + + - + \ No newline at end of file From 5cd14f9f27ab62728d499870fba583adcdd19760 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Jan 2024 16:42:47 +0900 Subject: [PATCH 884/962] =?UTF-8?q?feat:=202024=E5=B9=B41=E6=9C=88?= =?UTF-8?q?=E5=BA=A6=E8=84=86=E5=BC=B1=E6=80=A7=E3=83=91=E3=83=83=E3=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 483 +++++------ ecs/jskult-batch-daily/Pipfile.lock | 386 ++++----- ecs/jskult-batch-laundering/Pipfile.lock | 230 ++--- ecs/jskult-dbdump/Dockerfile | 4 +- ecs/jskult-dbdump/Pipfile.lock | 230 ++--- ecs/jskult-restore-backup/Dockerfile | 4 +- ecs/jskult-restore-backup/Pipfile.lock | 12 +- ecs/jskult-webapp/Pipfile.lock | 805 +++++++++--------- .../check-view-security-option/Pipfile.lock | 34 +- 9 files changed, 1085 insertions(+), 1103 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 6e477cda..77efd5fc 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -18,27 +18,27 @@ "default": { "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "certifi": { "hashes": [ @@ -256,101 +256,87 @@ }, "lxml": { "hashes": [ - "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3", - "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d", - "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a", - "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", - "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305", - "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287", - "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", - "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52", - "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", - "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4", - "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584", - "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f", - "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693", - "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef", - "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", - "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02", - "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc", - "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7", - "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", - "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a", - "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", - "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", - "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", - "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601", - "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", - "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", - "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2", - "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c", - "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129", - "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", - "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2", - "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1", - "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", - "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", - "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477", - "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d", - "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", - "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7", - "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2", - "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574", - "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", - "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", - "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98", - "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12", - "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", - "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", - "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", - "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", - "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d", - "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", - "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", - "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4", - "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", - "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", - "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2", - "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", - "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96", - "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d", - "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", - "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", - "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", - "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", - "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", - "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458", - "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", - "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c", - "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", - "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", - "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", - "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", - "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf", - "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb", - "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b", - "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833", - "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", - "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85", - "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e", - "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", - "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8", - "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", - "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", - "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5", - "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190", - "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", - "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", - "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", - "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9", - "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0", - "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", - "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", - "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", - "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4" + "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01", + "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f", + "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1", + "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431", + "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8", + "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623", + "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a", + "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1", + "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6", + "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67", + "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890", + "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372", + "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c", + "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb", + "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df", + "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84", + "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6", + "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45", + "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936", + "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca", + "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897", + "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a", + "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d", + "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14", + "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912", + "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354", + "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f", + "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c", + "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d", + "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862", + "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969", + "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e", + "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8", + "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e", + "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa", + "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45", + "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a", + "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147", + "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3", + "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3", + "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324", + "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3", + "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33", + "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f", + "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f", + "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764", + "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1", + "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114", + "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581", + "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d", + "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae", + "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da", + "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2", + "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e", + "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda", + "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5", + "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa", + "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1", + "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e", + "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7", + "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1", + "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95", + "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93", + "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5", + "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b", + "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05", + "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5", + "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f", + "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7", + "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8", + "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea", + "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa", + "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd", + "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b", + "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e", + "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4", + "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204", + "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.3" + "markers": "python_version >= '3.6'", + "version": "==5.1.0" }, "platformdirs": { "hashes": [ @@ -415,11 +401,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "simple-salesforce": { "hashes": [ @@ -473,19 +459,19 @@ }, "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "certifi": { "hashes": [ @@ -654,61 +640,61 @@ "toml" ], "hashes": [ - "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", - "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", - "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", - "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", - "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", - "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", - "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", - "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", - "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", - "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", - "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", - "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", - "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", - "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", - "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", - "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", - "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", - "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", - "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", - "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", - "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", - "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", - "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", - "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", - "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", - "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", - "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", - "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", - "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", - "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", - "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", - "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", - "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", - "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", - "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", - "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", - "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", - "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", - "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", - "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", - "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", - "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", - "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", - "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", - "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", - "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", - "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", - "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", - "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", - "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", - "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", - "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" + "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", + "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", + "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", + "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", + "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", + "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", + "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", + "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", + "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", + "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", + "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", + "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", + "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", + "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", + "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", + "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", + "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", + "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", + "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", + "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", + "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", + "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", + "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", + "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", + "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", + "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", + "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", + "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", + "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", + "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", + "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", + "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", + "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", + "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", + "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", + "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", + "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", + "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", + "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", + "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", + "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", + "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", + "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", + "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", + "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", + "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", + "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", + "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", + "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", + "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", + "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", + "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" ], "markers": "python_version >= '3.8'", - "version": "==7.3.2" + "version": "==7.4.0" }, "cryptography": { "hashes": [ @@ -749,11 +735,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "idna": { "hashes": [ @@ -773,11 +759,11 @@ }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], "markers": "python_version >= '3.7'", - "version": "==3.1.2" + "version": "==3.1.3" }, "jmespath": { "hashes": [ @@ -789,69 +775,69 @@ }, "markupsafe": { "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", - "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", - "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:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", - "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" + "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", + "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", + "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", + "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", + "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", + "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", + "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", + "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", + "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", + "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", + "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", + "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", + "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", + "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", + "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", + "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", + "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", + "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", + "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", + "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", + "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", + "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", + "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", + "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", + "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", + "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", + "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", + "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", + "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", + "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", + "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", + "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", + "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", + "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", + "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", + "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", + "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", + "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", + "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", + "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", + "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", + "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", + "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", + "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", + "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", + "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", + "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", + "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", + "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", + "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", + "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", + "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", + "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", + "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", + "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", + "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", + "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", + "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", + "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", + "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" ], "markers": "python_version >= '3.7'", - "version": "==2.1.3" + "version": "==2.1.4" }, "mccabe": { "hashes": [ @@ -863,11 +849,11 @@ }, "moto": { "hashes": [ - "sha256:2da62d52eaa765dfe2762c920f0a88a58f3a09e04581c91db967d92faec848f1", - "sha256:58c12ab9ee69b6a5d1cddf83611ba4071508f07894317c57844b3ae6dc5bcd38" + "sha256:01aef6a489a725c8d725bd3dc6f70ff1bedaee3e2641752e4b471ff0ede4b4d7", + "sha256:93e0fd13b624bd79115494f833308c3641b2be0fc9f4f18aa9264aa01f6168e0" ], "index": "pypi", - "version": "==4.2.11" + "version": "==4.2.13" }, "packaging": { "hashes": [ @@ -902,19 +888,19 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", - "version": "==7.4.3" + "version": "==7.4.4" }, "pytest-cov": { "hashes": [ @@ -979,6 +965,7 @@ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", @@ -1022,11 +1009,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "six": { "hashes": [ diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index 95b6f428..83519dfb 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -18,83 +18,83 @@ "default": { "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "greenlet": { "hashes": [ - "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46", - "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c", - "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1", - "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9", - "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3", - "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397", - "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a", - "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc", - "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3", - "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa", - "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206", - "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4", - "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493", - "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b", - "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377", - "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813", - "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88", - "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66", - "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d", - "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836", - "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd", - "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4", - "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309", - "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef", - "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764", - "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a", - "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51", - "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4", - "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b", - "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765", - "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6", - "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d", - "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251", - "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773", - "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590", - "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73", - "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0", - "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6", - "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c", - "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144", - "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196", - "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650", - "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965", - "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30", - "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0", - "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49", - "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d", - "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138", - "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90", - "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc", - "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495", - "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa", - "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9", - "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76", - "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e", - "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227", - "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8", - "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.2" + "version": "==3.0.3" }, "jmespath": { "hashes": [ @@ -122,11 +122,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "six": { "hashes": [ @@ -138,58 +138,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3", - "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884", - "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74", - "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d", - "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc", - "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca", - "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d", - "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf", - "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846", - "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306", - "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221", - "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5", - "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89", - "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55", - "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72", - "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea", - "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8", - "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577", - "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df", - "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4", - "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d", - "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34", - "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4", - "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24", - "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6", - "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965", - "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35", - "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b", - "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab", - "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22", - "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4", - "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204", - "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855", - "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d", - "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab", - "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69", - "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693", - "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e", - "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8", - "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0", - "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45", - "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab", - "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1", - "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d", - "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda", - "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b", - "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18", - "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac", - "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60" + "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", + "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", + "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", + "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", + "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", + "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", + "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", + "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", + "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", + "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", + "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", + "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", + "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", + "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", + "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", + "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", + "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", + "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", + "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", + "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", + "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", + "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", + "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", + "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", + "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", + "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", + "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", + "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", + "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", + "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", + "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", + "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", + "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", + "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", + "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", + "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", + "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", + "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", + "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", + "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", + "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", + "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", + "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", + "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", + "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", + "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", + "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", + "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", + "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" ], "index": "pypi", - "version": "==2.0.23" + "version": "==2.0.25" }, "tenacity": { "hashes": [ @@ -227,80 +227,80 @@ }, "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", - "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", - "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", - "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", - "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", - "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", - "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", - "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", - "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", - "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", - "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", - "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", - "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", - "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", - "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", - "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", - "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", - "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", - "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", - "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", - "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", - "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", - "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", - "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", - "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", - "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", - "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", - "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", - "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", - "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", - "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", - "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", - "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", - "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", - "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", - "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", - "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", - "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", - "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", - "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", - "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", - "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", - "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", - "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", - "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", - "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", - "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", - "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", - "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", - "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", - "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", - "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" + "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", + "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", + "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", + "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", + "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", + "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", + "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", + "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", + "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", + "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", + "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", + "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", + "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", + "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", + "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", + "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", + "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", + "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", + "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", + "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", + "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", + "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", + "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", + "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", + "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", + "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", + "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", + "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", + "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", + "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", + "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", + "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", + "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", + "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", + "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", + "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", + "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", + "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", + "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", + "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", + "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", + "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", + "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", + "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", + "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", + "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", + "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", + "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", + "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", + "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", + "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", + "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" ], "markers": "python_version >= '3.8'", - "version": "==7.3.2" + "version": "==7.4.0" }, "exceptiongroup": { "hashes": [ @@ -312,11 +312,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "iniconfig": { "hashes": [ @@ -368,19 +368,19 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:42ed2f917ded90ceb752dbe2ecb48c436c2a70d38bc16018c2d11da6426a18b6", + "sha256:efc82dc5e6f2f41ae5acb9eabdf2ced192f336664c436b24a7db2c6aaafe4efd" ], "index": "pypi", - "version": "==7.4.3" + "version": "==8.0.0rc2" }, "pytest-cov": { "hashes": [ @@ -400,11 +400,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "six": { "hashes": [ diff --git a/ecs/jskult-batch-laundering/Pipfile.lock b/ecs/jskult-batch-laundering/Pipfile.lock index 25bbee9b..fb6db2d1 100644 --- a/ecs/jskult-batch-laundering/Pipfile.lock +++ b/ecs/jskult-batch-laundering/Pipfile.lock @@ -18,67 +18,67 @@ "default": { "greenlet": { "hashes": [ - "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46", - "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c", - "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1", - "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9", - "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3", - "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397", - "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a", - "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc", - "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3", - "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa", - "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206", - "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4", - "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493", - "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b", - "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377", - "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813", - "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88", - "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66", - "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d", - "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836", - "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd", - "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4", - "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309", - "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef", - "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764", - "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a", - "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51", - "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4", - "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b", - "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765", - "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6", - "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d", - "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251", - "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773", - "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590", - "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73", - "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0", - "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6", - "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c", - "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144", - "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196", - "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650", - "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965", - "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30", - "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0", - "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49", - "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d", - "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138", - "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90", - "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc", - "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495", - "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa", - "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9", - "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76", - "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e", - "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227", - "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8", - "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.2" + "version": "==3.0.3" }, "pymysql": { "hashes": [ @@ -90,58 +90,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3", - "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884", - "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74", - "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d", - "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc", - "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca", - "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d", - "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf", - "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846", - "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306", - "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221", - "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5", - "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89", - "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55", - "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72", - "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea", - "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8", - "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577", - "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df", - "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4", - "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d", - "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34", - "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4", - "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24", - "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6", - "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965", - "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35", - "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b", - "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab", - "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22", - "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4", - "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204", - "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855", - "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d", - "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab", - "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69", - "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693", - "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e", - "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8", - "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0", - "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45", - "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab", - "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1", - "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d", - "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda", - "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b", - "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18", - "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac", - "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60" + "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", + "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", + "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", + "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", + "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", + "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", + "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", + "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", + "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", + "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", + "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", + "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", + "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", + "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", + "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", + "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", + "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", + "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", + "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", + "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", + "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", + "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", + "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", + "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", + "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", + "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", + "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", + "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", + "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", + "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", + "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", + "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", + "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", + "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", + "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", + "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", + "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", + "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", + "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", + "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", + "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", + "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", + "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", + "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", + "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", + "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", + "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", + "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", + "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" ], "index": "pypi", - "version": "==2.0.23" + "version": "==2.0.25" }, "tenacity": { "hashes": [ @@ -171,11 +171,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -195,11 +195,11 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "tomli": { "hashes": [ diff --git a/ecs/jskult-dbdump/Dockerfile b/ecs/jskult-dbdump/Dockerfile index 9c6838cb..140de9c6 100644 --- a/ecs/jskult-dbdump/Dockerfile +++ b/ecs/jskult-dbdump/Dockerfile @@ -11,8 +11,8 @@ RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release # mysqlをインストール RUN \ - wget https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb && \ - dpkg -i mysql-apt-config_0.8.25-1_all.deb < mysql_dpkg_selection.txt && \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ apt update && \ apt install -y mysql-client diff --git a/ecs/jskult-dbdump/Pipfile.lock b/ecs/jskult-dbdump/Pipfile.lock index 25bbee9b..fb6db2d1 100644 --- a/ecs/jskult-dbdump/Pipfile.lock +++ b/ecs/jskult-dbdump/Pipfile.lock @@ -18,67 +18,67 @@ "default": { "greenlet": { "hashes": [ - "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46", - "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c", - "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1", - "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9", - "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3", - "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397", - "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a", - "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc", - "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3", - "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa", - "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206", - "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4", - "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493", - "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b", - "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377", - "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813", - "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88", - "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66", - "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d", - "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836", - "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd", - "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4", - "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309", - "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef", - "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764", - "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a", - "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51", - "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4", - "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b", - "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765", - "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6", - "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d", - "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251", - "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773", - "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590", - "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73", - "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0", - "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6", - "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c", - "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144", - "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196", - "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650", - "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965", - "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30", - "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0", - "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49", - "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d", - "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138", - "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90", - "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc", - "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495", - "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa", - "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9", - "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76", - "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e", - "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227", - "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8", - "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.2" + "version": "==3.0.3" }, "pymysql": { "hashes": [ @@ -90,58 +90,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3", - "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884", - "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74", - "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d", - "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc", - "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca", - "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d", - "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf", - "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846", - "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306", - "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221", - "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5", - "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89", - "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55", - "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72", - "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea", - "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8", - "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577", - "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df", - "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4", - "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d", - "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34", - "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4", - "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24", - "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6", - "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965", - "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35", - "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b", - "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab", - "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22", - "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4", - "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204", - "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855", - "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d", - "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab", - "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69", - "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693", - "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e", - "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8", - "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0", - "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45", - "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab", - "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1", - "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d", - "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda", - "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b", - "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18", - "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac", - "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60" + "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", + "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", + "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", + "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", + "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", + "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", + "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", + "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", + "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", + "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", + "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", + "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", + "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", + "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", + "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", + "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", + "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", + "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", + "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", + "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", + "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", + "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", + "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", + "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", + "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", + "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", + "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", + "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", + "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", + "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", + "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", + "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", + "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", + "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", + "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", + "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", + "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", + "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", + "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", + "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", + "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", + "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", + "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", + "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", + "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", + "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", + "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", + "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", + "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" ], "index": "pypi", - "version": "==2.0.23" + "version": "==2.0.25" }, "tenacity": { "hashes": [ @@ -171,11 +171,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -195,11 +195,11 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "tomli": { "hashes": [ diff --git a/ecs/jskult-restore-backup/Dockerfile b/ecs/jskult-restore-backup/Dockerfile index 9c6838cb..140de9c6 100644 --- a/ecs/jskult-restore-backup/Dockerfile +++ b/ecs/jskult-restore-backup/Dockerfile @@ -11,8 +11,8 @@ RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release # mysqlをインストール RUN \ - wget https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb && \ - dpkg -i mysql-apt-config_0.8.25-1_all.deb < mysql_dpkg_selection.txt && \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ apt update && \ apt install -y mysql-client diff --git a/ecs/jskult-restore-backup/Pipfile.lock b/ecs/jskult-restore-backup/Pipfile.lock index a1064063..9a57d92d 100644 --- a/ecs/jskult-restore-backup/Pipfile.lock +++ b/ecs/jskult-restore-backup/Pipfile.lock @@ -27,11 +27,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -51,11 +51,11 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "tomli": { "hashes": [ diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock index 14143d1b..8e512ef0 100644 --- a/ecs/jskult-webapp/Pipfile.lock +++ b/ecs/jskult-webapp/Pipfile.lock @@ -26,27 +26,27 @@ }, "anyio": { "hashes": [ - "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", - "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" + "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", + "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "certifi": { "hashes": [ @@ -264,75 +264,75 @@ }, "fastapi": { "hashes": [ - "sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241", - "sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae" + "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093", + "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191" ], "index": "pypi", - "version": "==0.104.1" + "version": "==0.109.0" }, "greenlet": { "hashes": [ - "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46", - "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c", - "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1", - "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9", - "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3", - "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397", - "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a", - "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc", - "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3", - "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa", - "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206", - "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4", - "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493", - "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b", - "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377", - "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813", - "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88", - "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66", - "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d", - "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836", - "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd", - "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4", - "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309", - "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef", - "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764", - "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a", - "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51", - "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4", - "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b", - "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765", - "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6", - "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d", - "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251", - "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773", - "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590", - "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73", - "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0", - "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6", - "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c", - "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144", - "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196", - "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650", - "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965", - "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30", - "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0", - "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49", - "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d", - "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138", - "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90", - "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc", - "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495", - "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa", - "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9", - "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76", - "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e", - "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227", - "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8", - "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.2" + "version": "==3.0.3" }, "gunicorn": { "hashes": [ @@ -401,11 +401,11 @@ }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], "index": "pypi", - "version": "==3.1.2" + "version": "==3.1.3" }, "jmespath": { "hashes": [ @@ -417,134 +417,153 @@ }, "markupsafe": { "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", - "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", - "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:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", - "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" + "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", + "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", + "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", + "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", + "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", + "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", + "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", + "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", + "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", + "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", + "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", + "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", + "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", + "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", + "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", + "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", + "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", + "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", + "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", + "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", + "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", + "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", + "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", + "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", + "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", + "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", + "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", + "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", + "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", + "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", + "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", + "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", + "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", + "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", + "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", + "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", + "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", + "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", + "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", + "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", + "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", + "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", + "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", + "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", + "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", + "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", + "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", + "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", + "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", + "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", + "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", + "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", + "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", + "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", + "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", + "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", + "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", + "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", + "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", + "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" ], "markers": "python_version >= '3.7'", - "version": "==2.1.3" + "version": "==2.1.4" }, "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" + "sha256:01130d705445c4b41dcb6177b82ef6ae54ae13dc8d7ad9bf1a673acf0db8059c", + "sha256:0e6d2fba22cc8bf132a5bdf3a964296d9287a618d09681a12868f0fd518e4230", + "sha256:1087035b4b0d5f2be0db74ccdb285e0bcf977a8c24e47ee93cd084570d073648", + "sha256:18422803dc00703ebf4969a6d6957bd9099913295f0578c9e29ee25d4988ed7f", + "sha256:2402eaf2a5f963735c44e59559fa00ee8eb8dec46c0e3f29bfdb1ee49d7a75df", + "sha256:308a6b43c3c9c5a6d912e1984d02aa58ccabb83c9e57c5edb71389c90187d6d3", + "sha256:3c5fd38d1f4079dc54ac79f93b0e5442c660b297a3868308251ffc37beb1216b", + "sha256:507c73837b19c17918de5d2afccdaaed95cf00d1e9e38eac93ab39c8fc0930f8", + "sha256:522eff5b0fd3ea2cdbeae27581a684174ed843dd7b9076791bf344a746a1ed8f", + "sha256:535f278df0a26280e904cd3688ae610414b176cc373431ac31e378305ee96452", + "sha256:60a7358d7d413d4ea9c92e3b523ab4e701e30cefc505b2f1409761fc9e7ba730", + "sha256:6b627a62c18655adb36b9b2a420b7f43a0d2f39ebe2aa01418968d6dc71bb104", + "sha256:6e442d6dcfb2fc1a08eea86da80ebe71ad63fbc4217fa4faede7023c0b51d055", + "sha256:761c1bcca7146b24c82b72645fbb80dbe6d373792e84f7d71bafa538c0b170af", + "sha256:7fc8a9caeea0147eee642a50c004fc64f0c1410736423f74802cf9950ae14b43", + "sha256:853d87ce8fbef597bc3a1f23a9f95f6a4267f697e28fc85c665598c190b4b71c", + "sha256:8feb1b8bf21eae1c35fca72a8c2c05c9a12271d882a02b01608d746d3dbab684", + "sha256:918f415c42cabde6128faba93be92482a4fb1f40d0d800727e04716aef40c94e", + "sha256:98ea6f420f1298eb6a36b759551b22d133fe882da407f3eccf8c2cc5d302d05f", + "sha256:99472af3849bd795970ecc9102f1007350cb8aef0ff21ba0511c121fe94c3ffe", + "sha256:9d8f1618fb9b100bba172f2629df20e6db591ce5912996ac630d215627dd7553", + "sha256:9f2284489d1b8330bb785eb844c1a6a6a2346c95bc3f52088084c71b4a1fb234", + "sha256:a27b8cec5e05db2a7acc475a7ab70b840cf2087bcb2d4a276b89a3f9d20b0887", + "sha256:a5dfcef1fc16360aab65b8b60518a9d19cc7916ffc296ee0907819490686429e", + "sha256:ab1aee2ef6a170b26e431733767361dfc12983847f2be23f6dc2311de7b98df0", + "sha256:ad4a2e1fb2b643ac3166f30be97a95ad1877e4670c6dc656c4ef580681b84c49", + "sha256:b44d0a99b69bca583e497cf217d2573f9a01ca49d9dc23116bffb196efdb192f", + "sha256:c97d7c1861635cd538f44bf70dd27ed24435b0f8fe634ca52c49cb4c4424d6fa", + "sha256:c97ee81e4f7083df13b8ef690366e67afd8170c8f7c259161bae6ed12d41fe5b", + "sha256:cc0f872b573218bfac9532ccb2f52f6279e8aa337654bbb28e90f0051d3ceb0b", + "sha256:d001f2042073b194bad071925b7ee36d9f320b79c93b4463df87267fee986e86", + "sha256:d27f88051d4fde5b2fdb1a07e3064c950541da6d25e3f1829eedededc015b0c2", + "sha256:d4e35fed7eb8ac573eef365d4a614c952179ad4e0e27a8e32d22e6c57a945b8c", + "sha256:da069e1c48f54de4c4c372c74cf8c7f27487449d1547337aaedc21b26538b5e7", + "sha256:ea2f75e93425f0bcfaef68c189845ec9a212d37a4997ffa35353ef7e5c57ca9a", + "sha256:f617ebe1fdceadc2b87497c4d56f3c863155179488feb63f83a62cf95df37b69" ], "index": "pypi", - "version": "==0.0.12" + "version": "==0.0.13" }, "numpy": { "hashes": [ - "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a", - "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6", - "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2", - "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79", - "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9", - "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919", - "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d", - "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060", - "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75", - "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f", - "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe", - "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167", - "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef", - "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75", - "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3", - "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7", - "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7", - "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d", - "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b", - "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186", - "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0", - "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1", - "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6", - "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e", - "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523", - "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36", - "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841", - "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818", - "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00", - "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80", - "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440", - "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210", - "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8", - "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea", - "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec", - "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841" + "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd", + "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b", + "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e", + "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f", + "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f", + "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178", + "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3", + "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4", + "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e", + "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0", + "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00", + "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419", + "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4", + "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6", + "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166", + "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b", + "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3", + "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf", + "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2", + "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2", + "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36", + "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03", + "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce", + "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6", + "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13", + "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5", + "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e", + "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485", + "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137", + "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374", + "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58", + "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b", + "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb", + "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b", + "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda", + "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511" ], "markers": "python_version < '3.11'", - "version": "==1.26.2" + "version": "==1.26.3" }, "openpyxl": { "hashes": [ @@ -564,34 +583,38 @@ }, "pandas": { "hashes": [ - "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9", - "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d", - "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8", - "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034", - "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34", - "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139", - "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1", - "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6", - "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d", - "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b", - "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860", - "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a", - "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540", - "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092", - "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821", - "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9", - "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623", - "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984", - "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171", - "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e", - "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead", - "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732", - "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46", - "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf", - "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7" + "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1", + "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e", + "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f", + "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2", + "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18", + "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae", + "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd", + "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab", + "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430", + "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a", + "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106", + "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5", + "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670", + "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88", + "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b", + "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d", + "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71", + "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5", + "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e", + "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc", + "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30", + "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7", + "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3", + "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a", + "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440", + "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a", + "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042", + "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1", + "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9" ], "index": "pypi", - "version": "==2.1.4" + "version": "==2.2.0" }, "pycparser": { "hashes": [ @@ -602,125 +625,98 @@ }, "pydantic": { "hashes": [ - "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0", - "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd" + "sha256:a9560d042a8113eec5acd0474067f4edf493e7b9bb03d8f83e342dfb4b0dcf84", + "sha256:c12831f560ec778224367351b94c1f9a2628c4f5fb74ed258ef70918d330b812" ], "index": "pypi", - "version": "==2.5.2" + "version": "==2.6.0b1" }, "pydantic-core": { "hashes": [ - "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b", - "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b", - "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d", - "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8", - "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124", - "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189", - "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c", - "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d", - "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f", - "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520", - "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4", - "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6", - "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955", - "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3", - "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b", - "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a", - "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68", - "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3", - "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd", - "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de", - "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b", - "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634", - "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7", - "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459", - "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7", - "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3", - "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331", - "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf", - "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d", - "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36", - "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59", - "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937", - "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc", - "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093", - "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753", - "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706", - "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca", - "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260", - "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997", - "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588", - "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71", - "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb", - "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e", - "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69", - "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5", - "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07", - "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1", - "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0", - "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd", - "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8", - "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944", - "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26", - "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda", - "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4", - "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9", - "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00", - "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe", - "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6", - "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada", - "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4", - "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7", - "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325", - "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4", - "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b", - "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88", - "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04", - "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863", - "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0", - "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911", - "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b", - "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e", - "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144", - "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5", - "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720", - "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab", - "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d", - "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789", - "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec", - "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2", - "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db", - "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f", - "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef", - "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3", - "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209", - "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc", - "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651", - "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8", - "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e", - "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66", - "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7", - "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550", - "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd", - "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405", - "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27", - "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093", - "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077", - "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113", - "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3", - "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6", - "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf", - "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed", - "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88", - "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe", - "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18", - "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867" + "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7", + "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca", + "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51", + "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da", + "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc", + "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae", + "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4", + "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b", + "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0", + "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e", + "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118", + "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506", + "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798", + "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f", + "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d", + "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948", + "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f", + "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9", + "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137", + "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640", + "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f", + "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff", + "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706", + "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d", + "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f", + "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c", + "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8", + "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1", + "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7", + "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95", + "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60", + "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253", + "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e", + "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c", + "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc", + "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3", + "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8", + "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9", + "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c", + "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388", + "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95", + "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91", + "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818", + "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8", + "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f", + "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394", + "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13", + "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17", + "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7", + "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06", + "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f", + "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196", + "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66", + "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf", + "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c", + "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76", + "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0", + "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212", + "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f", + "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49", + "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206", + "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48", + "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c", + "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2", + "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05", + "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610", + "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd", + "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76", + "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1", + "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60", + "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34", + "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4", + "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864", + "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66", + "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c", + "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e", + "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54", + "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8", + "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.5" + "markers": "python_version >= '3.8'", + "version": "==2.16.1" }, "pyjwt": { - "extras": [], "hashes": [ "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" @@ -738,11 +734,11 @@ }, "pynamodb": { "hashes": [ - "sha256:6aa659c11d4a8a18ef2d75392a08828d45ab9eefb9638871d455929a52d66fc3", - "sha256:b9d9a59afd9edbc3db63a267e67db764831f277477ae744ed4febb778ef1a098" + "sha256:05b3aa02021050393e0667944a20af3da60f55984de86126786844c2d47b9a18", + "sha256:7217f87b6e5c9866d915265fd462fa4a012b37b0149bf1f814b33100b50e901f" ], "index": "pypi", - "version": "==5.5.1" + "version": "==6.0.0" }, "python-dateutil": { "hashes": [ @@ -805,6 +801,7 @@ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", @@ -839,11 +836,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "six": { "hashes": [ @@ -863,66 +860,66 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3", - "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884", - "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74", - "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d", - "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc", - "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca", - "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d", - "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf", - "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846", - "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306", - "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221", - "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5", - "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89", - "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55", - "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72", - "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea", - "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8", - "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577", - "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df", - "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4", - "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d", - "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34", - "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4", - "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24", - "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6", - "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965", - "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35", - "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b", - "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab", - "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22", - "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4", - "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204", - "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855", - "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d", - "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab", - "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69", - "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693", - "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e", - "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8", - "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0", - "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45", - "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab", - "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1", - "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d", - "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda", - "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b", - "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18", - "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac", - "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60" + "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", + "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", + "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", + "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", + "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", + "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", + "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", + "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", + "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", + "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", + "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", + "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", + "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", + "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", + "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", + "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", + "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", + "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", + "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", + "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", + "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", + "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", + "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", + "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", + "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", + "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", + "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", + "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", + "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", + "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", + "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", + "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", + "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", + "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", + "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", + "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", + "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", + "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", + "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", + "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", + "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", + "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", + "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", + "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", + "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", + "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", + "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", + "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", + "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" ], "index": "pypi", - "version": "==2.0.23" + "version": "==2.0.25" }, "starlette": { "hashes": [ - "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75", - "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91" + "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc", + "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25" ], - "markers": "python_version >= '3.7'", - "version": "==0.27.0" + "markers": "python_version >= '3.8'", + "version": "==0.35.1" }, "typing-extensions": { "hashes": [ @@ -934,11 +931,11 @@ }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", + "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" ], "markers": "python_version >= '2'", - "version": "==2023.3" + "version": "==2023.4" }, "urllib3": { "hashes": [ @@ -949,15 +946,13 @@ "version": "==1.26.18" }, "uvicorn": { - "extras": [ - "standard" - ], + "extras": [], "hashes": [ - "sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e", - "sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e" + "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24", + "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6" ], "index": "pypi", - "version": "==0.24.0.post1" + "version": "==0.27.0" }, "uvloop": { "hashes": [ @@ -1172,11 +1167,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -1196,11 +1191,11 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "tomli": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index 6fda8e61..1b0bfbd9 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -47,19 +47,19 @@ }, "boto3": { "hashes": [ - "sha256:2225edaea2fa17274f62707c12d9f7803c998af7089fe8a1ec8e4f1ebf47677e", - "sha256:475efcff30401041e9c348e20613eca90ab14a224e2f978ca80de98ba3499435" + "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", + "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" ], "index": "pypi", - "version": "==1.33.12" + "version": "==1.34.24" }, "botocore": { "hashes": [ - "sha256:067c94fa88583c04ae897d48a11d2be09f280363b8e794b82d78d631d3a3e910", - "sha256:48b9cfb9c5f7f9634a71782f16a324acb522b65856ad46be69efe04c3322b23c" + "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", + "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" ], - "markers": "python_version >= '3.7'", - "version": "==1.33.12" + "markers": "python_version >= '3.8'", + "version": "==1.34.24" }, "cffi": { "hashes": [ @@ -181,11 +181,11 @@ }, "s3transfer": { "hashes": [ - "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283", - "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76" + "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", + "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" ], - "markers": "python_version >= '3.7'", - "version": "==0.8.2" + "markers": "python_version >= '3.8'", + "version": "==0.10.0" }, "simplejson": { "hashes": [ @@ -266,11 +266,11 @@ }, "flake8": { "hashes": [ - "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", - "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==6.1.0" + "version": "==7.0.0" }, "mccabe": { "hashes": [ @@ -290,11 +290,11 @@ }, "pyflakes": { "hashes": [ - "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", - "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], "markers": "python_version >= '3.8'", - "version": "==3.1.0" + "version": "==3.2.0" }, "tomli": { "hashes": [ From 426426b278641e8f01a0ad8f1d4660341e09459e Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 24 Jan 2024 15:11:49 +0900 Subject: [PATCH 885/962] =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80=E3=83=BCCac?= =?UTF-8?q?he-Control=E3=83=BBX-Content-Type-Options=E3=83=BBStrict-Transp?= =?UTF-8?q?ort-Security=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio_api.py | 16 +++++++++++ ecs/jskult-webapp/src/controller/login.py | 16 +++++++++++ ecs/jskult-webapp/src/controller/logout.py | 7 +++++ .../src/router/session_router.py | 8 ++++++ ecs/jskult-webapp/src/templates/_header.html | 27 +++++++------------ 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_api.py b/ecs/jskult-webapp/src/controller/bio_api.py index 2f96408a..d907fd70 100644 --- a/ecs/jskult-webapp/src/controller/bio_api.py +++ b/ecs/jskult-webapp/src/controller/bio_api.py @@ -79,6 +79,14 @@ def search_bio_data( 'data': data, 'count': bio_sales_lot_count }) + + # X-Content-Type-Optionsヘッダー追加 + json_response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + json_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + json_response.headers['Cache-Control'] = 'private' + # クッキーも書き換え json_response.set_cookie( key='session', @@ -152,6 +160,14 @@ async def download_bio_data( 'status': 'ok', 'download_url': download_file_url }) + + # X-Content-Type-Optionsヘッダー追加 + json_response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + json_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + json_response.headers['Cache-Control'] = 'private' + json_response.set_cookie( key='session', value=session.session_key, diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index c8a5663c..3edf877d 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -113,6 +113,14 @@ def login( status_code=status.HTTP_303_SEE_OTHER, headers={'session_key': session_key} ) + + # X-Content-Type-Optionsヘッダー追加 + response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + response.headers['Cache-Control'] = 'private' + return response @@ -170,4 +178,12 @@ def sso_authorize( status_code=status.HTTP_303_SEE_OTHER, headers={'session_key': session_key} ) + + # X-Content-Type-Optionsヘッダー追加 + response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + response.headers['Cache-Control'] = 'private' + return response diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 76d9ef60..c11e10d0 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -54,4 +54,11 @@ def logout_view( if session: session_service.delete_session(session) + # X-Content-Type-Optionsヘッダー追加 + template_response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + template_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + template_response.headers['Cache-Control'] = 'private' + return template_response diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index a4a28e25..4f6ffe2f 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -103,6 +103,14 @@ class AfterSetCookieSessionRoute(MeDaCaRoute): """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー""" async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) + + # X-Content-Type-Optionsヘッダー追加 + response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + response.headers['Cache-Control'] = 'private' + session_key = response.headers.get('session_key', None) # セッションキーがない場合はセットせずに返す if session_key is None: diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 920d0beb..458df9fb 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -1,15 +1,9 @@ - + + - - - - - - - - - \ No newline at end of file + + + + + + + \ No newline at end of file From a435c51bc75177eebb00f43a752b9ceb8e66ef3f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 25 Jan 2024 16:08:05 +0900 Subject: [PATCH 886/962] =?UTF-8?q?X-Frame-Options=E3=83=98=E3=83=83?= =?UTF-8?q?=E3=83=80=E3=83=BC=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio_api.py | 6 +++++- ecs/jskult-webapp/src/controller/login.py | 4 ++++ ecs/jskult-webapp/src/controller/logout.py | 2 ++ ecs/jskult-webapp/src/router/session_router.py | 2 ++ ecs/jskult-webapp/src/templates/_header.html | 16 ++-------------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_api.py b/ecs/jskult-webapp/src/controller/bio_api.py index d907fd70..bbb06b69 100644 --- a/ecs/jskult-webapp/src/controller/bio_api.py +++ b/ecs/jskult-webapp/src/controller/bio_api.py @@ -79,7 +79,9 @@ def search_bio_data( 'data': data, 'count': bio_sales_lot_count }) - + + # X-Frame-Optionsヘッダー追加 + json_response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 json_response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 @@ -161,6 +163,8 @@ async def download_bio_data( 'download_url': download_file_url }) + # X-Frame-Optionsヘッダー追加 + json_response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 json_response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 3edf877d..bcc48fe1 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -114,6 +114,8 @@ def login( headers={'session_key': session_key} ) + # X-Frame-Optionsヘッダー追加 + response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 @@ -179,6 +181,8 @@ def sso_authorize( headers={'session_key': session_key} ) + # X-Frame-Optionsヘッダー追加 + response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index c11e10d0..99ee8813 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -54,6 +54,8 @@ def logout_view( if session: session_service.delete_session(session) + # X-Frame-Optionsヘッダー追加 + template_response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 template_response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 4f6ffe2f..9672d23b 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -104,6 +104,8 @@ class AfterSetCookieSessionRoute(MeDaCaRoute): async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) + # X-Frame-Optionsヘッダー追加 + response.headers['X-Frame-Options'] = 'DENY' # X-Content-Type-Optionsヘッダー追加 response.headers['X-Content-Type-Options'] = 'nosniff' # Strict-Transport-Securityヘッダー追加 diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 458df9fb..db30bfb4 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -3,21 +3,9 @@ - - - - - - - - {{subtitle}} - - + + From 46fa3844ab909f255861ffdf7aabee9e7ce39ee8 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 29 Jan 2024 13:46:05 +0900 Subject: [PATCH 887/962] =?UTF-8?q?SRI=E3=81=AE=E6=B3=A8=E6=84=8F=E4=BA=8B?= =?UTF-8?q?=E9=A0=85=E3=83=BBhash=E3=82=92=E7=94=9F=E6=88=90=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E8=BF=BD=E5=8A=A0=E8=A8=98=E8=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index 97632b8f..e85ed943 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -195,3 +195,16 @@ - コントローラーのrouter変数が、`router.route_class = Authenticate`となっている場合、以下の動きをする - リクエスト到達時にセッションの有無をチェックする - レスポンス時、クッキーにセッションキーを登録する + +## ヘッダーにSRI設定・生成方法 +- インポートされたソースに更新したら、SRIのintegrity hashも更新すること + - ソースはローカルにある場合下記の`bash`コマンドでハッシュ生成できる: + ``` + cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A + ``` + - 外部ソース *(リンクから)* 使用する場合は下記のMDNオンラインツールでハッシュ生成できる: + [SRI Hash Generator](https://www.srihash.org/) + - SRIサンプル: + ``` + + ``` From 3feca4d25c793453a76b59e9fc1a16a41fd3a29c Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 29 Jan 2024 16:50:31 +0900 Subject: [PATCH 888/962] =?UTF-8?q?=E3=83=9F=E3=83=89=E3=83=AB=E3=82=A6?= =?UTF-8?q?=E3=82=A7=E3=82=A2=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio_api.py | 18 ------- ecs/jskult-webapp/src/controller/login.py | 18 ------- ecs/jskult-webapp/src/controller/logout.py | 9 ---- ecs/jskult-webapp/src/main.py | 5 ++ ecs/jskult-webapp/src/middleware/__init__.py | 0 .../src/middleware/middleware.py | 47 +++++++++++++++++++ .../src/router/session_router.py | 9 ---- 7 files changed, 52 insertions(+), 54 deletions(-) create mode 100644 ecs/jskult-webapp/src/middleware/__init__.py create mode 100644 ecs/jskult-webapp/src/middleware/middleware.py diff --git a/ecs/jskult-webapp/src/controller/bio_api.py b/ecs/jskult-webapp/src/controller/bio_api.py index bbb06b69..4989a50d 100644 --- a/ecs/jskult-webapp/src/controller/bio_api.py +++ b/ecs/jskult-webapp/src/controller/bio_api.py @@ -80,15 +80,6 @@ def search_bio_data( 'count': bio_sales_lot_count }) - # X-Frame-Optionsヘッダー追加 - json_response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - json_response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - json_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - json_response.headers['Cache-Control'] = 'private' - # クッキーも書き換え json_response.set_cookie( key='session', @@ -162,15 +153,6 @@ async def download_bio_data( 'status': 'ok', 'download_url': download_file_url }) - - # X-Frame-Optionsヘッダー追加 - json_response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - json_response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - json_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - json_response.headers['Cache-Control'] = 'private' json_response.set_cookie( key='session', diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index bcc48fe1..5c8d904e 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -114,15 +114,6 @@ def login( headers={'session_key': session_key} ) - # X-Frame-Optionsヘッダー追加 - response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - response.headers['Cache-Control'] = 'private' - return response @@ -180,14 +171,5 @@ def sso_authorize( status_code=status.HTTP_303_SEE_OTHER, headers={'session_key': session_key} ) - - # X-Frame-Optionsヘッダー追加 - response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - response.headers['Cache-Control'] = 'private' return response diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 99ee8813..76d9ef60 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -54,13 +54,4 @@ def logout_view( if session: session_service.delete_session(session) - # X-Frame-Optionsヘッダー追加 - template_response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - template_response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - template_response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - template_response.headers['Cache-Control'] = 'private' - return template_response diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index 9a19d97b..61a8170f 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -10,6 +10,7 @@ from src.controller import (bio, bio_api, healthcheck, login, logout, from src.core import task from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException +from src.middleware.middleware import ErrorHandlingMiddleware, SecurityHeadersMiddleware app = FastAPI(openapi_url=None) @@ -42,5 +43,9 @@ app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) # サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 app.add_exception_handler(UnexpectedException, http_exception_handler) +# セキュリティヘッダー設定・サーバーエラーや認証失敗はミドルウェアで処理する +app.add_middleware(ErrorHandlingMiddleware) +app.add_middleware(SecurityHeadersMiddleware) + # サーバー起動時のイベント app.add_event_handler('startup', task.create_start_app_handler()) diff --git a/ecs/jskult-webapp/src/middleware/__init__.py b/ecs/jskult-webapp/src/middleware/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-webapp/src/middleware/middleware.py b/ecs/jskult-webapp/src/middleware/middleware.py new file mode 100644 index 00000000..64ffeb0b --- /dev/null +++ b/ecs/jskult-webapp/src/middleware/middleware.py @@ -0,0 +1,47 @@ +from fastapi import Request, Response, status +from fastapi.responses import JSONResponse +from starlette.middleware.base import BaseHTTPMiddleware + +class SecurityHeadersMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request, call_next): + response = await call_next(request) + # X-Frame-Optionsヘッダー追加 + response.headers['X-Frame-Options'] = 'DENY' + # X-Content-Type-Optionsヘッダー追加 + response.headers['X-Content-Type-Options'] = 'nosniff' + # Strict-Transport-Securityヘッダー追加 + response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' + # Cache-Controlヘッダー追加 + response.headers['Cache-Control'] = 'private' + return response + +class ErrorHandlingMiddleware(BaseHTTPMiddleware): + # エラーハンドリングをするミドルウェア + # API内で発生したエラーをキャッチして処理を施す + + async def dispatch(self, request: Request, call_next) -> Response: + try: + response: Response = await call_next(request) + except TypeError as e: + response = JSONResponse( + {"msg": "TypeError:内容を確認してもう一度データ挿入をしてください。"}, + status.HTTP_404_NOT_FOUND, + ) + except TimeoutError as e: + response = JSONResponse( + {"msg": "TimeoutError:タイムアウトエラーが発生しました。"}, + status.HTTP_408_REQUEST_TIMEOUT, + ) + except RuntimeError as e: + response = JSONResponse( + {"msg": "RuntimeError:ランタイムエラーが発生しました。"}, + status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + except Exception as e: + response = JSONResponse( + {"msg": "Exception:基底クラスエラーが発生しました。"}, + status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + return response + + diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 9672d23b..30690590 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -104,15 +104,6 @@ class AfterSetCookieSessionRoute(MeDaCaRoute): async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) - # X-Frame-Optionsヘッダー追加 - response.headers['X-Frame-Options'] = 'DENY' - # X-Content-Type-Optionsヘッダー追加 - response.headers['X-Content-Type-Options'] = 'nosniff' - # Strict-Transport-Securityヘッダー追加 - response.headers['Strict-Transport-Security'] = 'max-age=31536000 includeSubDomains' - # Cache-Controlヘッダー追加 - response.headers['Cache-Control'] = 'private' - session_key = response.headers.get('session_key', None) # セッションキーがない場合はセットせずに返す if session_key is None: From ff6dd0b68a6c6b68b50133c56854df036465274c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 29 Jan 2024 17:21:31 +0900 Subject: [PATCH 889/962] =?UTF-8?q?feat:=20SRI=E3=83=8F=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E5=80=A4=E3=81=AB=E3=81=A4=E3=81=84=E3=81=A6=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/README.md | 47 +++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index e85ed943..5eda4c73 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -196,15 +196,38 @@ - リクエスト到達時にセッションの有無をチェックする - レスポンス時、クッキーにセッションキーを登録する -## ヘッダーにSRI設定・生成方法 -- インポートされたソースに更新したら、SRIのintegrity hashも更新すること - - ソースはローカルにある場合下記の`bash`コマンドでハッシュ生成できる: - ``` - cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A - ``` - - 外部ソース *(リンクから)* 使用する場合は下記のMDNオンラインツールでハッシュ生成できる: - [SRI Hash Generator](https://www.srihash.org/) - - SRIサンプル: - ``` - - ``` +## HTMLで読み込んでいるスクリプトのSRIハッシュ値を生成・設定する方法 + +### サブリソース完全性 (Subresource Integrity, SRI) とは + +CDN などから取得したリソースが意図せず改ざんされていないかをブラウザーが検証するセキュリティ機能です。 SRI を利用する際には、取得したリソースのハッシュ値と一致すべきハッシュ値を指定します。 + +詳細: + +実消化&アルトマークのWebアプリケーションでは、複数の外部スクリプトを読み込んで動作しているため、読み込むスクリプトを変更した場合は、 +タグの属性値`integrity`に設定されているスクリプトのハッシュ値を更新する必要がある。 + +### SRI ハッシュ値の生成方法(サーバー内のスクリプトについて) + +- サーバー内に保管されているスクリプトを更新した場合、Linux環境(WSL2でも可)で、以下のコマンドを実行し、ハッシュ値を生成する + +```bash +cat <更新したスクリプトファイル名> | openssl dgst -sha384 -binary | openssl base64 -A +``` + +参考: + + +### SRI ハッシュ値の生成方法(外部サイトから読み込んでいるスクリプトについて) + +- 外部サイトから読み込んでいるスクリプトを更新した場合、下記のMDNオンラインツールでハッシュ値を生成する + - [SRI Hash Generator](https://www.srihash.org/) + +### SRI ハッシュ値の設定方法 + +- 更新したスクリプトを読み込んでいる箇所の`integrity`属性値を、生成したハッシュ値に置き換える +- 以下は設定のサンプル + +```bash + +``` From 172c6e070b7a1a330cfdbb9911da7e04f41f6556 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 30 Jan 2024 09:21:04 +0900 Subject: [PATCH 890/962] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/main.py | 5 ++- .../src/middleware/middleware.py | 31 ------------------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index 61a8170f..f0e1807d 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -10,7 +10,7 @@ from src.controller import (bio, bio_api, healthcheck, login, logout, from src.core import task from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException -from src.middleware.middleware import ErrorHandlingMiddleware, SecurityHeadersMiddleware +from src.middleware.middleware import SecurityHeadersMiddleware app = FastAPI(openapi_url=None) @@ -43,8 +43,7 @@ app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) # サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 app.add_exception_handler(UnexpectedException, http_exception_handler) -# セキュリティヘッダー設定・サーバーエラーや認証失敗はミドルウェアで処理する -app.add_middleware(ErrorHandlingMiddleware) +# セキュリティヘッダー設定はミドルウェアで処理する app.add_middleware(SecurityHeadersMiddleware) # サーバー起動時のイベント diff --git a/ecs/jskult-webapp/src/middleware/middleware.py b/ecs/jskult-webapp/src/middleware/middleware.py index 64ffeb0b..264fd190 100644 --- a/ecs/jskult-webapp/src/middleware/middleware.py +++ b/ecs/jskult-webapp/src/middleware/middleware.py @@ -14,34 +14,3 @@ class SecurityHeadersMiddleware(BaseHTTPMiddleware): # Cache-Controlヘッダー追加 response.headers['Cache-Control'] = 'private' return response - -class ErrorHandlingMiddleware(BaseHTTPMiddleware): - # エラーハンドリングをするミドルウェア - # API内で発生したエラーをキャッチして処理を施す - - async def dispatch(self, request: Request, call_next) -> Response: - try: - response: Response = await call_next(request) - except TypeError as e: - response = JSONResponse( - {"msg": "TypeError:内容を確認してもう一度データ挿入をしてください。"}, - status.HTTP_404_NOT_FOUND, - ) - except TimeoutError as e: - response = JSONResponse( - {"msg": "TimeoutError:タイムアウトエラーが発生しました。"}, - status.HTTP_408_REQUEST_TIMEOUT, - ) - except RuntimeError as e: - response = JSONResponse( - {"msg": "RuntimeError:ランタイムエラーが発生しました。"}, - status.HTTP_500_INTERNAL_SERVER_ERROR, - ) - except Exception as e: - response = JSONResponse( - {"msg": "Exception:基底クラスエラーが発生しました。"}, - status.HTTP_500_INTERNAL_SERVER_ERROR, - ) - return response - - From c5d99acf1b0139dee023f2371a5a3490aa198b84 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 30 Jan 2024 09:29:14 +0900 Subject: [PATCH 891/962] =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80?= =?UTF-8?q?=E6=A7=8B=E6=88=90=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ecs/jskult-webapp/README.md b/ecs/jskult-webapp/README.md index 5eda4c73..c65cbf83 100644 --- a/ecs/jskult-webapp/README.md +++ b/ecs/jskult-webapp/README.md @@ -84,6 +84,8 @@ │   ├── exception_handler.py -- FastAPI内部でエラー発生時のハンドリング │   └── exceptions.py -- カスタム例外クラス ├── main.py -- APサーバーのエントリーポイント。ここでルーターやハンドラーの登録を行う + ├── middleware -- ミドルウェアの設定 + │ └── middleware.py ├── model -- モデル層(MVCのM) │   ├── db -- リポジトリから返されるDBレコードのモデル │   │   ├── base_db_model.py From f93bacd41f66639b8795445b99d77a6124d73a31 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 30 Jan 2024 13:50:23 +0900 Subject: [PATCH 892/962] =?UTF-8?q?fix:=20flatpickr/dist/l10n/ja.min.js?= =?UTF-8?q?=E3=81=AE=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5=E5=80=A4=E3=81=8C?= =?UTF-8?q?=E7=95=B0=E3=81=AA=E3=82=8A=E3=80=81Failed=20to=20find=20a=20va?= =?UTF-8?q?lid=20digest=20in=20the=20'integrity'=20attribute=20for=20resou?= =?UTF-8?q?rce=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=8C=E7=99=BA?= =?UTF-8?q?=E7=94=9F=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/_header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index db30bfb4..2ff16a36 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -15,6 +15,6 @@ - + \ No newline at end of file From 125b57dd25a7c9c9a5c2a9624dfc01ebabcbb6f4 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 30 Jan 2024 13:51:36 +0900 Subject: [PATCH 893/962] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=E3=81=99?= =?UTF-8?q?=E3=82=8BCDN=E3=82=92=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/_header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 2ff16a36..ce11850b 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -11,9 +11,9 @@ - + - + From e217d2ed23a967b3293b19872a9998b37850c152 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 30 Jan 2024 13:52:02 +0900 Subject: [PATCH 894/962] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84CSS=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=AA=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/_header.html | 1 - 1 file changed, 1 deletion(-) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index ce11850b..4f7906e3 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -5,7 +5,6 @@ {{subtitle}} - From cd00e24966dda5818fd44e59ce1cfbb96b841941 Mon Sep 17 00:00:00 2001 From: Asuka Asakura Date: Fri, 2 Feb 2024 11:57:41 +0900 Subject: [PATCH 895/962] =?UTF-8?q?MSJ=5FPatient=5F=5Fc=20=E3=81=AE?= =?UTF-8?q?=E5=B1=A5=E6=AD=B4=E7=AE=A1=E7=90=86=E3=81=A8=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 18 +++++++++++++++++- s3/data/crm/settings/CRM_MSJ_Patient__c.txt | 8 ++++---- s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql 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 243b07db..e328fe4c 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -2659,7 +2659,23 @@ "MSJ_Child_Account_Name__c", "MSJ_Child_Account__c", "MSJ_Parent_Account_Name__c", - "MSJ_Parent_Child_Name__c" + "MSJ_Parent_Child_Name__c", + "MSJ_Age__c", + "MSJ_Comments__c", + "MSJ_Effectiveness_evaluation_date__c", + "MSJ_Gender__c", + "MSJ_Informed_consent__c", + "MSJ_Metastases_location__c", + "MSJ_PS__c", + "MSJ_Scheduled_date_of_informed_consent__c", + "MSJ_Scheduled_start_date_administration__c", + "MSJ_CDX_type__c", + "MSJ_First_line_chemotherapy_efficacy__c", + "MSJ_Num_cycles_of_1st_line_chemotherapy__c", + "MSJ_Primary_site_location__c", + "MSJ_Regimen_of_first_line_chemotherapy__c", + "MSJ_Starting_dose__c" + ], "is_skip": false, "is_update_last_fetch_datetime": true diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt index 8f470747..4f47c679 100644 --- a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -37 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c +52 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c, MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c, MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c src02c.crm_MSJ_Patient__c org02.crm_MSJ_Patient__c - +CRM_MSJ_Patient__c_ex.sql diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql new file mode 100644 index 00000000..161d38ea --- /dev/null +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02c.crm_MSJ_Patient__c', 'SystemModstamp'); From 930b3931964968188e710e32230fda3753bd6eac Mon Sep 17 00:00:00 2001 From: Asuka Asakura Date: Fri, 2 Feb 2024 12:01:15 +0900 Subject: [PATCH 896/962] =?UTF-8?q?MSJ=5FPatient=5F=5Fc=20=E3=81=AE?= =?UTF-8?q?=E5=B1=A5=E6=AD=B4=E7=AE=A1=E7=90=86=E3=81=A8=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 1 - 1 file changed, 1 deletion(-) 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 e328fe4c..5fc83f7d 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -2675,7 +2675,6 @@ "MSJ_Primary_site_location__c", "MSJ_Regimen_of_first_line_chemotherapy__c", "MSJ_Starting_dose__c" - ], "is_skip": false, "is_update_last_fetch_datetime": true From 27fd3536d98d20caeafe980ec2ead27d12f2aa0a Mon Sep 17 00:00:00 2001 From: Asuka Asakura Date: Tue, 6 Feb 2024 09:32:24 +0900 Subject: [PATCH 897/962] =?UTF-8?q?=E8=AA=A4=E3=81=A3=E3=81=9F=E3=82=BF?= =?UTF-8?q?=E3=83=96=E3=81=AE=E9=99=A4=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_MSJ_Patient__c.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt index 4f47c679..9bf209e6 100644 --- a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 52 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c, MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c, MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c src02c.crm_MSJ_Patient__c org02.crm_MSJ_Patient__c CRM_MSJ_Patient__c_ex.sql From 866db319ea333e86e2b542b7dfd6f83a32f4473c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 9 Feb 2024 10:35:52 +0900 Subject: [PATCH 898/962] =?UTF-8?q?feat:=20Encise=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E8=BB=A2=E9=80=81=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transfer-encise-data.py | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 lambda/transfer-encise-data/transfer-encise-data.py diff --git a/lambda/transfer-encise-data/transfer-encise-data.py b/lambda/transfer-encise-data/transfer-encise-data.py new file mode 100644 index 00000000..f109d008 --- /dev/null +++ b/lambda/transfer-encise-data/transfer-encise-data.py @@ -0,0 +1,101 @@ +import datetime +import logging +import os +from zoneinfo import ZoneInfo + +import boto3 + +# 環境変数 +DATA_IMPORT_BUCKET = os.environ["DATA_IMPORT_BUCKET"] +ENCISE_BACKUP_BUCKET = os.environ["ENCISE_BACKUP_BUCKET"] +ENCISE_TARGET_FOLDER = os.environ["ENCISE_TARGET_FOLDER"] +LOG_LEVEL = os.environ["LOG_LEVEL"] +TZ = os.environ["TZ"] + +# 定数 +EXCLUSIVE_CONTROL_FILE_EXT = '.doing' + +# S3クライアント +s3_client = boto3.client('s3') + +# logger設定 +logger = logging.getLogger() + + +def log_datetime_convert_tz(*arg): + """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" + return datetime.datetime.now(ZoneInfo(TZ)).timetuple() + + +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +formatter.converter = log_datetime_convert_tz +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Encise受信データ転送処理') + + # ② 処理開始時に受け取ったイベント情報をログに出力する + # バケット名・フォルダ名・受信データファイル名をメモリに保持 + s3_event = event["Records"][0]["s3"] + event_bucket_name = s3_event["bucket"]["name"] + event_object_key = s3_event["object"]["key"] + event_file_name = os.path.basename(event_object_key) + event_folder_name = os.path.dirname(event_object_key).split('/')[0] + logger.info(f'I-02-01 受信バケット:{event_bucket_name}') + logger.info(f'I-02-01 フォルダ名:{event_folder_name}') + logger.info(f'I-02-01 ファイル名:{event_file_name}') + + # ③ S3イベントによるLambdaの重複発火防止の為、メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルが存在するかチェックする + try: + s3_client.head_object(Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + logger.error(f'E-01-01 {event_bucket_name}/{event_object_key}は現在処理中です。処理を終了します。') + return + except Exception: + # .doingファイルが見つからなかった場合は、処理を続行する + # メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルを作成する + logger.info('I-03-01 Encise受信データを転送します') + s3_client.put_object( + Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}', Body=b'') + + # ⑤ 受信データファイルを、Enciseデータバックアップバケットにコピーする + copy_source = {'Bucket': event_bucket_name, 'Key': event_object_key} + execute_date_yyyymm = datetime.date.today().strftime('%Y/%m') + s3_client.copy_object( + Bucket=ENCISE_BACKUP_BUCKET, + Key=f'{event_folder_name}/{execute_date_yyyymm}/{event_file_name}', + CopySource=copy_source + ) + logger.info(f'I-04-01 Encise受信データのバックアップ完了:{ENCISE_BACKUP_BUCKET}/{event_folder_name}/{execute_date_yyyymm}/{event_file_name}') + + # ⑥ 受信データファイルを、データ登録バケットのEnciseデータ取込フォルダに移動する + s3_client.copy_object( + Bucket=DATA_IMPORT_BUCKET, + Key=f'{ENCISE_TARGET_FOLDER}/{event_file_name}', + CopySource=copy_source + ) + # コピー後、元のバケットからは削除する + s3_client.delete_object(Bucket=event_bucket_name, Key=event_object_key) + logger.info(f'I-05-01 Encise受信データの転送完了:{DATA_IMPORT_BUCKET}/{ENCISE_TARGET_FOLDER}/{event_file_name}') + + # ⑦ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する + s3_client.delete_object(Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + + logger.info('I-01-06 処理終了 Encise受信データ転送処理') + + except Exception as e: + logger.exception(f'想定外のエラーが発生しました。処理を終了します。 例外内容:{e}') + raise e + + return From ee2557928c5674578c8ed7591e59f109eaf85eca Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 9 Feb 2024 10:42:01 +0900 Subject: [PATCH 899/962] =?UTF-8?q?style:=20=E3=82=BF=E3=83=96=E2=86=92?= =?UTF-8?q?=E3=82=B9=E3=83=9A=E3=83=BC=E3=82=B9=E3=81=AB=E5=A4=89=E6=8F=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/transfer-encise-data/transfer-encise-data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/transfer-encise-data/transfer-encise-data.py b/lambda/transfer-encise-data/transfer-encise-data.py index f109d008..bc58963c 100644 --- a/lambda/transfer-encise-data/transfer-encise-data.py +++ b/lambda/transfer-encise-data/transfer-encise-data.py @@ -89,7 +89,7 @@ def lambda_handler(event, context): s3_client.delete_object(Bucket=event_bucket_name, Key=event_object_key) logger.info(f'I-05-01 Encise受信データの転送完了:{DATA_IMPORT_BUCKET}/{ENCISE_TARGET_FOLDER}/{event_file_name}') - # ⑦ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する + # ⑦ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する s3_client.delete_object(Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') logger.info('I-01-06 処理終了 Encise受信データ転送処理') From add64b3bc8b9bfa46a1f6ff6adb92383f4d13082 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 12:49:11 +0900 Subject: [PATCH 900/962] =?UTF-8?q?feat:=20Encise=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E9=80=A3=E6=90=BA=20=E3=83=87=E3=83=BC=E3=82=BF=E6=9C=AA?= =?UTF-8?q?=E5=8F=97=E4=BF=A1=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6?= =?UTF-8?q?=E7=90=86=E5=AE=9F=E8=A3=85=E3=80=82=E7=B4=B0=E3=81=8B=E3=81=84?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=81=AE=E5=AE=9F=E8=A3=85?= =?UTF-8?q?=E3=81=8C=E3=81=BE=E3=81=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 293 ++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 lambda/encise-data-unreceive-check/encise-data-unreceive-check.py diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py new file mode 100644 index 00000000..6dc2e89c --- /dev/null +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -0,0 +1,293 @@ +import csv +import datetime +import io +import json +import logging +import os +import re +from zoneinfo import ZoneInfo + +import boto3 + +# 環境変数 +CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] +CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH = os.environ["CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH"] +CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] +LOG_LEVEL = os.environ["LOG_LEVEL"] +MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] +MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] +NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] +NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] +PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] +PROCESSED_MESSAGE_EXPIRES_PERIOD = os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"] +TZ = os.environ["TZ"] + +# 定数 +ROW_COMMENT_SYMBOL = '#' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 +INDEX_ROW_COMMENT_SYMBOL = 0 +INDEX_SPLIT_NUM = 1 +INDEX_LAST = -1 + +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' + +# AWS操作クライアント +s3_client = boto3.client('s3') +sns_client = boto3.client('sns') +dynamodb_client = boto3.client('dynamodb') + + +# logger設定 + + +def log_datetime_convert_tz(*arg): + """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" + return datetime.datetime.now(ZoneInfo(TZ)).timetuple() + + +logger = logging.getLogger() +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +formatter.converter = log_datetime_convert_tz +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def is_duplicate_message(message_id: str) -> bool: + """DynamoDBテーブルに処理済みのSQSメッセージIdが存在するかどうかを調査する + + Args: + message_id (str): SQSメッセージId + + Returns: + bool: 存在する場合はTrue + """ + return dynamodb_client.query( + TableName=PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME, + Select='COUNT', + KeyConditionExpression='message_id = :message_id', + ExpressionAttributeValues={ + ':message_id': {'S': message_id} + } + )["Count"] != 0 + + +# Put the message to the DynamoDB Table. +# @input string batch_item_success +# +# @param batch_item_success of the message to put. +# @return Boolean +def push_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: + """処理済みのSQSメッセージIdをDynamoDBにPushする + + Args: + batch_item_success (list[str]): SQSメッセージIdのリスト + + Returns: + bool: 登録成功の場合、True + """ + for message_id in batch_item_success: + dynamodb_client.put_item( + TableName=PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME, + Item={'message_id': {'S': message_id}} + ) + return True + + +def substitute_mail_template(mail_template: str, receive_timing: str, mail_msg: str) -> str: + """メールテンプレートのプレースホルダーを置き換えます + + Args: + mail_template (str): 置き換え前のメールテンプレート + receive_timing (str): メールテンプレートのプレースホルダーを置き換える文言(受信タイミング) + mail_msg (str): メールテンプレートのプレースホルダーを置き換える文言(ファイル一覧) + + Returns: + str: 置き換え後のメール本文 + """ + substitute_dict = { + "receive_timing": receive_timing, + "notice_file_names": mail_msg + } + mail_str = mail_template.format_map(substitute_dict) + return mail_str + + +def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, str]], list[str]]: + + batch_item_failures = [] + batch_item_success = [] + + for record in records: + # メール挿入用文言を格納するためのメモリを保持する + mail_message = '' + + try: + # 1.SQSメッセージIDを取得する + message_id = record["messageId"] + # 2.DynamoDBテーブルからレコードを取得し、処理済みメッセージかどうかを判別する + if is_duplicate_message(message_id): + logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') + continue + except Exception as e: + # TODO: エラー処理実装 + raise e + + # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 + + event_parameter = json.loads(record['body']) + + # ③ 設定ファイル[受領チェック対象ファイルリスト]を読み込む + try: + logger.info( + 'I-03-01 ' + + f'受領チェック対象ファイルリスト読込 読込元:{CONFIG_BUCKET_NAME}/{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + check_target_file_list_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') + except Exception as e: + # TODO: エラー処理実装 + raise e + + # ④ 受領チェック処理を行う + receive_timing = event_parameter['receive_timing'] + logger.info(f'I-04-01 Enciseデータ受領チェック ({receive_timing}) 処理開始') + object_prefix = f'{event_parameter["check_folder_prefix"]}{execute_month}/' + # 1.Enciseデータバックアップ保管バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する + logger.info( + f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{object_prefix}' + ) + check_target_file_list_response = s3_client.list_objects_v2(CHECK_BUCKET_NAME, Prefix=object_prefix) + check_target_file_list = [] + for content in check_target_file_list_response[['Contents']]: + # オブジェクトのキーからファイル名を切り出してリストに追加 + obj_key = content['Key'].rsplit('/', INDEX_SPLIT_NUM) + check_target_file_list.append(obj_key[INDEX_LAST]) + + # 2.I/Fファイルチェック処理 + logger.info(f'I-04-03 Enciseデータ({receive_timing}) ファイルチェック処理開始') + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(check_target_file_list_response["Body"].read()), encoding='utf-8') + match_count = 0 + row_count = 0 + for tsv_row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + # 「④1.」で取得したリストが「③」で読み込んだファイル内に存在するか確認する + is_file_not_exists = True + for file_name in check_target_file_list: + match_result = re.fullmatch(tsv_row[INDEX_REGEX], file_name) + # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 + if match_result is not None: + # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 + if True: # TODO + logger.info(f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') + is_file_not_exists = False + match_count += 1 + else: + logger.info(f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}(受領年月が不正:{file_name})\n' + break + if is_file_not_exists: + logger.info(f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' + + row_count += 1 + + if row_count == match_count: + logger.info('I-04-05 I/Fファイルは全て受領していることを確認しました') + + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + logger.info('I-05-01 メール送信処理開始') + + if len(mail_message) == 0: + logger.info(f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') + batch_item_success.append(message_id) + continue + + # 1.存在した場合 + logger.info(f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') + + try: + logger.info( + 'I-05-03 ' + + f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_template = mail_title_response['Body'].read().decode('utf-8') + # 改行を取り除く + mail_title = substitute_mail_template(mail_title_template, receive_timing, mail_message) + mail_title_without_line_break = mail_title.splitlines()[0] + logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise e + + try: + logger.info( + 'I-05-05 ' + + f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template = mail_body_template_response['Body'].read().decode('utf-8') + # メール本文内のプレースホルダーを置き換える + mail_body = substitute_mail_template(mail_body_template, receive_timing, mail_message) + logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise e + + logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_NOTICE_TOPIC, + 'Subject': mail_title_without_line_break, + 'Message': mail_body + } + sns_client.publish(**params) + logger.info('I-05-08 メール送信指示をしました') + + batch_item_success.append(message_id) + + return batch_item_failures, batch_item_success + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') + # 処理稼働年月を取得しメモリに保持する + execute_date_today = datetime.date.today() + execute_month = execute_date_today.strftime('%Y/%m') + logger.info(f'I-01-02 処理稼働月:{execute_month}') + # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_failures = [] + # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_success = [] + # ② SQSメッセージ重複排除処理を行う + logger.info('I-02-01 メッセージ処理開始') + batch_item_failures, batch_item_success = unreceive_check(event["Records"], execute_month) + logger.info('I-06-01 すべてのメッセージの処理完了') + + # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する + push_success_messages_to_dynamo_db(batch_item_success) + logger.info('I-07-01 処理済みメッセージIDの記録完了') + logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') + except Exception as e: + logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + + return batch_item_failures From 43d959f6698b980770a0208a80afab74640e8b07 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:04:36 +0900 Subject: [PATCH 901/962] =?UTF-8?q?feat:=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F=E8=A3=85=EF=BC=88=E3=81=BE?= =?UTF-8?q?=E3=81=A0=E9=80=94=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 6dc2e89c..6448adcd 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -122,6 +122,18 @@ def substitute_mail_template(mail_template: str, receive_timing: str, mail_msg: return mail_str +def make_failure_item_on_error(message_id: str) -> dict[str, str]: + """Report batch item failuresによる処理に失敗したメッセージの判別のためのレスポンスを作成する + @see + Args: + message_id (str): SQSメッセージId + + Returns: + dict[str, str]: Report batch item failuresで失敗したSQSメッセージを判別するための辞書オブジェクト + """ + return {"itemIdentifier": message_id} + + def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, str]], list[str]]: batch_item_failures = [] @@ -139,11 +151,11 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') continue except Exception as e: - # TODO: エラー処理実装 - raise e + logger.error(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 - event_parameter = json.loads(record['body']) # ③ 設定ファイル[受領チェック対象ファイルリスト]を読み込む @@ -158,8 +170,9 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s ) logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') except Exception as e: - # TODO: エラー処理実装 - raise e + logger.error(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue # ④ 受領チェック処理を行う receive_timing = event_parameter['receive_timing'] @@ -232,8 +245,10 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s mail_title_without_line_break = mail_title.splitlines()[0] logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: + # TODO: エラー処理実装 logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - raise e + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue try: logger.info( @@ -250,7 +265,8 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - raise e + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') params = { @@ -267,27 +283,24 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s def lambda_handler(event, context): - try: - # ① 処理開始ログを出力する - logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') - # 処理稼働年月を取得しメモリに保持する - execute_date_today = datetime.date.today() - execute_month = execute_date_today.strftime('%Y/%m') - logger.info(f'I-01-02 処理稼働月:{execute_month}') - # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) - batch_item_failures = [] - # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) - batch_item_success = [] - # ② SQSメッセージ重複排除処理を行う - logger.info('I-02-01 メッセージ処理開始') - batch_item_failures, batch_item_success = unreceive_check(event["Records"], execute_month) - logger.info('I-06-01 すべてのメッセージの処理完了') + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') + # 処理稼働年月を取得しメモリに保持する + execute_date_today = datetime.date.today() + execute_month = execute_date_today.strftime('%Y/%m') + logger.info(f'I-01-02 処理稼働月:{execute_month}') + # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_failures = [] + # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_success = [] + # ② SQSメッセージ重複排除処理を行う + logger.info('I-02-01 メッセージ処理開始') + batch_item_failures, batch_item_success = unreceive_check(event["Records"], execute_month) + logger.info('I-06-01 すべてのメッセージの処理完了') - # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する - push_success_messages_to_dynamo_db(batch_item_success) - logger.info('I-07-01 処理済みメッセージIDの記録完了') - logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') - except Exception as e: - logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する + push_success_messages_to_dynamo_db(batch_item_success) + logger.info('I-07-01 処理済みメッセージIDの記録完了') + logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') return batch_item_failures From 29dccb84fff52ef7d9ef2445aad14a9d8e5739ee Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:23:03 +0900 Subject: [PATCH 902/962] =?UTF-8?q?style:=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E5=87=A6=E7=90=86=E5=AE=9F=E8=A3=85TODO=E3=82=B3=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check/encise-data-unreceive-check.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 6448adcd..e1e9761b 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -245,7 +245,6 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s mail_title_without_line_break = mail_title.splitlines()[0] logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - # TODO: エラー処理実装 logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') batch_item_failures.append(make_failure_item_on_error(message_id)) continue From 58e3a182bc62edd32a69c043796dcd1c47ae5e4e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:33:45 +0900 Subject: [PATCH 903/962] =?UTF-8?q?feat:=20=E6=83=B3=E5=AE=9A=E5=A4=96?= =?UTF-8?q?=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E7=99=BA=E7=94=9F=E6=99=82?= =?UTF-8?q?=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6=E7=90=86=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 243 +++++++++--------- 1 file changed, 124 insertions(+), 119 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index e1e9761b..ca77d714 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -142,142 +142,147 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s for record in records: # メール挿入用文言を格納するためのメモリを保持する mail_message = '' - try: - # 1.SQSメッセージIDを取得する - message_id = record["messageId"] - # 2.DynamoDBテーブルからレコードを取得し、処理済みメッセージかどうかを判別する - if is_duplicate_message(message_id): - logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') + try: + # 1.SQSメッセージIDを取得する + message_id = record["messageId"] + # 2.DynamoDBテーブルからレコードを取得し、処理済みメッセージかどうかを判別する + if is_duplicate_message(message_id): + logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') + continue + except Exception as e: + logger.error(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") + batch_item_failures.append(make_failure_item_on_error(message_id)) continue - except Exception as e: - logger.error(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") - batch_item_failures.append(make_failure_item_on_error(message_id)) - continue - # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 - event_parameter = json.loads(record['body']) + # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 + event_parameter = json.loads(record['body']) - # ③ 設定ファイル[受領チェック対象ファイルリスト]を読み込む - try: + # ③ 設定ファイル[受領チェック対象ファイルリスト]を読み込む + try: + logger.info( + 'I-03-01 ' + + '受領チェック対象ファイルリスト読込 読込元:' + + f'{CONFIG_BUCKET_NAME}/{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + check_target_file_list_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + ) + logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') + except Exception as e: + logger.error(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue + + # ④ 受領チェック処理を行う + receive_timing = event_parameter['receive_timing'] + logger.info(f'I-04-01 Enciseデータ受領チェック ({receive_timing}) 処理開始') + object_prefix = f'{event_parameter["check_folder_prefix"]}{execute_month}/' + # 1.Enciseデータバックアップ保管バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する logger.info( - 'I-03-01 ' + - f'受領チェック対象ファイルリスト読込 読込元:{CONFIG_BUCKET_NAME}/{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' + f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{object_prefix}' ) - check_target_file_list_response = s3_client.get_object( - Bucket=CONFIG_BUCKET_NAME, - Key=f'{CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH}/{event_parameter["check_target_file_list"]}' - ) - logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') - except Exception as e: - logger.error(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") - batch_item_failures.append(make_failure_item_on_error(message_id)) - continue + check_target_file_list_response = s3_client.list_objects_v2(CHECK_BUCKET_NAME, Prefix=object_prefix) + check_target_file_list = [] + for content in check_target_file_list_response[['Contents']]: + # オブジェクトのキーからファイル名を切り出してリストに追加 + obj_key = content['Key'].rsplit('/', INDEX_SPLIT_NUM) + check_target_file_list.append(obj_key[INDEX_LAST]) - # ④ 受領チェック処理を行う - receive_timing = event_parameter['receive_timing'] - logger.info(f'I-04-01 Enciseデータ受領チェック ({receive_timing}) 処理開始') - object_prefix = f'{event_parameter["check_folder_prefix"]}{execute_month}/' - # 1.Enciseデータバックアップ保管バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する - logger.info( - f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{object_prefix}' - ) - check_target_file_list_response = s3_client.list_objects_v2(CHECK_BUCKET_NAME, Prefix=object_prefix) - check_target_file_list = [] - for content in check_target_file_list_response[['Contents']]: - # オブジェクトのキーからファイル名を切り出してリストに追加 - obj_key = content['Key'].rsplit('/', INDEX_SPLIT_NUM) - check_target_file_list.append(obj_key[INDEX_LAST]) + # 2.I/Fファイルチェック処理 + logger.info(f'I-04-03 Enciseデータ({receive_timing}) ファイルチェック処理開始') + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(check_target_file_list_response["Body"].read()), encoding='utf-8') + match_count = 0 + row_count = 0 + for tsv_row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + # 「④1.」で取得したリストが「③」で読み込んだファイル内に存在するか確認する + is_file_not_exists = True + for file_name in check_target_file_list: + match_result = re.fullmatch(tsv_row[INDEX_REGEX], file_name) + # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 + if match_result is not None: + # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 + if True: # TODO + logger.info(f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') + is_file_not_exists = False + match_count += 1 + else: + logger.info(f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}(受領年月が不正:{file_name})\n' + break + if is_file_not_exists: + logger.info(f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' - # 2.I/Fファイルチェック処理 - logger.info(f'I-04-03 Enciseデータ({receive_timing}) ファイルチェック処理開始') - receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(check_target_file_list_response["Body"].read()), encoding='utf-8') - match_count = 0 - row_count = 0 - for tsv_row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): - # 「④1.」で取得したリストが「③」で読み込んだファイル内に存在するか確認する - is_file_not_exists = True - for file_name in check_target_file_list: - match_result = re.fullmatch(tsv_row[INDEX_REGEX], file_name) - # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 - if match_result is not None: - # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 - if True: # TODO - logger.info(f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') - is_file_not_exists = False - match_count += 1 - else: - logger.info(f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') - mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}(受領年月が不正:{file_name})\n' - break - if is_file_not_exists: - logger.info(f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') - mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' + row_count += 1 - row_count += 1 + if row_count == match_count: + logger.info('I-04-05 I/Fファイルは全て受領していることを確認しました') - if row_count == match_count: - logger.info('I-04-05 I/Fファイルは全て受領していることを確認しました') + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + logger.info('I-05-01 メール送信処理開始') - # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する - logger.info('I-05-01 メール送信処理開始') + if len(mail_message) == 0: + logger.info(f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') + batch_item_success.append(message_id) + continue + + # 1.存在した場合 + logger.info(f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') + + try: + logger.info( + 'I-05-03 ' + + f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' + ) + mail_title_template = mail_title_response['Body'].read().decode('utf-8') + # 改行を取り除く + mail_title = substitute_mail_template(mail_title_template, receive_timing, mail_message) + mail_title_without_line_break = mail_title.splitlines()[0] + logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue + + try: + logger.info( + 'I-05-05 ' + + f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template_response = s3_client.get_object( + Bucket=CONFIG_BUCKET_NAME, + Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' + ) + mail_body_template = mail_body_template_response['Body'].read().decode('utf-8') + # メール本文内のプレースホルダーを置き換える + mail_body = substitute_mail_template(mail_body_template, receive_timing, mail_message) + logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append(make_failure_item_on_error(message_id)) + continue + + logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_NOTICE_TOPIC, + 'Subject': mail_title_without_line_break, + 'Message': mail_body + } + sns_client.publish(**params) + logger.info('I-05-08 メール送信指示をしました') - if len(mail_message) == 0: - logger.info(f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') batch_item_success.append(message_id) - continue - - # 1.存在した場合 - logger.info(f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') - - try: - logger.info( - 'I-05-03 ' + - f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' - ) - mail_title_response = s3_client.get_object( - Bucket=CONFIG_BUCKET_NAME, - Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' - ) - mail_title_template = mail_title_response['Body'].read().decode('utf-8') - # 改行を取り除く - mail_title = substitute_mail_template(mail_title_template, receive_timing, mail_message) - mail_title_without_line_break = mail_title.splitlines()[0] - logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') batch_item_failures.append(make_failure_item_on_error(message_id)) continue - try: - logger.info( - 'I-05-05 ' + - f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' - ) - mail_body_template_response = s3_client.get_object( - Bucket=CONFIG_BUCKET_NAME, - Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' - ) - mail_body_template = mail_body_template_response['Body'].read().decode('utf-8') - # メール本文内のプレースホルダーを置き換える - mail_body = substitute_mail_template(mail_body_template, receive_timing, mail_message) - logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') - except Exception as e: - logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - batch_item_failures.append(make_failure_item_on_error(message_id)) - continue - - logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') - params = { - 'TopicArn': MBJ_NOTICE_TOPIC, - 'Subject': mail_title_without_line_break, - 'Message': mail_body - } - sns_client.publish(**params) - logger.info('I-05-08 メール送信指示をしました') - - batch_item_success.append(message_id) - return batch_item_failures, batch_item_success From 8ca83fcc74a1741a48ded89ffb4c6a1497ca6d64 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:34:46 +0900 Subject: [PATCH 904/962] =?UTF-8?q?style:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index ca77d714..4e782b03 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -81,11 +81,6 @@ def is_duplicate_message(message_id: str) -> bool: )["Count"] != 0 -# Put the message to the DynamoDB Table. -# @input string batch_item_success -# -# @param batch_item_success of the message to put. -# @return Boolean def push_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: """処理済みのSQSメッセージIdをDynamoDBにPushする @@ -104,7 +99,7 @@ def push_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: def substitute_mail_template(mail_template: str, receive_timing: str, mail_msg: str) -> str: - """メールテンプレートのプレースホルダーを置き換えます + """メールテンプレートのプレースホルダーを置き換える Args: mail_template (str): 置き換え前のメールテンプレート From 41542bbd9d535e1936aac13e2ae9223f27aca66f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:38:43 +0900 Subject: [PATCH 905/962] =?UTF-8?q?feat:=20lambda=5Fhandler=E3=81=AB?= =?UTF-8?q?=E4=BE=8B=E5=A4=96=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0=E3=80=81?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E8=BF=BD=E5=8A=A0=E3=80=81?= =?UTF-8?q?=E6=9C=AA=E5=8F=97=E9=A0=98=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E5=90=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 4e782b03..dc6085cf 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -129,8 +129,16 @@ def make_failure_item_on_error(message_id: str) -> dict[str, str]: return {"itemIdentifier": message_id} -def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, str]], list[str]]: +def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, str]], list[str]]: + """Enciseデータ未受領チェック + Args: + records (list): SQS Eventのレコードリスト + execute_month (str): 処理起動年月 + + Returns: + tuple[list[dict[str, str]], list[str]]: 失敗メッセージIdのリスト, 成功メッセージIdのリスト + """ batch_item_failures = [] batch_item_success = [] @@ -146,7 +154,7 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') continue except Exception as e: - logger.error(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") + logger.exception(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") batch_item_failures.append(make_failure_item_on_error(message_id)) continue @@ -166,7 +174,7 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s ) logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') except Exception as e: - logger.error(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") + logger.exception(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") batch_item_failures.append(make_failure_item_on_error(message_id)) continue @@ -241,7 +249,7 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s mail_title_without_line_break = mail_title.splitlines()[0] logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + logger.exception(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') batch_item_failures.append(make_failure_item_on_error(message_id)) continue @@ -259,7 +267,7 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s mail_body = substitute_mail_template(mail_body_template, receive_timing, mail_message) logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + logger.exception(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') batch_item_failures.append(make_failure_item_on_error(message_id)) continue @@ -274,7 +282,7 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s batch_item_success.append(message_id) except Exception as e: - logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') batch_item_failures.append(make_failure_item_on_error(message_id)) continue @@ -282,24 +290,29 @@ def unreceive_check(records: list, execute_month: str) -> tuple[list[dict[str, s def lambda_handler(event, context): - # ① 処理開始ログを出力する - logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') - # 処理稼働年月を取得しメモリに保持する - execute_date_today = datetime.date.today() - execute_month = execute_date_today.strftime('%Y/%m') - logger.info(f'I-01-02 処理稼働月:{execute_month}') - # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) - batch_item_failures = [] - # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) - batch_item_success = [] - # ② SQSメッセージ重複排除処理を行う - logger.info('I-02-01 メッセージ処理開始') - batch_item_failures, batch_item_success = unreceive_check(event["Records"], execute_month) - logger.info('I-06-01 すべてのメッセージの処理完了') + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 Enciseデータ受領チェック処理') + # 処理稼働年月を取得しメモリに保持する + execute_date_today = datetime.date.today() + execute_month = execute_date_today.strftime('%Y/%m') + logger.info(f'I-01-02 処理稼働月:{execute_month}') + # 処理失敗メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_failures = [] + # 処理成功メッセージIDリストをメモリに保持する(初期値=空のリスト) + batch_item_success = [] + # ② SQSメッセージ重複排除処理を行う + logger.info('I-02-01 メッセージ処理開始') + batch_item_failures, batch_item_success = encise_data_unreceive_check(event["Records"], execute_month) + logger.info('I-06-01 すべてのメッセージの処理完了') - # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する - push_success_messages_to_dynamo_db(batch_item_success) - logger.info('I-07-01 処理済みメッセージIDの記録完了') - logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') + # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する + push_success_messages_to_dynamo_db(batch_item_success) + logger.info('I-07-01 処理済みメッセージIDの記録完了') + logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') + + except Exception as e: + logger.exception(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + raise e return batch_item_failures From d3615e38c4e8daf62b792421901db30a0cdfff47 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 13:46:50 +0900 Subject: [PATCH 906/962] =?UTF-8?q?feat:=20NDS=E9=80=9A=E7=9F=A5SNS?= =?UTF-8?q?=E3=81=AF=E4=B8=8D=E8=A6=81=E3=81=AA=E3=81=AE=E3=81=A7=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check/encise-data-unreceive-check.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index dc6085cf..130e0a9a 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -16,8 +16,6 @@ CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] LOG_LEVEL = os.environ["LOG_LEVEL"] MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] -NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] -NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] PROCESSED_MESSAGE_EXPIRES_PERIOD = os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"] TZ = os.environ["TZ"] From 5cadb1a466be0371aa80f71c9c09635b742e3818 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 14:02:08 +0900 Subject: [PATCH 907/962] =?UTF-8?q?feat:=20DynamoDB=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=96=E3=83=AB=E3=81=AE=E3=83=AC=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E6=9C=89=E5=8A=B9=E6=9C=9F=E9=99=90=E7=94=A8=E3=81=AE=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 130e0a9a..e4e26de8 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -17,7 +17,7 @@ LOG_LEVEL = os.environ["LOG_LEVEL"] MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] -PROCESSED_MESSAGE_EXPIRES_PERIOD = os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"] +PROCESSED_MESSAGE_EXPIRES_PERIOD = int(os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"]) TZ = os.environ["TZ"] # 定数 @@ -79,7 +79,7 @@ def is_duplicate_message(message_id: str) -> bool: )["Count"] != 0 -def push_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: +def put_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: """処理済みのSQSメッセージIdをDynamoDBにPushする Args: @@ -88,10 +88,19 @@ def push_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: Returns: bool: 登録成功の場合、True """ + + # レコードの有効期限を算出 + now = datetime.datetime.now(ZoneInfo(TZ)) + record_expiration_datetime = now + datetime.timedelta(minutes=PROCESSED_MESSAGE_EXPIRES_PERIOD) + record_expiration_time = record_expiration_datetime.timestamp() + for message_id in batch_item_success: dynamodb_client.put_item( TableName=PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME, - Item={'message_id': {'S': message_id}} + Item={ + 'message_id': {'S': message_id}, + 'record_expiration_time': {'N': f'{record_expiration_time}'} + } ) return True @@ -305,7 +314,7 @@ def lambda_handler(event, context): logger.info('I-06-01 すべてのメッセージの処理完了') # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する - push_success_messages_to_dynamo_db(batch_item_success) + put_success_messages_to_dynamo_db(batch_item_success) logger.info('I-07-01 処理済みメッセージIDの記録完了') logger.info('I-07-02 処理終了 Enciseデータ受領チェック処理') From d2485a4afec4cd42fbe78c8ac793b6491a319ecf Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 14:45:58 +0900 Subject: [PATCH 908/962] =?UTF-8?q?feat:=20=E6=9C=AA=E5=8F=97=E9=A0=98?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E5=AF=BE=E8=B1=A1=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=83=AA=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../en_cluster_direct_file_list.config | 3 +++ .../en_cluster_file_list.config | 6 ++++++ .../unreceive_check_target/en_fixed_file_list.config | 11 +++++++++++ .../en_nation_direct_fixed_file_list.config | 1 + .../unreceive_check_target/en_quick_file_list.config | 10 ++++++++++ 5 files changed, 31 insertions(+) create mode 100644 s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config create mode 100644 s3/config/encise/unreceive_check_target/en_cluster_file_list.config create mode 100644 s3/config/encise/unreceive_check_target/en_fixed_file_list.config create mode 100644 s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config create mode 100644 s3/config/encise/unreceive_check_target/en_quick_file_list.config diff --git a/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config b/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config new file mode 100644 index 00000000..44631a3a --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_cluster_direct_file_list.config @@ -0,0 +1,3 @@ +CLUFD_Merck02_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck02 +CLUFD_Merck03_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck03 +CLUFD_Merck04_496_([0-9]{6})D\.(CSV|csv) 直販分 En-Clusterデータ Merck04 diff --git a/s3/config/encise/unreceive_check_target/en_cluster_file_list.config b/s3/config/encise/unreceive_check_target/en_cluster_file_list.config new file mode 100644 index 00000000..33c31f6f --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_cluster_file_list.config @@ -0,0 +1,6 @@ +CLUFD_Merck02_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck02 +CLUFD_Merck03_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck03 +CLUFD_Merck04_496_([0-9]{6})\.(CSV|csv) En-Cluster データ Merck04 +CLUFM_CLUMST_496_01_([0-9]{6})\.(CSV|csv) En-Cluster クラスタマスタ +CLUFM_PROADD_496_([0-9]{6})\.(CSV|csv) En-Cluster 製品定義ファイル +CLUFM_PROLST_496_([0-9]{6})\.(CSV|csv) En-Cluster 製品マスタ diff --git a/s3/config/encise/unreceive_check_target/en_fixed_file_list.config b/s3/config/encise/unreceive_check_target/en_fixed_file_list.config new file mode 100644 index 00000000..edd0126b --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_fixed_file_list.config @@ -0,0 +1,11 @@ +NATFD_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation データ +NATFM_PROADD_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation 製品定義ファイル +NATFM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 確定版 En-Nation セグメントマスタ +MST_BRAND([0-9]{6})\.(CSV|csv) 確定版 En-Nation ブランドマスタ +CITFD_Merck01_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck01 +CITFD_Merck06_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck06 +CITFD_Merck07_496_([0-9]{6})\.(CSV|csv) 確定版 En-City データ Merck07 +CITFM_PROADD_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 製品定義ファイル +CITFM_PROLST_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 製品マスタ +CITFM_REGION_496_([0-9]{6})\.(CSV|csv) 確定版 En-City 地域マスタ +CITFM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 確定版 En-City セグメントマスタ diff --git a/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config b/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config new file mode 100644 index 00000000..dfb557e8 --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_nation_direct_fixed_file_list.config @@ -0,0 +1 @@ +NATFD_496_([0-9]{6})D\.(CSV|csv) 確定版 En-Nation データ 直販分 \ No newline at end of file diff --git a/s3/config/encise/unreceive_check_target/en_quick_file_list.config b/s3/config/encise/unreceive_check_target/en_quick_file_list.config new file mode 100644 index 00000000..ae8a4761 --- /dev/null +++ b/s3/config/encise/unreceive_check_target/en_quick_file_list.config @@ -0,0 +1,10 @@ +NATQD_496_([0-9]{6}\).(CSV|csv) 速報版 En-Nation データ +NATQM_PROADD_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation 製品定義ファイル +NATQM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation セグメントマスタ +CITQD_Merck01_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck01 +CITQD_Merck06_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck06 +CITQD_Merck07_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck07 +CITQM_PROADD_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 製品定義ファイル +CITQM_PROLST_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 製品マスタ +CITQM_REGION_496_([0-9]{6})\.(CSV|csv) 速報版 En-City 地域マスタ +CITQM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 速報版 En-City セグメントマスタ From 2b7031f685ef1f768f52a4ca7433fa4c9e1344c4 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 14:48:44 +0900 Subject: [PATCH 909/962] =?UTF-8?q?feat:=20=E3=80=81=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E3=83=A1=E3=83=BC=E3=83=AB=E3=83=86=E3=83=B3=E3=83=97=E3=83=AC?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92?= =?UTF-8?q?=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../en_direct_unreceive_notice_mail_body.config | 9 +++++++++ .../en_direct_unreceive_notice_mail_title.config | 1 + .../en_unreceive_notice_mail_body.config | 9 +++++++++ .../en_unreceive_notice_mail_title.config | 1 + 4 files changed, 20 insertions(+) create mode 100644 s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config create mode 100644 s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config create mode 100644 s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config create mode 100644 s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config diff --git a/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config new file mode 100644 index 00000000..9cf79023 --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_body.config @@ -0,0 +1,9 @@ +宛先各位 + Encise {receive_timing}である以下のファイルを受領できておりません。 +{notice_file_names} + + + QlikSenseサーバー側の送信状況のご確認をお願いいたします。 + + 尚、本メールはシステム自動送信のため、返信は出来ません。 + 本件に関する問い合わせは、MeDaCA Enciseデータ担当者にお願いいたします。 diff --git a/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config new file mode 100644 index 00000000..d40c304d --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_direct_unreceive_notice_mail_title.config @@ -0,0 +1 @@ +【MeDaCa連携エラー通知】Encise {receive_timing}ファイル未受領 \ No newline at end of file diff --git a/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config new file mode 100644 index 00000000..591d85cb --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_body.config @@ -0,0 +1,9 @@ +宛先各位 + Encise {receive_timing}である以下のファイルを受領できておりません。 +{notice_file_names} + + + Encise社へ送信状況のご確認をお願いいたします。 + + 尚、本メールはシステム自動送信のため、返信は出来ません。 + 本件に関する問い合わせは、MeDaCA Enciseデータ担当者にお願いいたします。 diff --git a/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config new file mode 100644 index 00000000..d40c304d --- /dev/null +++ b/s3/config/encise/notice_mail_template/en_unreceive_notice_mail_title.config @@ -0,0 +1 @@ +【MeDaCa連携エラー通知】Encise {receive_timing}ファイル未受領 \ No newline at end of file From 1153cfa8b52263ef55c7e3f011b2b8a0ca813909 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 16:21:44 +0900 Subject: [PATCH 910/962] =?UTF-8?q?fix:=20=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E6=AD=A3=E8=A6=8F=E8=A1=A8=E7=8F=BE=E3=81=AE?= =?UTF-8?q?=E3=83=9F=E3=82=B9=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise/unreceive_check_target/en_quick_file_list.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/config/encise/unreceive_check_target/en_quick_file_list.config b/s3/config/encise/unreceive_check_target/en_quick_file_list.config index ae8a4761..e3f3ebcd 100644 --- a/s3/config/encise/unreceive_check_target/en_quick_file_list.config +++ b/s3/config/encise/unreceive_check_target/en_quick_file_list.config @@ -1,4 +1,4 @@ -NATQD_496_([0-9]{6}\).(CSV|csv) 速報版 En-Nation データ +NATQD_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation データ NATQM_PROADD_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation 製品定義ファイル NATQM_SEGMNT_496_([0-9]{6})\.(CSV|csv) 速報版 En-Nation セグメントマスタ CITQD_Merck01_496_([0-9]{6})\.(CSV|csv) 速報版 En-City データ Merck01 From f1ce484d1dda6e911fb9080997312e8e67221699 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 16:24:16 +0900 Subject: [PATCH 911/962] =?UTF-8?q?feat:=20=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E5=AF=BE=E8=B1=A1=E5=B9=B4=E6=9C=88=E3=81=AE=E3=83=AD?= =?UTF-8?q?=E3=82=B8=E3=83=83=E3=82=AF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 91 ++++++++++++------- 1 file changed, 59 insertions(+), 32 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index e4e26de8..1667f9e2 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -8,6 +8,7 @@ import re from zoneinfo import ZoneInfo import boto3 +from dateutil.relativedelta import relativedelta # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -17,7 +18,8 @@ LOG_LEVEL = os.environ["LOG_LEVEL"] MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] -PROCESSED_MESSAGE_EXPIRES_PERIOD = int(os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"]) +PROCESSED_MESSAGE_EXPIRES_PERIOD = int( + os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"]) TZ = os.environ["TZ"] # 定数 @@ -91,7 +93,8 @@ def put_success_messages_to_dynamo_db(batch_item_success: list[str]) -> bool: # レコードの有効期限を算出 now = datetime.datetime.now(ZoneInfo(TZ)) - record_expiration_datetime = now + datetime.timedelta(minutes=PROCESSED_MESSAGE_EXPIRES_PERIOD) + record_expiration_datetime = now + \ + datetime.timedelta(minutes=PROCESSED_MESSAGE_EXPIRES_PERIOD) record_expiration_time = record_expiration_datetime.timestamp() for message_id in batch_item_success: @@ -158,11 +161,13 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list message_id = record["messageId"] # 2.DynamoDBテーブルからレコードを取得し、処理済みメッセージかどうかを判別する if is_duplicate_message(message_id): - logger.info(f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') + logger.info( + f'受信したメッセージは既に処理済みのため、処理をスキップします。メッセージID: {message_id}') continue except Exception as e: logger.exception(f"E-02-01 メッセージ重複チェック処理に失敗しました エラー内容:{e}") - batch_item_failures.append(make_failure_item_on_error(message_id)) + batch_item_failures.append( + make_failure_item_on_error(message_id)) continue # SQSパラメータをJSONシリアライズし、Pythonの辞書オブジェクト(イベントパラメータ)を取得する。 @@ -181,49 +186,60 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list ) logger.info('I-03-02 受領チェック対象ファイルリストを読み込みました') except Exception as e: - logger.exception(f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") - batch_item_failures.append(make_failure_item_on_error(message_id)) + logger.exception( + f"E-03-01 受領チェック対象ファイルリストの読み込みに失敗しました エラー内容:{e}") + batch_item_failures.append( + make_failure_item_on_error(message_id)) continue # ④ 受領チェック処理を行う receive_timing = event_parameter['receive_timing'] logger.info(f'I-04-01 Enciseデータ受領チェック ({receive_timing}) 処理開始') - object_prefix = f'{event_parameter["check_folder_prefix"]}{execute_month}/' + object_prefix = f'{event_parameter["check_folder_prefix"]}/{execute_month}/' # 1.Enciseデータバックアップ保管バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する logger.info( f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{object_prefix}' ) - check_target_file_list_response = s3_client.list_objects_v2(CHECK_BUCKET_NAME, Prefix=object_prefix) - check_target_file_list = [] - for content in check_target_file_list_response[['Contents']]: + receive_file_list_response = s3_client.list_objects_v2( + Bucket=CHECK_BUCKET_NAME, Prefix=object_prefix) + receive_file_list = [] + for content in receive_file_list_response.get('Contents', []): # オブジェクトのキーからファイル名を切り出してリストに追加 obj_key = content['Key'].rsplit('/', INDEX_SPLIT_NUM) - check_target_file_list.append(obj_key[INDEX_LAST]) + receive_file_list.append(obj_key[INDEX_LAST]) # 2.I/Fファイルチェック処理 logger.info(f'I-04-03 Enciseデータ({receive_timing}) ファイルチェック処理開始') - receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(check_target_file_list_response["Body"].read()), encoding='utf-8') + check_target_file_name_body = io.TextIOWrapper(io.BytesIO( + check_target_file_list_response["Body"].read()), encoding='utf-8') match_count = 0 row_count = 0 - for tsv_row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + for tsv_row in csv.reader(check_target_file_name_body, delimiter='\t'): # 「④1.」で取得したリストが「③」で読み込んだファイル内に存在するか確認する is_file_not_exists = True - for file_name in check_target_file_list: - match_result = re.fullmatch(tsv_row[INDEX_REGEX], file_name) + for file_name in receive_file_list: + match_result = re.fullmatch( + tsv_row[INDEX_REGEX], file_name) # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 if match_result is not None: # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 - if True: # TODO - logger.info(f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') + match_group_yyyymm = match_result.group(1) + check_target_yyyymm = (datetime.datetime.now( + ZoneInfo(TZ)) - relativedelta(month=1)).strftime('%Y%m') + if match_group_yyyymm == check_target_yyyymm: + logger.info( + f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') is_file_not_exists = False match_count += 1 else: - logger.info(f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') + logger.info( + f'I-04-07 I/Fファイルの年月がチェック対象年月と一致しません ファイル名:{file_name}') mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}(受領年月が不正:{file_name})\n' break - if is_file_not_exists: - logger.info(f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') - mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' + if is_file_not_exists: + logger.info( + f'E-04-06 月次I/Fファイルに不足があります ファイル名:{tsv_row[INDEX_DATA_NAME]}') + mail_message += f'{MAIL_INDENT}{tsv_row[INDEX_DATA_NAME]}\n' row_count += 1 @@ -234,12 +250,14 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list logger.info('I-05-01 メール送信処理開始') if len(mail_message) == 0: - logger.info(f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') + logger.info( + f'I-05-09 {execute_month} {receive_timing}データI/Fファイルに不足が無いため、メール送信処理をスキップします') batch_item_success.append(message_id) continue # 1.存在した場合 - logger.info(f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') + logger.info( + f'I-05-02 {execute_month} {receive_timing}データI/Fファイルに不足があるため、メール送信処理を開始します') try: logger.info( @@ -250,14 +268,18 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list Bucket=CONFIG_BUCKET_NAME, Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_title_template"]}' ) - mail_title_template = mail_title_response['Body'].read().decode('utf-8') + mail_title_template = ( + mail_title_response['Body'].read().decode('utf-8')) # 改行を取り除く - mail_title = substitute_mail_template(mail_title_template, receive_timing, mail_message) + mail_title = substitute_mail_template( + mail_title_template, receive_timing, mail_message) mail_title_without_line_break = mail_title.splitlines()[0] logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - logger.exception(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - batch_item_failures.append(make_failure_item_on_error(message_id)) + logger.exception( + f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append( + make_failure_item_on_error(message_id)) continue try: @@ -269,13 +291,17 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list Bucket=CONFIG_BUCKET_NAME, Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' ) - mail_body_template = mail_body_template_response['Body'].read().decode('utf-8') + mail_body_template = mail_body_template_response['Body'].read().decode( + 'utf-8') # メール本文内のプレースホルダーを置き換える - mail_body = substitute_mail_template(mail_body_template, receive_timing, mail_message) + mail_body = substitute_mail_template( + mail_body_template, receive_timing, mail_message) logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - logger.exception(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - batch_item_failures.append(make_failure_item_on_error(message_id)) + logger.exception( + f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + batch_item_failures.append( + make_failure_item_on_error(message_id)) continue logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_NOTICE_TOPIC}') @@ -310,7 +336,8 @@ def lambda_handler(event, context): batch_item_success = [] # ② SQSメッセージ重複排除処理を行う logger.info('I-02-01 メッセージ処理開始') - batch_item_failures, batch_item_success = encise_data_unreceive_check(event["Records"], execute_month) + batch_item_failures, batch_item_success = encise_data_unreceive_check( + event["Records"], execute_month) logger.info('I-06-01 すべてのメッセージの処理完了') # ⑦ メッセージを処理済として、以下のDynamoDBテーブルに記録する From d5d5b719f7ad3127df5cc25280aa4a233f7f1afa Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 16:26:20 +0900 Subject: [PATCH 912/962] =?UTF-8?q?feat:=20=E3=83=AD=E3=83=BC=E3=82=AB?= =?UTF-8?q?=E3=83=AB=E5=8B=95=E4=BD=9C=E7=A2=BA=E8=AA=8D=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=A7=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 1667f9e2..9499d2b2 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -350,3 +350,27 @@ def lambda_handler(event, context): raise e return batch_item_failures + + +# 動作確認用のコード +# if __name__ == '__main__': +# lambda_handler({ +# "Records": [ +# { +# "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", +# "receiptHandle": "MessageReceiptHandle", +# "body": "{\"receive_timing\": \"速報\",\"check_folder_prefix\": \"encise\",\"check_target_file_list\": \"en_quick_file_list.config\",\"notice_mail_title_template\": \"en_unreceive_notice_mail_title.config\",\"notice_mail_body_template\": \"en_unreceive_notice_mail_body.config\"\r\n}", +# "attributes": { +# "ApproximateReceiveCount": "1", +# "SentTimestamp": "1523232000000", +# "SenderId": "123456789012", +# "ApproximateFirstReceiveTimestamp": "1523232000001" +# }, +# "messageAttributes": {}, +# "md5OfBody": "{{{md5_of_body}}}", +# "eventSource": "aws:sqs", +# "eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue", +# "awsRegion": "us-east-1" +# } +# ] +# }, {}) From b0f39ea79d8430d0bf5049f5b0df78cb8b084035 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 13 Feb 2024 17:12:31 +0900 Subject: [PATCH 913/962] =?UTF-8?q?style:=20=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=88=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index 9499d2b2..d762c275 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -14,12 +14,12 @@ from dateutil.relativedelta import relativedelta CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH = os.environ["CHECK_TARGET_FILE_NAME_LIST_FOLDER_PATH"] CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] -LOG_LEVEL = os.environ["LOG_LEVEL"] MAIL_TEMPLATE_FOLDER_PATH = os.environ["MAIL_TEMPLATE_FOLDER_PATH"] MBJ_NOTICE_TOPIC = os.environ["MBJ_NOTICE_TOPIC"] PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME = os.environ["PROCESSED_MESSAGE_DYNAMODB_TABLE_NAME"] PROCESSED_MESSAGE_EXPIRES_PERIOD = int( os.environ["PROCESSED_MESSAGE_EXPIRES_PERIOD"]) +LOG_LEVEL = os.environ["LOG_LEVEL"] TZ = os.environ["TZ"] # 定数 @@ -40,8 +40,6 @@ dynamodb_client = boto3.client('dynamodb') # logger設定 - - def log_datetime_convert_tz(*arg): """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" return datetime.datetime.now(ZoneInfo(TZ)).timetuple() @@ -222,6 +220,7 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list tsv_row[INDEX_REGEX], file_name) # 「③」で読み込んだファイルに記載されている全てが「④1.」で取得したリストに存在した場合 if match_result is not None: + is_file_not_exists = False # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 match_group_yyyymm = match_result.group(1) check_target_yyyymm = (datetime.datetime.now( @@ -229,7 +228,6 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list if match_group_yyyymm == check_target_yyyymm: logger.info( f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') - is_file_not_exists = False match_count += 1 else: logger.info( @@ -291,8 +289,8 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list Bucket=CONFIG_BUCKET_NAME, Key=f'{MAIL_TEMPLATE_FOLDER_PATH}/{event_parameter["notice_mail_body_template"]}' ) - mail_body_template = mail_body_template_response['Body'].read().decode( - 'utf-8') + mail_body_template = ( + mail_body_template_response['Body'].read().decode('utf-8')) # メール本文内のプレースホルダーを置き換える mail_body = substitute_mail_template( mail_body_template, receive_timing, mail_message) From c8ad52db1f40c1ab2680a984317377aa3ecd766f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 15 Feb 2024 13:55:20 +0900 Subject: [PATCH 914/962] =?UTF-8?q?r-export-dbdump=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 34 +++++++ .../r-export-dbdump-state.json | 95 +++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index aa62a588..c0f62a09 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -26,6 +26,8 @@ resource: - &STG_SG_JSKULT_DBDUMP "sg-0967779af13538a8e" # セキュリティグループ(ecs-jskult-batch-laundering) - &STG_SG_JSKULT_BATCH_LAUNDERING "sg-00b9ea30c5c6bb77a" + # セキュリティグループ(ecs-export-dbdump) + - &STG_SG_EXPORT_DBDUMP "sg-03962e5f52b380186" # 本番環境 product: # サブネット(PrivateSubnet1) @@ -42,6 +44,8 @@ resource: - &PRD_SG_JSKULT_DBDUMP "sg-050ab3bc0d9ed261a" # セキュリティグループ(ecs-jskult-batch-laundering) - &PRD_SG_JSKULT_BATCH_LAUNDERING "sg-0d2bc30c1a2939c32" + # セキュリティグループ(ecs-export-dbdump) + - &PRD_SG_EXPORT_DBDUMP "sg-xxxxxxxxxxxxxxxx" config: # CRMデータ取得 r-crm-datafetch-state: @@ -177,3 +181,33 @@ config: SG_ECS_ALL: *PRD_SG_ECS_ALL # セキュリティグループ(ecs-jskut-batch-laundering) SG_JSKULT_BATCH_LAUNDERING: *PRD_SG_JSKULT_BATCH_LAUNDERING + # DBダンプ取得 + r-export-dbdump-state: + # ステージング環境 + staging: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *STG_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *STG_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *STG_SG_ECS_ALL + # セキュリティグループ(ecs-export-dbdump) + SG_EXPORT_DBDUMP: *STG_SG_EXPORT_DBDUMP + # 本番環境 + product: + # AWSアカウントID + AWS_ACCOUNT_ID: *AWS_ACCOUNT_ID + # 東京リージョン + REGION_AP_NORTHEAST_1: *REGION_AP_NORTHEAST_1 + # サブネット(PrivateSubnet1) + SUBNET_PRI_1A: *PRD_SUBNET_PRI_1A + # サブネット(PrivateSubnet2) + SUBNET_PRI_1D: *PRD_SUBNET_PRI_1D + # セキュリティグループ(ecs-all) + SG_ECS_ALL: *PRD_SG_ECS_ALL + # セキュリティグループ(ecs-export-dbdump) + SG_EXPORT_DBDUMP: *PRD_SG_EXPORT_DBDUMP diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json new file mode 100644 index 00000000..3c708846 --- /dev/null +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -0,0 +1,95 @@ +{ + "Comment": "DBダンプ取得ステートマシン", + "StartAt": "params", + "States": { + "params": { + "Comment": "パラメータ設定", + "Type": "Pass", + "Parameters": { + "sns": { + "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:mbj-notice-#{ENV_NAME}" + }, + "ecs": { + "LaunchType": "FARGATE", + "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-export-dbdump-ecs", + "TaskDefinition": "ExportDatabaseDump", + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "Subnets": [ + "#{SUBNET_PRI_1A}", + "#{SUBNET_PRI_1D}" + ], + "SecurityGroups": [ + "#{SG_ECS_ALL}", + "#{SG_EXPORT_DBDUMP}" + ], + "AssignPublicIp": "DISABLED" + } + }, + "Overrides": { + "ContainerOverrides": [ + { + "Name.$": "$.InputParams.ContainerName", + "Environment": [ + { + "Name": "DB_SCHEMA", + "Value.$": "$.params.eventBridge.DB_SCHEMA" + }, + { + "Name": "DUMP_BACKUP_BUCKET", + "Value.$": "$.params.eventBridge.DUMP_BACKUP_BUCKET" + } + ] + } + ] + } + } + }, + "ResultPath": "$.params", + "Next": "data-import" + }, + "data-import": { + "Type": "Task", + "Resource": "arn:aws:states:::ecs:runTask.sync", + "Parameters": { + "LaunchType.$": "$.params.ecs.LaunchType", + "Cluster.$": "$.params.ecs.Cluster", + "TaskDefinition.$": "$.params.ecs.TaskDefinition", + "NetworkConfiguration.$": "$.params.ecs.NetworkConfiguration", + "Overrides.$": "$.params.ecs.Overrides" + }, + "ResultPath": "$.result", + "Retry": [ + { + "ErrorEquals": [ + "States.ALL" + ], + "BackoffRate": 2, + "IntervalSeconds": 3, + "MaxAttempts": 3 + } + ], + "Catch": [ + { + "ErrorEquals": [ + "States.ALL" + ], + "Next": "CreateImportPendingFile", + "ResultPath": "$.result" + } + ], + "Next": "NormalEnd", + "Comment": "データ登録処理" + }, + "NormalEnd": { + "Comment": "正常終了", + "Type": "Succeed" + }, + "ErrorEnd": { + "Comment": "異常終了", + "Type": "Fail", + "Error": "StatesError", + "Cause": "StepFunctions ErrorEnd" + } + } +} \ No newline at end of file From 08df459ed8f258e75fbc332746d5fb5d931e22cc Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 15 Feb 2024 16:20:36 +0900 Subject: [PATCH 915/962] =?UTF-8?q?=E3=82=BF=E3=82=B9=E3=82=AF=E5=90=8D?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../r-export-dbdump-state/r-export-dbdump-state.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json index 3c708846..00bf15e0 100644 --- a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -46,9 +46,9 @@ } }, "ResultPath": "$.params", - "Next": "data-import" + "Next": "export-dbdump" }, - "data-import": { + "export-dbdump": { "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Parameters": { @@ -74,7 +74,7 @@ "ErrorEquals": [ "States.ALL" ], - "Next": "CreateImportPendingFile", + "Next": "ErrorEnd", "ResultPath": "$.result" } ], From 4900e1115d24be4f6aafb1cdf9a3230f44164697 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 15 Feb 2024 16:45:46 +0900 Subject: [PATCH 916/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../r-export-dbdump-state.json | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json index 00bf15e0..d3cfb4a1 100644 --- a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -6,13 +6,10 @@ "Comment": "パラメータ設定", "Type": "Pass", "Parameters": { - "sns": { - "TopicArn": "arn:aws:sns:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:mbj-notice-#{ENV_NAME}" - }, "ecs": { "LaunchType": "FARGATE", "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-export-dbdump-ecs", - "TaskDefinition": "ExportDatabaseDump", + "TaskDefinition": "mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": [ @@ -29,15 +26,15 @@ "Overrides": { "ContainerOverrides": [ { - "Name.$": "$.InputParams.ContainerName", + "Name": "mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", "Environment": [ { "Name": "DB_SCHEMA", - "Value.$": "$.params.eventBridge.DB_SCHEMA" + "Value.$": "$.db_schema" }, { "Name": "DUMP_BACKUP_BUCKET", - "Value.$": "$.params.eventBridge.DUMP_BACKUP_BUCKET" + "Value.$": "$.dump_backup_bucket" } ] } @@ -46,9 +43,9 @@ } }, "ResultPath": "$.params", - "Next": "export-dbdump" + "Next": "exec-export-dbdump" }, - "export-dbdump": { + "exec-export-dbdump": { "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Parameters": { From 511feeb15f1637ea215258fcb60dcb1915033425 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Fri, 16 Feb 2024 10:17:59 +0900 Subject: [PATCH 917/962] =?UTF-8?q?TaskDefinition=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json index d3cfb4a1..248036ea 100644 --- a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -9,7 +9,7 @@ "ecs": { "LaunchType": "FARGATE", "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-export-dbdump-ecs", - "TaskDefinition": "mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": [ From 4b5197bebe4db5886ea33bcda515ec76723d1d10 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 20 Feb 2024 18:00:49 +0900 Subject: [PATCH 918/962] dbdump-first-commit --- ecs/export-dbdump/.dockerignore | 12 + ecs/export-dbdump/.env.example | 14 ++ ecs/export-dbdump/.gitignore | 11 + ecs/export-dbdump/.vscode/launch.json | 16 ++ .../.vscode/recommended_settings.json | 31 +++ ecs/export-dbdump/Dockerfile | 40 ++++ ecs/export-dbdump/Pipfile | 19 ++ ecs/export-dbdump/Pipfile.lock | 213 ++++++++++++++++++ ecs/export-dbdump/README.md | 48 ++++ ecs/export-dbdump/entrypoint.py | 10 + ecs/export-dbdump/mysql_dpkg_selection.txt | 3 + ecs/export-dbdump/src/__init__.py | 0 .../src/batch/batch_functions.py | 131 +++++++++++ .../src/batch/common/__init__.py | 0 ecs/export-dbdump/src/db/__init__.py | 0 ecs/export-dbdump/src/db/database.py | 180 +++++++++++++++ ecs/export-dbdump/src/error/__init__.py | 0 ecs/export-dbdump/src/error/exceptions.py | 10 + ecs/export-dbdump/src/jobctrl_dbdump.py | 126 +++++++++++ ecs/export-dbdump/src/logging/get_logger.py | 37 +++ ecs/export-dbdump/src/system_var/__init__.py | 0 ecs/export-dbdump/src/system_var/constants.py | 15 ++ .../src/system_var/environment.py | 19 ++ 23 files changed, 935 insertions(+) create mode 100644 ecs/export-dbdump/.dockerignore create mode 100644 ecs/export-dbdump/.env.example create mode 100644 ecs/export-dbdump/.gitignore create mode 100644 ecs/export-dbdump/.vscode/launch.json create mode 100644 ecs/export-dbdump/.vscode/recommended_settings.json create mode 100644 ecs/export-dbdump/Dockerfile create mode 100644 ecs/export-dbdump/Pipfile create mode 100644 ecs/export-dbdump/Pipfile.lock create mode 100644 ecs/export-dbdump/README.md create mode 100644 ecs/export-dbdump/entrypoint.py create mode 100644 ecs/export-dbdump/mysql_dpkg_selection.txt create mode 100644 ecs/export-dbdump/src/__init__.py create mode 100644 ecs/export-dbdump/src/batch/batch_functions.py create mode 100644 ecs/export-dbdump/src/batch/common/__init__.py create mode 100644 ecs/export-dbdump/src/db/__init__.py create mode 100644 ecs/export-dbdump/src/db/database.py create mode 100644 ecs/export-dbdump/src/error/__init__.py create mode 100644 ecs/export-dbdump/src/error/exceptions.py create mode 100644 ecs/export-dbdump/src/jobctrl_dbdump.py create mode 100644 ecs/export-dbdump/src/logging/get_logger.py create mode 100644 ecs/export-dbdump/src/system_var/__init__.py create mode 100644 ecs/export-dbdump/src/system_var/constants.py create mode 100644 ecs/export-dbdump/src/system_var/environment.py diff --git a/ecs/export-dbdump/.dockerignore b/ecs/export-dbdump/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/export-dbdump/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/export-dbdump/.env.example b/ecs/export-dbdump/.env.example new file mode 100644 index 00000000..c4e1f427 --- /dev/null +++ b/ecs/export-dbdump/.env.example @@ -0,0 +1,14 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=***** + +DUMP_BACKUP_BUCKET=************ +DUMP_BACKUP_FOLDER=dump + +LOG_LEVEL=INFO +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ diff --git a/ecs/export-dbdump/.gitignore b/ecs/export-dbdump/.gitignore new file mode 100644 index 00000000..cf44449e --- /dev/null +++ b/ecs/export-dbdump/.gitignore @@ -0,0 +1,11 @@ +.vscode/settings.json +.env +my.cnf + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/export-dbdump/.vscode/launch.json b/ecs/export-dbdump/.vscode/launch.json new file mode 100644 index 00000000..ac80ce4f --- /dev/null +++ b/ecs/export-dbdump/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG)jskult batch laundering", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/export-dbdump/.vscode/recommended_settings.json b/ecs/export-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/export-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/export-dbdump/Dockerfile b/ecs/export-dbdump/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/export-dbdump/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/export-dbdump/Pipfile b/ecs/export-dbdump/Pipfile new file mode 100644 index 00000000..65b30a51 --- /dev/null +++ b/ecs/export-dbdump/Pipfile @@ -0,0 +1,19 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/export-dbdump/Pipfile.lock b/ecs/export-dbdump/Pipfile.lock new file mode 100644 index 00000000..fb6db2d1 --- /dev/null +++ b/ecs/export-dbdump/Pipfile.lock @@ -0,0 +1,213 @@ +{ + "_meta": { + "hash": { + "sha256": "e2e2efd7ebd6ad719931983f277105dd94c4ebb6363f7c00e75dd8ca05523713" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "greenlet": { + "hashes": [ + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.3" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", + "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", + "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", + "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", + "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", + "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", + "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", + "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", + "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", + "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", + "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", + "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", + "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", + "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", + "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", + "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", + "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", + "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", + "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", + "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", + "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", + "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", + "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", + "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", + "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", + "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", + "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", + "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", + "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", + "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", + "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", + "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", + "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", + "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", + "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", + "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", + "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", + "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", + "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", + "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", + "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", + "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", + "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", + "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", + "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", + "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", + "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", + "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", + "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + ], + "index": "pypi", + "version": "==2.0.25" + }, + "tenacity": { + "hashes": [ + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" + ], + "index": "pypi", + "version": "==8.2.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + ], + "markers": "python_version >= '3.8'", + "version": "==4.9.0" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/export-dbdump/README.md b/ecs/export-dbdump/README.md new file mode 100644 index 00000000..7d8f0ccd --- /dev/null +++ b/ecs/export-dbdump/README.md @@ -0,0 +1,48 @@ +# 日次バッチ処理前DBダンプ取得  + +## 概要 + +日次バッチ処理前DBダンプ取得処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_dbdump.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/export-dbdump/entrypoint.py b/ecs/export-dbdump/entrypoint.py new file mode 100644 index 00000000..543cb134 --- /dev/null +++ b/ecs/export-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" +from src import jobctrl_dbdump + +if __name__ == '__main__': + try: + exit(jobctrl_dbdump.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/export-dbdump/mysql_dpkg_selection.txt b/ecs/export-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/export-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/export-dbdump/src/__init__.py b/ecs/export-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/batch/batch_functions.py b/ecs/export-dbdump/src/batch/batch_functions.py new file mode 100644 index 00000000..eece0536 --- /dev/null +++ b/ecs/export-dbdump/src/batch/batch_functions.py @@ -0,0 +1,131 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants + + +def get_batch_statuses() -> tuple[str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - dump取得状況区分 + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] + + return batch_processing_flag, dump_status_kbn + + +def update_dump_status_kbn_in_processing() -> None: + """dump取得状況区分を処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :in_processing, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_error() -> None: + """dump取得状況区分をエラーに更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_ERROR + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_complete() -> None: + """dump取得状況区分を正常終了に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed, + updater = CURRENT_USER(), + update_date = NOW() + """ + try: + db.connect() + db.to_jst() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_COMPLETE + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/export-dbdump/src/batch/common/__init__.py b/ecs/export-dbdump/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/db/__init__.py b/ecs/export-dbdump/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/db/database.py b/ecs/export-dbdump/src/db/database.py new file mode 100644 index 00000000..24bb6061 --- /dev/null +++ b/ecs/export-dbdump/src/db/database.py @@ -0,0 +1,180 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.error.exceptions import DBException +from src.system_var import environment + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def to_jst(self): + self.execute('SET time_zone = "+9:00"') + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/export-dbdump/src/error/__init__.py b/ecs/export-dbdump/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/error/exceptions.py b/ecs/export-dbdump/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/export-dbdump/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/export-dbdump/src/jobctrl_dbdump.py b/ecs/export-dbdump/src/jobctrl_dbdump.py new file mode 100644 index 00000000..b6e27728 --- /dev/null +++ b/ecs/export-dbdump/src/jobctrl_dbdump.py @@ -0,0 +1,126 @@ +"""DBダンプ取得""" + +import datetime +import os +import subprocess +import textwrap + +from src.batch.batch_functions import (get_batch_statuses, + update_dump_status_kbn_complete, + update_dump_status_kbn_error, + update_dump_status_kbn_in_processing) +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +logger = get_logger('DBダンプ取得') + + +def exec(): + try: + logger.info('DBダンプ取得:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分を取得 + batch_processing_flag, dump_status_kbn = get_batch_statuses() + except BatchOperationException as e: + raise BatchOperationException(f'日付テーブル取得エラー(異常終了):{e}') + + # 日次バッチ処理中の場合、処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.error('日次バッチ処理中の為、DBダンプ取得を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分が処理中の場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED: + logger.error(f'ダンプ取得中の為、DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分がエラーの場合、処理は行わない + if dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: + logger.error(f'ダンプ取得が実行不可能な状態の為、DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump処理状態区分を処理中に更新 + try: + update_dump_status_kbn_in_processing() + except BatchOperationException as e: + raise BatchOperationException(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了):{e}') + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + # ファイルのパーミッションが強いとmysqldumpコマンドが実行できないため + # my.cnfファイルのパーミッションをread-onlyに設定 + os.chmod(my_cnf_path, 0o444) + + dt_now = datetime.datetime.now() + converted_value = dt_now.strftime('%Y%m%d%H%M%S') + dump_file_name = f'backup_rds_{environment.DB_SCHEMA}_{converted_value}.gz' + s3_file_path = f's3://{environment.DUMP_BACKUP_BUCKET}/dump/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' + + # mysqldumpコマンドを実行し、dumpを取得する + command = [ + 'mysqldump', + f'--defaults-file={my_cnf_path}', + '-P', + f"{environment.DB_PORT}", + '--no-tablespaces', + '--skip-column-statistics', + '--single-transaction', + '--set-gtid-purged=OFF', + environment.DB_SCHEMA + ] + + mysqldump_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # gzipコマンドを実行してdump結果を圧縮する + gzip_process = subprocess.Popen(['gzip', '-c'], stdin=mysqldump_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # aws s3 cpコマンドを実行してアップロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', '-', s3_file_path], stdin=gzip_process.stdout, stderr=subprocess.PIPE) + # mysqldumpの標準出力をgzipに接続したため、標準出力をクローズする + mysqldump_process.stdout.close() + # gzipの標準出力をaws s3 cpに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + # パイプラインを実行し、エラーハンドリング + _, error = mysqldump_process.communicate() + if mysqldump_process.returncode != 0: + raise BatchOperationException(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = gzip_process.communicate() + if gzip_process.returncode != 0: + raise BatchOperationException(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + raise BatchOperationException(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + + # dump処理状態区分を正常終了に更新 + try: + update_dump_status_kbn_complete() + except BatchOperationException as e: + raise BatchOperationException(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') + + logger.info('DBダンプ取得:終了(正常終了)') + logger.info(f'出力ファイルパス: {s3_file_path}') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + # dump処理状態区分をエラーに更新 + try: + update_dump_status_kbn_error() + except BatchOperationException as e: + logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') + return constants.BATCH_EXIT_CODE_SUCCESS + logger.exception(f'DBダンプ取得中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/export-dbdump/src/logging/get_logger.py b/ecs/export-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/export-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/export-dbdump/src/system_var/__init__.py b/ecs/export-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/export-dbdump/src/system_var/constants.py b/ecs/export-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..993e5a7d --- /dev/null +++ b/ecs/export-dbdump/src/system_var/constants.py @@ -0,0 +1,15 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:未処理 +BATCH_ACTF_BATCH_UNPROCESSED = '0' +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' +# dump取得状態区分:処理中 +DUMP_STATUS_KBN_PROCESSED = '1' +# dump取得状態区分:正常終了 +DUMP_STATUS_KBN_COMPLETE = '2' +# dump取得状態区分:エラー +DUMP_STATUS_KBN_ERROR = '9' diff --git a/ecs/export-dbdump/src/system_var/environment.py b/ecs/export-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..61fdd693 --- /dev/null +++ b/ecs/export-dbdump/src/system_var/environment.py @@ -0,0 +1,19 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +DUMP_BACKUP_BUCKET = os.environ['DUMP_BACKUP_BUCKET'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') +DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) +DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + From 22d8ee44655efa4814cd5555af4364445528ef9f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 21 Feb 2024 14:26:04 +0900 Subject: [PATCH 919/962] dbrestore-first-commit --- ecs/restore-dbdump/.dockerignore | 13 ++++ ecs/restore-dbdump/.env.example | 6 ++ ecs/restore-dbdump/.gitignore | 16 +++++ ecs/restore-dbdump/.vscode/launch.json | 17 +++++ .../.vscode/recommended_settings.json | 31 ++++++++ ecs/restore-dbdump/Dockerfile | 40 +++++++++++ ecs/restore-dbdump/Pipfile | 16 +++++ ecs/restore-dbdump/Pipfile.lock | 71 +++++++++++++++++++ ecs/restore-dbdump/README.md | 67 +++++++++++++++++ ecs/restore-dbdump/entrypoint.py | 10 +++ ecs/restore-dbdump/mysql_dpkg_selection.txt | 3 + ecs/restore-dbdump/src/__init__.py | 0 ecs/restore-dbdump/src/logging/get_logger.py | 37 ++++++++++ ecs/restore-dbdump/src/restore_backup.py | 64 +++++++++++++++++ ecs/restore-dbdump/src/system_var/__init__.py | 0 .../src/system_var/constants.py | 2 + .../src/system_var/environment.py | 12 ++++ 17 files changed, 405 insertions(+) create mode 100644 ecs/restore-dbdump/.dockerignore create mode 100644 ecs/restore-dbdump/.env.example create mode 100644 ecs/restore-dbdump/.gitignore create mode 100644 ecs/restore-dbdump/.vscode/launch.json create mode 100644 ecs/restore-dbdump/.vscode/recommended_settings.json create mode 100644 ecs/restore-dbdump/Dockerfile create mode 100644 ecs/restore-dbdump/Pipfile create mode 100644 ecs/restore-dbdump/Pipfile.lock create mode 100644 ecs/restore-dbdump/README.md create mode 100644 ecs/restore-dbdump/entrypoint.py create mode 100644 ecs/restore-dbdump/mysql_dpkg_selection.txt create mode 100644 ecs/restore-dbdump/src/__init__.py create mode 100644 ecs/restore-dbdump/src/logging/get_logger.py create mode 100644 ecs/restore-dbdump/src/restore_backup.py create mode 100644 ecs/restore-dbdump/src/system_var/__init__.py create mode 100644 ecs/restore-dbdump/src/system_var/constants.py create mode 100644 ecs/restore-dbdump/src/system_var/environment.py diff --git a/ecs/restore-dbdump/.dockerignore b/ecs/restore-dbdump/.dockerignore new file mode 100644 index 00000000..d826198a --- /dev/null +++ b/ecs/restore-dbdump/.dockerignore @@ -0,0 +1,13 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql +*.gz diff --git a/ecs/restore-dbdump/.env.example b/ecs/restore-dbdump/.env.example new file mode 100644 index 00000000..7272a711 --- /dev/null +++ b/ecs/restore-dbdump/.env.example @@ -0,0 +1,6 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 +DUMP_FILE_S3_PATH=******************* \ No newline at end of file diff --git a/ecs/restore-dbdump/.gitignore b/ecs/restore-dbdump/.gitignore new file mode 100644 index 00000000..339d80cc --- /dev/null +++ b/ecs/restore-dbdump/.gitignore @@ -0,0 +1,16 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ + +# mysql config file +my.cnf + +# compress file +*.gz \ No newline at end of file diff --git a/ecs/restore-dbdump/.vscode/launch.json b/ecs/restore-dbdump/.vscode/launch.json new file mode 100644 index 00000000..23c4b05f --- /dev/null +++ b/ecs/restore-dbdump/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "(DEBUG)restore dbdump", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/restore-dbdump/.vscode/recommended_settings.json b/ecs/restore-dbdump/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/restore-dbdump/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/restore-dbdump/Dockerfile b/ecs/restore-dbdump/Dockerfile new file mode 100644 index 00000000..140de9c6 --- /dev/null +++ b/ecs/restore-dbdump/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.9-bullseye + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +# mysql-apt-config をdpkgでインストールする際に標準出力に渡す文字列ファイルをコピー +COPY mysql_dpkg_selection.txt ./ +# 必要なパッケージインストール +RUN apt update && apt install -y less vim curl wget gzip unzip sudo lsb-release + +# mysqlをインストール +RUN \ + wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb && \ + dpkg -i mysql-apt-config_0.8.29-1_all.deb < mysql_dpkg_selection.txt && \ + apt update && \ + apt install -y mysql-client + +# aws cli v2 のインストール +RUN \ + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + sudo ./aws/install + +# python関連のライブラリインストール +RUN \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +# パッケージのセキュリティアップデートのみを適用するコマンドを実行 +RUN \ + apt install -y unattended-upgrades && \ + unattended-upgrades + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/restore-dbdump/Pipfile b/ecs/restore-dbdump/Pipfile new file mode 100644 index 00000000..f032c7ea --- /dev/null +++ b/ecs/restore-dbdump/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/restore-dbdump/Pipfile.lock b/ecs/restore-dbdump/Pipfile.lock new file mode 100644 index 00000000..58c4d231 --- /dev/null +++ b/ecs/restore-dbdump/Pipfile.lock @@ -0,0 +1,71 @@ +{ + "_meta": { + "hash": { + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "autopep8": { + "hashes": [ + "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb", + "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2.0.4" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/restore-dbdump/README.md b/ecs/restore-dbdump/README.md new file mode 100644 index 00000000..dee336e4 --- /dev/null +++ b/ecs/restore-dbdump/README.md @@ -0,0 +1,67 @@ +# ダンプ復元スクリプト + +## 概要 + +ダンプ復元スクリプト + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/restore_backup.py」で行っている。 + +## フォルダ構成 + +```txt +. +├── .env.example -- ローカル実行用の環境変数のサンプル値。 +├── .dockerignore -- docker build時のコンテキストに含めるファイルの抑制リスト +├── .gitignore -- Git差分管理除外リスト +├── Dockerfile -- Dockerイメージ作成用 +├── Pipfile -- pythonの依存関係管理 +├── Pipfile.lock -- 依存関係バージョン固定 +├── README.md -- 当ファイル +├── entrypoint.py -- エントリーポイントとなるファイル +├── mysql_dpkg_selection.txt -- Dockerイメージでdpkgを使うときに外部から注入する選択値 +└── src -- ソースコードフォルダ + ├── logging + │ └── get_logger.py -- ロガー + ├── restore_backup.py -- dump復元処理本体 + └── system_var + ├── constants.py -- 定数ファイル + └── environment.py -- 環境変数ファイル +``` diff --git a/ecs/restore-dbdump/entrypoint.py b/ecs/restore-dbdump/entrypoint.py new file mode 100644 index 00000000..70f48060 --- /dev/null +++ b/ecs/restore-dbdump/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク DBダンプ復元のエントリーポイント""" +from src import restore_backup + +if __name__ == '__main__': + try: + exit(restore_backup.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/restore-dbdump/mysql_dpkg_selection.txt b/ecs/restore-dbdump/mysql_dpkg_selection.txt new file mode 100644 index 00000000..d3cb46f9 --- /dev/null +++ b/ecs/restore-dbdump/mysql_dpkg_selection.txt @@ -0,0 +1,3 @@ +1 +1 +4 \ No newline at end of file diff --git a/ecs/restore-dbdump/src/__init__.py b/ecs/restore-dbdump/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/restore-dbdump/src/logging/get_logger.py b/ecs/restore-dbdump/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/restore-dbdump/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/restore-dbdump/src/restore_backup.py b/ecs/restore-dbdump/src/restore_backup.py new file mode 100644 index 00000000..25ce0b19 --- /dev/null +++ b/ecs/restore-dbdump/src/restore_backup.py @@ -0,0 +1,64 @@ +"""ダンプ復元スクリプト""" + +import os +import subprocess +import textwrap + +### from src.logging.get_logger import get_logger +from src.system_var import constants, environment + +### logger = get_logger('ダンプ復元スクリプト') + + +def exec(): + try: + ### logger.info('ダンプ復元スクリプト:開始') + + # MySQL接続情報を作成する + my_cnf_file_content = f""" + [client] + user={environment.DB_USERNAME} + password={environment.DB_PASSWORD} + host={environment.DB_HOST} + """ + # my.cnfファイルのパス + my_cnf_path = os.path.join('my.cnf') + + # my.cnfファイルを生成する + with open(my_cnf_path, 'w') as f: + f.write(textwrap.dedent(my_cnf_file_content)[1:-1]) + + os.chmod(my_cnf_path, 0o444) + + # 復元対象のダンプファイルを特定 + s3_file_path = environment.DUMP_FILE_S3_PATH + + # aws s3 cpコマンドを実行してdumpファイルをローカルにダウンロードする + s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) + _, error = s3_cp_process.communicate() + if s3_cp_process.returncode != 0: + ### logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + # S3コマンドの標準エラーはクローズしておく + s3_cp_process.stderr.close() + + # gzipコマンドを実行してdumpファイルを解凍する + gzip_process = subprocess.Popen(['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # mysqlコマンドを実行し、dumpを復元する + mysql_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], + stdin=gzip_process.stdout, stderr=subprocess.PIPE + ) + # gzipの標準出力をmysqlに接続したため、標準出力をクローズする + gzip_process.stdout.close() + + _, error = mysql_process.communicate() + if mysql_process.returncode != 0: + ### logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + ### logger.info('[NOTICE]ダンプ復元スクリプト:終了(正常終了)') + return constants.BATCH_EXIT_CODE_SUCCESS + + except Exception as e: + ### logger.exception(f'ダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/restore-dbdump/src/system_var/__init__.py b/ecs/restore-dbdump/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/restore-dbdump/src/system_var/constants.py b/ecs/restore-dbdump/src/system_var/constants.py new file mode 100644 index 00000000..8a555af3 --- /dev/null +++ b/ecs/restore-dbdump/src/system_var/constants.py @@ -0,0 +1,2 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 diff --git a/ecs/restore-dbdump/src/system_var/environment.py b/ecs/restore-dbdump/src/system_var/environment.py new file mode 100644 index 00000000..65664807 --- /dev/null +++ b/ecs/restore-dbdump/src/system_var/environment.py @@ -0,0 +1,12 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +DUMP_FILE_S3_PATH = os.environ['DUMP_FILE_S3_PATH'] + From 0459668032eec8a1a11dadbdd75e16283a1dae21 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 21 Feb 2024 16:19:23 +0900 Subject: [PATCH 920/962] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=83=A2=E3=82=B8?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=83=AB=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/export-dbdump/.env.example | 5 - ecs/export-dbdump/.vscode/launch.json | 2 +- ecs/export-dbdump/Pipfile | 3 - ecs/export-dbdump/Pipfile.lock | 150 +-------------- ecs/export-dbdump/README.md | 4 +- ecs/export-dbdump/entrypoint.py | 2 +- .../src/batch/batch_functions.py | 131 ------------- .../src/batch/common/__init__.py | 0 ecs/export-dbdump/src/db/__init__.py | 0 ecs/export-dbdump/src/db/database.py | 180 ------------------ ecs/export-dbdump/src/error/__init__.py | 0 ecs/export-dbdump/src/error/exceptions.py | 10 - ecs/export-dbdump/src/jobctrl_dbdump.py | 53 +----- ecs/export-dbdump/src/system_var/constants.py | 14 +- 14 files changed, 15 insertions(+), 539 deletions(-) delete mode 100644 ecs/export-dbdump/src/batch/batch_functions.py delete mode 100644 ecs/export-dbdump/src/batch/common/__init__.py delete mode 100644 ecs/export-dbdump/src/db/__init__.py delete mode 100644 ecs/export-dbdump/src/db/database.py delete mode 100644 ecs/export-dbdump/src/error/__init__.py delete mode 100644 ecs/export-dbdump/src/error/exceptions.py diff --git a/ecs/export-dbdump/.env.example b/ecs/export-dbdump/.env.example index c4e1f427..9782a3ce 100644 --- a/ecs/export-dbdump/.env.example +++ b/ecs/export-dbdump/.env.example @@ -5,10 +5,5 @@ DB_PASSWORD=************ DB_SCHEMA=***** DUMP_BACKUP_BUCKET=************ -DUMP_BACKUP_FOLDER=dump LOG_LEVEL=INFO -DB_CONNECTION_MAX_RETRY_ATTEMPT=************ -DB_CONNECTION_RETRY_INTERVAL_INIT=************ -DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ -DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ diff --git a/ecs/export-dbdump/.vscode/launch.json b/ecs/export-dbdump/.vscode/launch.json index ac80ce4f..2121f066 100644 --- a/ecs/export-dbdump/.vscode/launch.json +++ b/ecs/export-dbdump/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "name": "(DEBUG)jskult batch laundering", + "name": "(DEBUG) export dbdump", "type": "python", "request": "launch", "program": "entrypoint.py", diff --git a/ecs/export-dbdump/Pipfile b/ecs/export-dbdump/Pipfile index 65b30a51..f032c7ea 100644 --- a/ecs/export-dbdump/Pipfile +++ b/ecs/export-dbdump/Pipfile @@ -4,9 +4,6 @@ verify_ssl = true name = "pypi" [packages] -sqlalchemy = "*" -tenacity = "*" -pymysql = "*" [dev-packages] autopep8 = "*" diff --git a/ecs/export-dbdump/Pipfile.lock b/ecs/export-dbdump/Pipfile.lock index fb6db2d1..58c4d231 100644 --- a/ecs/export-dbdump/Pipfile.lock +++ b/ecs/export-dbdump/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e2e2efd7ebd6ad719931983f277105dd94c4ebb6363f7c00e75dd8ca05523713" + "sha256": "cc5f54bfb2073051a26f113ceac64e12fdd0bf8faa36f1a42210cc9c921c134b" }, "pipfile-spec": 6, "requires": { @@ -15,151 +15,7 @@ } ] }, - "default": { - "greenlet": { - "hashes": [ - "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", - "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", - "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", - "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", - "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", - "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", - "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", - "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", - "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", - "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", - "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", - "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", - "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", - "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", - "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", - "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", - "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", - "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", - "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", - "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", - "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", - "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", - "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", - "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", - "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", - "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", - "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", - "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", - "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", - "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", - "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", - "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", - "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", - "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", - "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", - "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", - "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", - "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", - "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", - "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", - "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", - "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", - "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", - "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", - "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", - "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", - "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", - "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", - "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", - "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", - "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", - "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", - "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", - "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", - "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", - "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", - "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", - "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" - ], - "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.3" - }, - "pymysql": { - "hashes": [ - "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", - "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "sqlalchemy": { - "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" - ], - "index": "pypi", - "version": "==2.0.25" - }, - "tenacity": { - "hashes": [ - "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", - "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" - ], - "index": "pypi", - "version": "==8.2.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" - ], - "markers": "python_version >= '3.8'", - "version": "==4.9.0" - } - }, + "default": {}, "develop": { "autopep8": { "hashes": [ @@ -167,6 +23,7 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "flake8": { @@ -175,6 +32,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "mccabe": { diff --git a/ecs/export-dbdump/README.md b/ecs/export-dbdump/README.md index 7d8f0ccd..4b3afad4 100644 --- a/ecs/export-dbdump/README.md +++ b/ecs/export-dbdump/README.md @@ -1,8 +1,8 @@ -# 日次バッチ処理前DBダンプ取得  +# 【共通】DBダンプ取得  ## 概要 -日次バッチ処理前DBダンプ取得処理。 +【共通】DBダンプ取得処理。 ## 環境情報 diff --git a/ecs/export-dbdump/entrypoint.py b/ecs/export-dbdump/entrypoint.py index 543cb134..221f3770 100644 --- a/ecs/export-dbdump/entrypoint.py +++ b/ecs/export-dbdump/entrypoint.py @@ -1,4 +1,4 @@ -"""実消化&アルトマーク 日次バッチ処理前DBダンプ取得のエントリーポイント""" +"""【共通】DBダンプ取得処理のエントリーポイント""" from src import jobctrl_dbdump if __name__ == '__main__': diff --git a/ecs/export-dbdump/src/batch/batch_functions.py b/ecs/export-dbdump/src/batch/batch_functions.py deleted file mode 100644 index eece0536..00000000 --- a/ecs/export-dbdump/src/batch/batch_functions.py +++ /dev/null @@ -1,131 +0,0 @@ -"""バッチ処理の共通関数""" -import logging -import textwrap - -from src.db.database import Database -from src.error.exceptions import BatchOperationException, DBException -from src.system_var import constants - - -def get_batch_statuses() -> tuple[str, str]: - """日付テーブルから、以下を取得して返す。 - - バッチ処理中フラグ - - dump取得状況区分 - - Raises: - BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき - - Returns: - tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 - """ - db = Database.get_instance() - sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' - try: - db.connect() - hdke_tbl_result = db.execute_select(sql) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - if len(hdke_tbl_result) == 0: - raise BatchOperationException('日付テーブルが取得できませんでした') - - # 必ず1件取れる - hdke_tbl_record = hdke_tbl_result[0] - batch_processing_flag = hdke_tbl_record['bch_actf'] - dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] - - return batch_processing_flag, dump_status_kbn - - -def update_dump_status_kbn_in_processing() -> None: - """dump取得状況区分を処理中に更新する - - Raises: - BatchOperationException: DB操作の何らかのエラー - """ - db = Database.get_instance() - sql = """\ - UPDATE src05.hdke_tbl - SET - dump_sts_kbn = :in_processing, - updater = CURRENT_USER(), - update_date = NOW() - """ - try: - db.connect() - db.to_jst() - db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - return - - -def update_dump_status_kbn_error() -> None: - """dump取得状況区分をエラーに更新する - - Raises: - BatchOperationException: DB操作の何らかのエラー - """ - db = Database.get_instance() - sql = """\ - UPDATE src05.hdke_tbl - SET - dump_sts_kbn = :dump_unprocessed, - updater = CURRENT_USER(), - update_date = NOW() - """ - try: - db.connect() - db.to_jst() - db.execute(sql, { - 'dump_unprocessed': constants.DUMP_STATUS_KBN_ERROR - }) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - return - - -def update_dump_status_kbn_complete() -> None: - """dump取得状況区分を正常終了に更新する - - Raises: - BatchOperationException: DB操作の何らかのエラー - """ - db = Database.get_instance() - sql = """\ - UPDATE src05.hdke_tbl - SET - dump_sts_kbn = :dump_unprocessed, - updater = CURRENT_USER(), - update_date = NOW() - """ - try: - db.connect() - db.to_jst() - db.execute(sql, { - 'dump_unprocessed': constants.DUMP_STATUS_KBN_COMPLETE - }) - except DBException as e: - raise BatchOperationException(e) - finally: - db.disconnect() - - return - - -def logging_sql(logger: logging.Logger, sql: str) -> None: - """SQL文をデバッグログで出力する - - Args: - logger (logging.Logger): ロガー - sql (str): SQL文 - """ - logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/export-dbdump/src/batch/common/__init__.py b/ecs/export-dbdump/src/batch/common/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/export-dbdump/src/db/__init__.py b/ecs/export-dbdump/src/db/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/export-dbdump/src/db/database.py b/ecs/export-dbdump/src/db/database.py deleted file mode 100644 index 24bb6061..00000000 --- a/ecs/export-dbdump/src/db/database.py +++ /dev/null @@ -1,180 +0,0 @@ -from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, - create_engine, text) -from sqlalchemy.engine.url import URL -from tenacity import retry, stop_after_attempt, wait_exponential - -from src.error.exceptions import DBException -from src.system_var import environment - - -class Database: - """データベース操作クラス""" - __connection: Connection = None - __engine: Engine = None - __host: str = None - __port: str = None - __username: str = None - __password: str = None - __schema: str = None - __connection_string: str = None - - def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: - """このクラスの新たなインスタンスを初期化します - - Args: - username (str): DBユーザー名 - password (str): DBパスワード - host (str): DBホスト名 - port (int): DBポート - schema (str): DBスキーマ名 - """ - self.__username = username - self.__password = password - self.__host = host - self.__port = int(port) - self.__schema = schema - - self.__connection_string = URL.create( - drivername='mysql+pymysql', - username=self.__username, - password=self.__password, - host=self.__host, - port=self.__port, - database=self.__schema, - query={"charset": "utf8mb4"} - ) - - self.__engine = create_engine( - self.__connection_string, - pool_timeout=5, - poolclass=QueuePool - ) - - @classmethod - def get_instance(cls): - """インスタンスを取得します - - Returns: - Database: DB操作クラスインスタンス - """ - return cls( - username=environment.DB_USERNAME, - password=environment.DB_PASSWORD, - host=environment.DB_HOST, - port=environment.DB_PORT, - schema=environment.DB_SCHEMA - ) - - @retry( - wait=wait_exponential( - multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, - min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, - max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS - ), - stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), - retry_error_cls=DBException - ) - def connect(self): - """ - DBに接続します。接続に失敗した場合、リトライします。 - Raises: - DBException: 接続失敗 - """ - try: - self.__connection = self.__engine.connect() - except Exception as e: - raise DBException(e) - - def execute_select(self, select_query: str, parameters=None) -> list[dict]: - """SELECTクエリを実行します。 - - Args: - select_query (str): SELECT文 - parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. - - Raises: - DBException: DBエラー - - Returns: - list[dict]: カラム名: 値の辞書リスト - """ - if self.__connection is None: - raise DBException('DBに接続していません') - - result = None - try: - # トランザクションが開始している場合は、トランザクションを引き継ぐ - if self.__connection.in_transaction(): - result = self.__connection.execute(text(select_query), parameters) - else: - # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 - result = self.__execute_with_transaction(select_query, parameters) - except Exception as e: - raise DBException(f'SQL Error: {e}') - - result_rows = result.mappings().all() - return result_rows - - def execute(self, query: str, parameters=None) -> CursorResult: - """SQLクエリを実行します。 - - Args: - query (str): SQL文 - parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. - - Raises: - DBException: DBエラー - - Returns: - CursorResult: 取得結果 - """ - if self.__connection is None: - raise DBException('DBに接続していません') - - result = None - try: - # トランザクションが開始している場合は、トランザクションを引き継ぐ - if self.__connection.in_transaction(): - result = self.__connection.execute(text(query), parameters) - else: - # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 - result = self.__execute_with_transaction(query, parameters) - except Exception as e: - raise DBException(f'SQL Error: {e}') - - return result - - def begin(self): - """トランザクションを開始します。""" - if not self.__connection.in_transaction(): - self.__connection.begin() - - def commit(self): - """トランザクションをコミットします""" - if self.__connection.in_transaction(): - self.__connection.commit() - - def rollback(self): - """トランザクションをロールバックします""" - if self.__connection.in_transaction(): - self.__connection.rollback() - - def disconnect(self): - """DB接続を切断します。""" - if self.__connection is not None: - self.__connection.close() - self.__connection = None - - def to_jst(self): - self.execute('SET time_zone = "+9:00"') - - def __execute_with_transaction(self, query: str, parameters: dict): - # トランザクションを開始してクエリを実行する - with self.__connection.begin(): - try: - result = self.__connection.execute(text(query), parameters=parameters) - except Exception as e: - self.__connection.rollback() - raise e - # ここでコミットされる - return result diff --git a/ecs/export-dbdump/src/error/__init__.py b/ecs/export-dbdump/src/error/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/export-dbdump/src/error/exceptions.py b/ecs/export-dbdump/src/error/exceptions.py deleted file mode 100644 index 055c24f6..00000000 --- a/ecs/export-dbdump/src/error/exceptions.py +++ /dev/null @@ -1,10 +0,0 @@ -class MeDaCaException(Exception): - pass - - -class DBException(MeDaCaException): - pass - - -class BatchOperationException(MeDaCaException): - pass diff --git a/ecs/export-dbdump/src/jobctrl_dbdump.py b/ecs/export-dbdump/src/jobctrl_dbdump.py index b6e27728..0612e4f7 100644 --- a/ecs/export-dbdump/src/jobctrl_dbdump.py +++ b/ecs/export-dbdump/src/jobctrl_dbdump.py @@ -5,11 +5,6 @@ import os import subprocess import textwrap -from src.batch.batch_functions import (get_batch_statuses, - update_dump_status_kbn_complete, - update_dump_status_kbn_error, - update_dump_status_kbn_in_processing) -from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants, environment @@ -19,32 +14,6 @@ logger = get_logger('DBダンプ取得') def exec(): try: logger.info('DBダンプ取得:開始') - try: - # 日次バッチ処置中フラグ、dump処理状態区分を取得 - batch_processing_flag, dump_status_kbn = get_batch_statuses() - except BatchOperationException as e: - raise BatchOperationException(f'日付テーブル取得エラー(異常終了):{e}') - - # 日次バッチ処理中の場合、処理は行わない - if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: - logger.error('日次バッチ処理中の為、DBダンプ取得を終了します。') - return constants.BATCH_EXIT_CODE_SUCCESS - - # dump処理状態区分が処理中の場合、処理は行わない - if dump_status_kbn == constants.DUMP_STATUS_KBN_PROCESSED: - logger.error(f'ダンプ取得中の為、DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') - return constants.BATCH_EXIT_CODE_SUCCESS - - # dump処理状態区分がエラーの場合、処理は行わない - if dump_status_kbn == constants.DUMP_STATUS_KBN_ERROR: - logger.error(f'ダンプ取得が実行不可能な状態の為、DBダンプ取得を終了します。 dump処理状態区分={dump_status_kbn}') - return constants.BATCH_EXIT_CODE_SUCCESS - - # dump処理状態区分を処理中に更新 - try: - update_dump_status_kbn_in_processing() - except BatchOperationException as e: - raise BatchOperationException(f'dump処理状態区分更新(未処理→処理中) エラー(異常終了):{e}') # MySQL接続情報を作成する my_cnf_file_content = f""" @@ -65,9 +34,9 @@ def exec(): os.chmod(my_cnf_path, 0o444) dt_now = datetime.datetime.now() - converted_value = dt_now.strftime('%Y%m%d%H%M%S') + converted_value = dt_now.strftime('%Y%m%d%H%M%S%f') dump_file_name = f'backup_rds_{environment.DB_SCHEMA}_{converted_value}.gz' - s3_file_path = f's3://{environment.DUMP_BACKUP_BUCKET}/dump/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' + s3_file_path = f's3://{environment.DUMP_BACKUP_BUCKET}/{constants.DUMP_BACKUP_FOLDER}/{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}/{dump_file_name}' # mysqldumpコマンドを実行し、dumpを取得する command = [ @@ -95,32 +64,20 @@ def exec(): # パイプラインを実行し、エラーハンドリング _, error = mysqldump_process.communicate() if mysqldump_process.returncode != 0: - raise BatchOperationException(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + raise Exception(f'`mysqldump`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') _, error = gzip_process.communicate() if gzip_process.returncode != 0: - raise BatchOperationException(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + raise Exception(f'`gzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: - raise BatchOperationException(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') - - # dump処理状態区分を正常終了に更新 - try: - update_dump_status_kbn_complete() - except BatchOperationException as e: - raise BatchOperationException(f'dump処理状態区分更新(処理中→正常終了) エラー(異常終了):{e}') + raise Exception(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') logger.info('DBダンプ取得:終了(正常終了)') logger.info(f'出力ファイルパス: {s3_file_path}') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: - # dump処理状態区分をエラーに更新 - try: - update_dump_status_kbn_error() - except BatchOperationException as e: - logger.exception(f'dump処理状態区分更新(処理中→エラー) エラー(異常終了):{e}') - return constants.BATCH_EXIT_CODE_SUCCESS logger.exception(f'DBダンプ取得中に想定外のエラーが発生しました :{e}') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/export-dbdump/src/system_var/constants.py b/ecs/export-dbdump/src/system_var/constants.py index 993e5a7d..4d288bbd 100644 --- a/ecs/export-dbdump/src/system_var/constants.py +++ b/ecs/export-dbdump/src/system_var/constants.py @@ -1,15 +1,5 @@ # バッチ正常終了コード BATCH_EXIT_CODE_SUCCESS = 0 -# バッチ処理中フラグ:未処理 -BATCH_ACTF_BATCH_UNPROCESSED = '0' -# バッチ処理中フラグ:処理中 -BATCH_ACTF_BATCH_IN_PROCESSING = '1' -# dump取得状態区分:未処理 -DUMP_STATUS_KBN_UNPROCESSED = '0' -# dump取得状態区分:処理中 -DUMP_STATUS_KBN_PROCESSED = '1' -# dump取得状態区分:正常終了 -DUMP_STATUS_KBN_COMPLETE = '2' -# dump取得状態区分:エラー -DUMP_STATUS_KBN_ERROR = '9' +# ダンプバックアップフォルダー +DUMP_BACKUP_FOLDER = 'dump' \ No newline at end of file From 9400a7f5ff43c3cd713ad8a3c1aebaf0b5858672 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 21 Feb 2024 16:48:12 +0900 Subject: [PATCH 921/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=83=BBprepostexec=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/restore-dbdump/.env.example | 3 +- ecs/restore-dbdump/README.md | 2 +- ecs/restore-dbdump/src/restore_backup.py | 40 +++++++++++++++---- .../src/system_var/environment.py | 2 +- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/ecs/restore-dbdump/.env.example b/ecs/restore-dbdump/.env.example index 7272a711..1a407863 100644 --- a/ecs/restore-dbdump/.env.example +++ b/ecs/restore-dbdump/.env.example @@ -3,4 +3,5 @@ DB_PORT=3306 DB_USERNAME=************ DB_PASSWORD=************ DB_SCHEMA=src05 -DUMP_FILE_S3_PATH=******************* \ No newline at end of file +DUMP_FILE_S3_PATH=******************* +LOG_LEVEL=INFO \ No newline at end of file diff --git a/ecs/restore-dbdump/README.md b/ecs/restore-dbdump/README.md index dee336e4..187692af 100644 --- a/ecs/restore-dbdump/README.md +++ b/ecs/restore-dbdump/README.md @@ -2,7 +2,7 @@ ## 概要 -ダンプ復元スクリプト +当処理は特定の機能で利用するものではなく、共通処理として要件に応じて実行することを想定している。 ## 環境情報 diff --git a/ecs/restore-dbdump/src/restore_backup.py b/ecs/restore-dbdump/src/restore_backup.py index 25ce0b19..2b015629 100644 --- a/ecs/restore-dbdump/src/restore_backup.py +++ b/ecs/restore-dbdump/src/restore_backup.py @@ -4,16 +4,20 @@ import os import subprocess import textwrap -### from src.logging.get_logger import get_logger +from src.logging.get_logger import get_logger from src.system_var import constants, environment -### logger = get_logger('ダンプ復元スクリプト') +logger = get_logger('ダンプ復元スクリプト') def exec(): try: - ### logger.info('ダンプ復元スクリプト:開始') + logger.info('ダンプ復元スクリプト:開始') + # 事前処理(共通処理としては空振りする) + _pre_exec() + + #メイン処理 # MySQL接続情報を作成する my_cnf_file_content = f""" [client] @@ -37,7 +41,7 @@ def exec(): s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: - ### logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS # S3コマンドの標準エラーはクローズしておく s3_cp_process.stderr.close() @@ -54,11 +58,33 @@ def exec(): _, error = mysql_process.communicate() if mysql_process.returncode != 0: - ### logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS - ### logger.info('[NOTICE]ダンプ復元スクリプト:終了(正常終了)') + + # 事後処理(共通処理としては空振りする) + _post_exec() + + logger.info('[NOTICE]ダンプ復元スクリプト:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS except Exception as e: - ### logger.exception(f'ダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') + logger.exception(f'ダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') return constants.BATCH_EXIT_CODE_SUCCESS + +def _pre_exec(): + """ + ダンプ復元 事前処理 + 共通機能としては事前処理を実装しない。 + 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + print('pre') + pass + +def _post_exec(): + """ + ダンプ復元 事後処理 + 共通機能としては事後処理を実装しない。 + 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + print('post') + pass diff --git a/ecs/restore-dbdump/src/system_var/environment.py b/ecs/restore-dbdump/src/system_var/environment.py index 65664807..bddc0a38 100644 --- a/ecs/restore-dbdump/src/system_var/environment.py +++ b/ecs/restore-dbdump/src/system_var/environment.py @@ -9,4 +9,4 @@ DB_SCHEMA = os.environ['DB_SCHEMA'] # AWS DUMP_FILE_S3_PATH = os.environ['DUMP_FILE_S3_PATH'] - +LOG_LEVEL = os.environ['LOG_LEVEL'] From b480424354720d12f760cfc4bd428feb62f9d786 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 21 Feb 2024 16:52:19 +0900 Subject: [PATCH 922/962] =?UTF-8?q?=E7=A2=BA=E8=AA=8D=E7=94=A8=E4=B8=8D?= =?UTF-8?q?=E8=A6=81=E3=82=B3=E3=83=BC=E3=83=89=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/restore-dbdump/src/restore_backup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ecs/restore-dbdump/src/restore_backup.py b/ecs/restore-dbdump/src/restore_backup.py index 2b015629..d047703a 100644 --- a/ecs/restore-dbdump/src/restore_backup.py +++ b/ecs/restore-dbdump/src/restore_backup.py @@ -63,7 +63,7 @@ def exec(): # 事後処理(共通処理としては空振りする) _post_exec() - + logger.info('[NOTICE]ダンプ復元スクリプト:終了(正常終了)') return constants.BATCH_EXIT_CODE_SUCCESS @@ -77,7 +77,6 @@ def _pre_exec(): 共通機能としては事前処理を実装しない。 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 """ - print('pre') pass def _post_exec(): @@ -86,5 +85,4 @@ def _post_exec(): 共通機能としては事後処理を実装しない。 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 """ - print('post') pass From 37b9bc611208ae23d01e6177617c7a942d531800 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Wed, 21 Feb 2024 17:07:24 +0900 Subject: [PATCH 923/962] =?UTF-8?q?=E5=89=8D=E5=BE=8C=E5=87=A6=E7=90=86pre?= =?UTF-8?q?post=5Fexec=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/export-dbdump/README.md | 2 +- ecs/export-dbdump/src/jobctrl_dbdump.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ecs/export-dbdump/README.md b/ecs/export-dbdump/README.md index 4b3afad4..a3764e33 100644 --- a/ecs/export-dbdump/README.md +++ b/ecs/export-dbdump/README.md @@ -2,7 +2,7 @@ ## 概要 -【共通】DBダンプ取得処理。 +当処理は特定の機能で利用するものではなく、共通処理として要件に応じて実行することを想定している。 ## 環境情報 diff --git a/ecs/export-dbdump/src/jobctrl_dbdump.py b/ecs/export-dbdump/src/jobctrl_dbdump.py index 0612e4f7..a82c155f 100644 --- a/ecs/export-dbdump/src/jobctrl_dbdump.py +++ b/ecs/export-dbdump/src/jobctrl_dbdump.py @@ -15,6 +15,10 @@ def exec(): try: logger.info('DBダンプ取得:開始') + # 事前処理(共通処理としては空振りする) + _pre_exec() + + # メイン処理 # MySQL接続情報を作成する my_cnf_file_content = f""" [client] @@ -74,6 +78,9 @@ def exec(): if s3_cp_process.returncode != 0: raise Exception(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + # 事後処理(共通処理としては空振りする) + _post_exec() + logger.info('DBダンプ取得:終了(正常終了)') logger.info(f'出力ファイルパス: {s3_file_path}') return constants.BATCH_EXIT_CODE_SUCCESS @@ -81,3 +88,19 @@ def exec(): except Exception as e: logger.exception(f'DBダンプ取得中に想定外のエラーが発生しました :{e}') return constants.BATCH_EXIT_CODE_SUCCESS + +def _pre_exec(): + """ + ダンプ復元 事前処理 + 共通機能としては事前処理を実装しない。 + 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass + +def _post_exec(): + """ + ダンプ復元 事後処理 + 共通機能としては事後処理を実装しない。 + 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 + """ + pass \ No newline at end of file From 07ec3d28d5882f8e1a80ac7317fb5286c068b070 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 21 Feb 2024 19:32:33 +0900 Subject: [PATCH 924/962] =?UTF-8?q?fix:=20flatpickr-l10n-ja.js=E3=81=AEint?= =?UTF-8?q?egrity=E3=81=8C=E9=96=93=E9=81=95=E3=81=A3=E3=81=A6=E3=81=8A?= =?UTF-8?q?=E3=82=8A=E3=80=81=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=81=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=80=82=E3=81=93?= =?UTF-8?q?=E3=82=8C=E3=81=8C=E5=BD=B1=E9=9F=BF=E3=81=97=E3=81=A6DatePicke?= =?UTF-8?q?r=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/_header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 4f7906e3..84221542 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -14,6 +14,6 @@ - + \ No newline at end of file From b8db5c11ab24dcb8932172448a2ae6038cee968f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 22 Feb 2024 16:13:20 +0900 Subject: [PATCH 925/962] =?UTF-8?q?feat:=20integrity=E3=81=AE=E6=96=B9?= =?UTF-8?q?=E9=87=9D=E3=82=92=E5=A4=89=E6=9B=B4=E3=80=82=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E3=81=8B=E3=82=89=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=82=93=E3=81=A7?= =?UTF-8?q?=E3=81=84=E3=82=8B=E3=82=82=E3=81=AE=E3=81=AB=E3=81=AF=E3=81=A4?= =?UTF-8?q?=E3=81=91=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/_header.html | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index 84221542..95ac2464 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -4,16 +4,16 @@ {{subtitle}} - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file From b93b30242365a6f8af9919a0f67657252e3f644b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 22 Feb 2024 17:25:39 +0900 Subject: [PATCH 926/962] =?UTF-8?q?feat:=202024=E5=B9=B42=E6=9C=88?= =?UTF-8?q?=E8=84=86=E5=BC=B1=E6=80=A7=E3=82=B9=E3=82=AD=E3=83=A3=E3=83=B3?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 432 +++++++------ ecs/jskult-batch-daily/Pipfile.lock | 248 ++++---- ecs/jskult-batch-laundering/Pipfile.lock | 106 ++-- ecs/jskult-dbdump/Pipfile.lock | 106 ++-- ecs/jskult-webapp/Pipfile.lock | 594 +++++++++--------- .../check-view-security-option/Pipfile.lock | 119 ++-- 6 files changed, 820 insertions(+), 785 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 77efd5fc..4608c4cd 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,27 +26,27 @@ }, "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "certifi": { "hashes": [ - "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2023.11.17" + "version": "==2024.2.2" }, "cffi": { "hashes": [ @@ -103,7 +103,7 @@ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "markers": "python_version >= '3.8'", + "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, "charset-normalizer": { @@ -204,32 +204,41 @@ }, "cryptography": { "hashes": [ - "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", - "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", - "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", - "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", - "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", - "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", - "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", - "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", - "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", - "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", - "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", - "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", - "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", - "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", - "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", - "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", - "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", - "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", - "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", - "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", - "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", - "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", - "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" + "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", + "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", + "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", + "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", + "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", + "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", + "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", + "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", + "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", + "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", + "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", + "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", + "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", + "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", + "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", + "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", + "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", + "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", + "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", + "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", + "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", + "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", + "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", + "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", + "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", + "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", + "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", + "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", + "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", + "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", + "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" ], "markers": "python_version >= '3.7'", - "version": "==41.0.7" + "version": "==42.0.4" }, "idna": { "hashes": [ @@ -340,11 +349,11 @@ }, "platformdirs": { "hashes": [ - "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], "markers": "python_version >= '3.8'", - "version": "==4.1.0" + "version": "==4.2.0" }, "pycparser": { "hashes": [ @@ -371,10 +380,10 @@ }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "version": "==2023.3.post1" + "version": "==2024.1" }, "requests": { "hashes": [ @@ -386,10 +395,10 @@ }, "requests-file": { "hashes": [ - "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e", - "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953" + "sha256:20c5931629c558fda566cacc10cfe2cd502433e628f568c34c80d96a0cc95972", + "sha256:3e493d390adb44aa102ebea827a48717336d5268968c370eaf19abaf5cae13bf" ], - "version": "==1.5.1" + "version": "==2.0.0" }, "requests-toolbelt": { "hashes": [ @@ -459,27 +468,27 @@ }, "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "certifi": { "hashes": [ - "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2023.11.17" + "version": "==2024.2.2" }, "cffi": { "hashes": [ @@ -536,7 +545,7 @@ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "markers": "python_version >= '3.8'", + "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, "charset-normalizer": { @@ -640,90 +649,99 @@ "toml" ], "hashes": [ - "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", - "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", - "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", - "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", - "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", - "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", - "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", - "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", - "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", - "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", - "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", - "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", - "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", - "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", - "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", - "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", - "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", - "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", - "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", - "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", - "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", - "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", - "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", - "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", - "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", - "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", - "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", - "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", - "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", - "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", - "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", - "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", - "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", - "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", - "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", - "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", - "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", - "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", - "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", - "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", - "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", - "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", - "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", - "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", - "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", - "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", - "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", - "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", - "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", - "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", - "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", - "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" + "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73", + "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10", + "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86", + "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55", + "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb", + "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b", + "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac", + "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c", + "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe", + "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1", + "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244", + "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405", + "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64", + "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643", + "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95", + "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962", + "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf", + "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469", + "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8", + "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f", + "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3", + "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc", + "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3", + "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3", + "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647", + "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b", + "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c", + "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2", + "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17", + "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95", + "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047", + "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec", + "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7", + "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088", + "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f", + "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50", + "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a", + "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9", + "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265", + "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642", + "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e", + "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b", + "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e", + "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a", + "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef", + "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03", + "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2", + "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6", + "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def", + "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305", + "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a", + "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c" ], "markers": "python_version >= '3.8'", - "version": "==7.4.0" + "version": "==7.4.2" }, "cryptography": { "hashes": [ - "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", - "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", - "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", - "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", - "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", - "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", - "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", - "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", - "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", - "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", - "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", - "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", - "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", - "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", - "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", - "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", - "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", - "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", - "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", - "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", - "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", - "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", - "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" + "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", + "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", + "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", + "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", + "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", + "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", + "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", + "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", + "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", + "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", + "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", + "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", + "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", + "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", + "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", + "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", + "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", + "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", + "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", + "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", + "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", + "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", + "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", + "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", + "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", + "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", + "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", + "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", + "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", + "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", + "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" ], "markers": "python_version >= '3.7'", - "version": "==41.0.7" + "version": "==42.0.4" }, "exceptiongroup": { "hashes": [ @@ -775,69 +793,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", - "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", - "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", - "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", - "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", - "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", - "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", - "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", - "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", - "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", - "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", - "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", - "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", - "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", - "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", - "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", - "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", - "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", - "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", - "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", - "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", - "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", - "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", - "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", - "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", - "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", - "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", - "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", - "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", - "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", - "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", - "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", - "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", - "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", - "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", - "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", - "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", - "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", - "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", - "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", - "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", - "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", - "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", - "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", - "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", - "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", - "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", - "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", - "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", - "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", - "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", - "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", - "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", - "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", - "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", - "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", - "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", - "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", - "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", - "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" ], "markers": "python_version >= '3.7'", - "version": "==2.1.4" + "version": "==2.1.5" }, "mccabe": { "hashes": [ @@ -849,11 +867,11 @@ }, "moto": { "hashes": [ - "sha256:01aef6a489a725c8d725bd3dc6f70ff1bedaee3e2641752e4b471ff0ede4b4d7", - "sha256:93e0fd13b624bd79115494f833308c3641b2be0fc9f4f18aa9264aa01f6168e0" + "sha256:71bb832a18b64f10fc4cec117b9b0e2305e5831d9a17eb74f6b9819ed7613843", + "sha256:7e27395e5c63ff9554ae14b5baa41bfe6d6b1be0e59eb02977c6ce28411246de" ], "index": "pypi", - "version": "==4.2.13" + "version": "==5.0.2" }, "packaging": { "hashes": [ @@ -865,11 +883,11 @@ }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.4.0" }, "pycodestyle": { "hashes": [ @@ -896,11 +914,11 @@ }, "pytest": { "hashes": [ - "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", - "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" + "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae", + "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca" ], "index": "pypi", - "version": "==7.4.4" + "version": "==8.0.1" }, "pytest-cov": { "hashes": [ @@ -920,11 +938,11 @@ }, "pytest-metadata": { "hashes": [ - "sha256:769a9c65d2884bd583bc626b0ace77ad15dbe02dd91a9106d47fd46d9c2569ca", - "sha256:a17b1e40080401dc23177599208c52228df463db191c1a573ccdffacd885e190" + "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b", + "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8" ], - "markers": "python_version >= '3.7'", - "version": "==3.0.0" + "markers": "python_version >= '3.8'", + "version": "==3.1.1" }, "python-dateutil": { "hashes": [ @@ -1001,11 +1019,11 @@ }, "responses": { "hashes": [ - "sha256:a2b43f4c08bfb9c9bd242568328c65a34b318741d3fab884ac843c5ceeb543f9", - "sha256:b127c6ca3f8df0eb9cc82fd93109a3007a86acb24871834c47b77765152ecf8c" + "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66", + "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a" ], "markers": "python_version >= '3.8'", - "version": "==0.24.1" + "version": "==0.25.0" }, "s3transfer": { "hashes": [ diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index 83519dfb..4085bbed 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -18,19 +18,19 @@ "default": { "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "greenlet": { "hashes": [ @@ -138,58 +138,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", + "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", + "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", + "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", + "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", + "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", + "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", + "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", + "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", + "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", + "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", + "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", + "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", + "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", + "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", + "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", + "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", + "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", + "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", + "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", + "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", + "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", + "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", + "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", + "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", + "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", + "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", + "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", + "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", + "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", + "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", + "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", + "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", + "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", + "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", + "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", + "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", + "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", + "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", + "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", + "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", + "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", + "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", + "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", + "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", + "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", + "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", + "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", + "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" ], "index": "pypi", - "version": "==2.0.25" + "version": "==2.0.27" }, "tenacity": { "hashes": [ @@ -201,11 +201,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", + "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.10.0rc1" }, "urllib3": { "hashes": [ @@ -227,80 +227,80 @@ }, "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", - "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", - "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", - "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", - "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", - "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", - "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", - "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", - "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", - "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", - "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", - "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", - "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", - "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", - "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", - "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", - "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", - "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", - "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", - "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", - "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", - "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", - "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", - "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", - "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", - "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", - "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", - "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", - "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", - "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", - "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", - "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", - "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", - "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", - "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", - "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", - "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", - "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", - "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", - "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", - "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", - "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", - "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", - "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", - "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", - "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", - "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", - "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", - "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", - "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", - "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", - "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" + "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73", + "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10", + "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86", + "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55", + "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb", + "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b", + "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac", + "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c", + "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe", + "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1", + "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244", + "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405", + "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64", + "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643", + "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95", + "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962", + "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf", + "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469", + "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8", + "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f", + "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3", + "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc", + "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3", + "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3", + "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647", + "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b", + "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c", + "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2", + "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17", + "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95", + "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047", + "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec", + "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7", + "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088", + "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f", + "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50", + "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a", + "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9", + "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265", + "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642", + "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e", + "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b", + "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e", + "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a", + "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef", + "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03", + "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2", + "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6", + "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def", + "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305", + "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a", + "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c" ], "markers": "python_version >= '3.8'", - "version": "==7.4.0" + "version": "==7.4.2" }, "exceptiongroup": { "hashes": [ @@ -352,11 +352,11 @@ }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.4.0" }, "pycodestyle": { "hashes": [ @@ -376,11 +376,11 @@ }, "pytest": { "hashes": [ - "sha256:42ed2f917ded90ceb752dbe2ecb48c436c2a70d38bc16018c2d11da6426a18b6", - "sha256:efc82dc5e6f2f41ae5acb9eabdf2ced192f336664c436b24a7db2c6aaafe4efd" + "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae", + "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca" ], "index": "pypi", - "version": "==8.0.0rc2" + "version": "==8.0.1" }, "pytest-cov": { "hashes": [ diff --git a/ecs/jskult-batch-laundering/Pipfile.lock b/ecs/jskult-batch-laundering/Pipfile.lock index fb6db2d1..67f59dae 100644 --- a/ecs/jskult-batch-laundering/Pipfile.lock +++ b/ecs/jskult-batch-laundering/Pipfile.lock @@ -90,58 +90,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", + "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", + "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", + "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", + "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", + "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", + "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", + "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", + "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", + "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", + "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", + "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", + "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", + "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", + "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", + "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", + "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", + "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", + "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", + "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", + "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", + "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", + "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", + "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", + "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", + "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", + "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", + "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", + "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", + "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", + "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", + "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", + "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", + "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", + "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", + "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", + "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", + "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", + "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", + "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", + "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", + "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", + "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", + "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", + "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", + "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", + "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", + "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", + "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" ], "index": "pypi", - "version": "==2.0.25" + "version": "==2.0.27" }, "tenacity": { "hashes": [ @@ -153,11 +153,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", + "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.10.0rc1" } }, "develop": { diff --git a/ecs/jskult-dbdump/Pipfile.lock b/ecs/jskult-dbdump/Pipfile.lock index fb6db2d1..67f59dae 100644 --- a/ecs/jskult-dbdump/Pipfile.lock +++ b/ecs/jskult-dbdump/Pipfile.lock @@ -90,58 +90,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", + "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", + "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", + "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", + "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", + "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", + "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", + "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", + "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", + "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", + "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", + "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", + "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", + "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", + "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", + "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", + "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", + "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", + "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", + "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", + "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", + "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", + "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", + "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", + "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", + "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", + "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", + "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", + "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", + "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", + "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", + "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", + "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", + "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", + "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", + "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", + "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", + "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", + "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", + "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", + "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", + "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", + "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", + "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", + "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", + "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", + "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", + "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", + "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" ], "index": "pypi", - "version": "==2.0.25" + "version": "==2.0.27" }, "tenacity": { "hashes": [ @@ -153,11 +153,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", + "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.10.0rc1" } }, "develop": { diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock index 8e512ef0..ad94f3b4 100644 --- a/ecs/jskult-webapp/Pipfile.lock +++ b/ecs/jskult-webapp/Pipfile.lock @@ -26,35 +26,35 @@ }, "anyio": { "hashes": [ - "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", - "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" + "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", + "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.3.0" }, "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "certifi": { "hashes": [ - "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2023.11.17" + "version": "==2024.2.2" }, "cffi": { "hashes": [ @@ -111,7 +111,7 @@ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "markers": "python_version >= '3.8'", + "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, "charset-normalizer": { @@ -220,31 +220,40 @@ }, "cryptography": { "hashes": [ - "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", - "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", - "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", - "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", - "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", - "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", - "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", - "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", - "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", - "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", - "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", - "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", - "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", - "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", - "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", - "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", - "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", - "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", - "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", - "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", - "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", - "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", - "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" + "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", + "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", + "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", + "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", + "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", + "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", + "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", + "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", + "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", + "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", + "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", + "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", + "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", + "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", + "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", + "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", + "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", + "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", + "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", + "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", + "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", + "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", + "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", + "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", + "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", + "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", + "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", + "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", + "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", + "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", + "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" ], - "version": "==41.0.7" + "version": "==42.0.4" }, "et-xmlfile": { "hashes": [ @@ -264,11 +273,11 @@ }, "fastapi": { "hashes": [ - "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093", - "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191" + "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d", + "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73" ], "index": "pypi", - "version": "==0.109.0" + "version": "==0.109.2" }, "greenlet": { "hashes": [ @@ -417,69 +426,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", - "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", - "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", - "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", - "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", - "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", - "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", - "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", - "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", - "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", - "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", - "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", - "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", - "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", - "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", - "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", - "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", - "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", - "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", - "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", - "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", - "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", - "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", - "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", - "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", - "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", - "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", - "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", - "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", - "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", - "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", - "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", - "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", - "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", - "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", - "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", - "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", - "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", - "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", - "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", - "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", - "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", - "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", - "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", - "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", - "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", - "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", - "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", - "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", - "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", - "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", - "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", - "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", - "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", - "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", - "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", - "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", - "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", - "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", - "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" ], "markers": "python_version >= '3.7'", - "version": "==2.1.4" + "version": "==2.1.5" }, "mojimoji": { "hashes": [ @@ -525,45 +534,45 @@ }, "numpy": { "hashes": [ - "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd", - "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b", - "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e", - "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f", - "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f", - "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178", - "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3", - "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4", - "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e", - "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0", - "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00", - "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419", - "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4", - "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6", - "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166", - "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b", - "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3", - "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf", - "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2", - "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2", - "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36", - "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03", - "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce", - "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6", - "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13", - "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5", - "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e", - "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485", - "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137", - "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374", - "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58", - "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b", - "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb", - "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b", - "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda", - "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511" + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], "markers": "python_version < '3.11'", - "version": "==1.26.3" + "version": "==1.26.4" }, "openpyxl": { "hashes": [ @@ -625,96 +634,96 @@ }, "pydantic": { "hashes": [ - "sha256:a9560d042a8113eec5acd0474067f4edf493e7b9bb03d8f83e342dfb4b0dcf84", - "sha256:c12831f560ec778224367351b94c1f9a2628c4f5fb74ed258ef70918d330b812" + "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f", + "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9" ], "index": "pypi", - "version": "==2.6.0b1" + "version": "==2.6.1" }, "pydantic-core": { "hashes": [ - "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7", - "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca", - "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51", - "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da", - "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc", - "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae", - "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4", - "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b", - "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0", - "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e", - "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118", - "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506", - "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798", - "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f", - "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d", - "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948", - "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f", - "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9", - "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137", - "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640", - "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f", - "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff", - "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706", - "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d", - "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f", - "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c", - "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8", - "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1", - "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7", - "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95", - "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60", - "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253", - "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e", - "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c", - "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc", - "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3", - "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8", - "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9", - "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c", - "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388", - "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95", - "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91", - "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818", - "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8", - "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f", - "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394", - "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13", - "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17", - "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7", - "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06", - "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f", - "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196", - "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66", - "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf", - "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c", - "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76", - "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0", - "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212", - "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f", - "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49", - "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206", - "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48", - "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c", - "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2", - "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05", - "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610", - "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd", - "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76", - "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1", - "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60", - "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34", - "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4", - "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864", - "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66", - "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c", - "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e", - "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54", - "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8", - "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e" + "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379", + "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06", + "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05", + "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7", + "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753", + "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a", + "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731", + "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc", + "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380", + "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3", + "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c", + "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11", + "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990", + "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a", + "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2", + "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8", + "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97", + "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a", + "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8", + "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef", + "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77", + "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33", + "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82", + "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5", + "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b", + "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55", + "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e", + "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b", + "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7", + "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec", + "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc", + "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469", + "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b", + "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20", + "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e", + "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d", + "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f", + "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b", + "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039", + "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e", + "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2", + "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f", + "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b", + "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc", + "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8", + "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522", + "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e", + "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784", + "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a", + "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890", + "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485", + "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545", + "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f", + "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943", + "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878", + "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f", + "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17", + "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7", + "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286", + "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c", + "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb", + "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646", + "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978", + "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8", + "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15", + "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272", + "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2", + "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55", + "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf", + "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545", + "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4", + "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a", + "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804", + "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4", + "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0", + "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a", + "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113", + "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d", + "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25" ], "markers": "python_version >= '3.8'", - "version": "==2.16.1" + "version": "==2.16.2" }, "pyjwt": { "hashes": [ @@ -750,25 +759,25 @@ }, "python-dotenv": { "hashes": [ - "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", - "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], - "version": "==1.0.0" + "version": "==1.0.1" }, "python-multipart": { "hashes": [ - "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132", - "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18" + "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026", + "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215" ], "index": "pypi", - "version": "==0.0.6" + "version": "==0.0.9" }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "version": "==2023.3.post1" + "version": "==2024.1" }, "pyyaml": { "hashes": [ @@ -860,82 +869,82 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", + "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", + "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", + "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", + "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", + "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", + "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", + "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", + "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", + "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", + "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", + "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", + "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", + "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", + "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", + "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", + "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", + "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", + "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", + "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", + "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", + "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", + "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", + "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", + "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", + "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", + "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", + "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", + "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", + "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", + "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", + "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", + "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", + "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", + "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", + "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", + "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", + "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", + "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", + "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", + "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", + "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", + "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", + "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", + "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", + "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", + "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", + "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", + "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" ], "index": "pypi", - "version": "==2.0.25" + "version": "==2.0.27" }, "starlette": { "hashes": [ - "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc", - "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25" + "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044", + "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080" ], "markers": "python_version >= '3.8'", - "version": "==0.35.1" + "version": "==0.36.3" }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", + "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.10.0rc1" }, "tzdata": { "hashes": [ - "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", - "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" ], "markers": "python_version >= '2'", - "version": "==2023.4" + "version": "==2024.1" }, "urllib3": { "hashes": [ @@ -946,13 +955,12 @@ "version": "==1.26.18" }, "uvicorn": { - "extras": [], "hashes": [ - "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24", - "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6" + "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a", + "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4" ], "index": "pypi", - "version": "==0.27.0" + "version": "==0.27.1" }, "uvloop": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index 1b0bfbd9..f6bdbd0e 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -18,48 +18,48 @@ "default": { "awslambdaric": { "hashes": [ - "sha256:06afcf91dc1661ec9695d480d8d1aceb77fc9fb626e1f3c93c8081c009fe01d8", - "sha256:07c3e3b6c8014084430a11a3ea9032fd5863376099b5bdbfaba26928fa36fa61", - "sha256:08140f5a922da004da2ca15322d324d69d4d17de92a0fba875f18ea5a486d854", - "sha256:19f2fd3f3c5e86a91f9dafb3299d52b0b303467444a8399ac10aabf2737d5e1a", - "sha256:1fb1b240208c339105670d5446bd9027b5536b625af3a6e9ec084a828a3c70c5", - "sha256:2b37d3c5e0a0811362cfb88e573d1fcb82c1210c6c9019503bdf8d05dd38285b", - "sha256:33e11996f6c9c259289b631ac76e3093c0e9d7141efcb4265c4c1365d7ed39b9", - "sha256:344cec13462637e35925f520cc34ed3d8d66d72631bce6b4cb10c610f45f6793", - "sha256:4b26ca34724dfa4f8433aaa307d5dac1fdea11c616dd6553977aa7b55a12535e", - "sha256:54214a6a951dba8168c38d8a89a9235dc1cafe5ed995c862dc91a939bd6f8912", - "sha256:67917bf30c23a0d8995818d44b5ce8f79753773b25168a60a6d73aabbb50c120", - "sha256:9363260e0a2194ee47453ba5daad081005d2add0d49016ecdddc55ad67bff773", - "sha256:93d43a9042cccdab1f5419169a0bc0f8765e65d4f356d37ef98959d1ef877794", - "sha256:9e4fb3d95cfe318973a492f267ccf989e428d9fe7a8a861d553c3732d9a84452", - "sha256:a491b65417b1f273fef28f26fe0d108a82b42994c374421ab1afb4417680c15e", - "sha256:bb912bc618cf4acee3e32b8f4c1ff9c3ad372bef3ef737564a6e7d87c05c0878", - "sha256:c8e206aa1b888017a3397e621b32fc1a11999b9c6fc7a92e52f916a862dbbaa1", - "sha256:dd6d1b1dc218366e856728073d63295966aba4a99dc21f0c879b936129aea17b", - "sha256:e727ce87de98391dcd23aede1f294d380813e641819f968ce2053da5c11d1844", - "sha256:e798e8e9264758fe6f9d468e3ae161e578075a1f7412469a81325ee25483578e", - "sha256:ed6c7dc49f9c1bc42a82d6f8c9a68d63ba9056a635f3f15d75c2a97567223300", - "sha256:efa64b8602f44389cda7aa1e4030d4234c3cbe6c17808206761449bd6f106b26", - "sha256:f496941acb3bcdd2988d1a78f0d17eb9fb282b1a6eae1ee3cc105a1d7788da43" + "sha256:038aa61eb897e94a198a1c27213b79848509f43df622238ab2271a20f11d5d39", + "sha256:05070850dad5af71c911a04ccb6c376dbdb7aed6aaba2fb1d09eaff6ebb26b0d", + "sha256:09acc9715f74c994e8688436e4d3c496148fc945c4fe1a28ef1e3b9529453133", + "sha256:173baa4d61cf648d0e580e6e8ebebb212e50e0e0366352ba20daaef63761c9ed", + "sha256:238cdff033edf6182024305224da1bbdb8bfef1207b04e35816a5d5e5516344a", + "sha256:2bb5027d7f2c4f480b039f73a015d41c046037ab341dc1dbb55d8494133304a6", + "sha256:2cb6fa2ad9a34ff9d0a678034fefce286de83f9a55b792af60e79e3ba1d3d71f", + "sha256:2d12e7f096d6bee43e731b75184abdf10f22765824387f6ae3429a480e696b2b", + "sha256:39e8e4579e913a76b580bd22b36af8d808c7b4bb8bf5a2b526f0149edd029e4f", + "sha256:3c3f339f89c6318fe56c1b6d8ef74aadaf486f56746dd1e04f73f83881d32ae5", + "sha256:42c18fccc0079c96a9bdfd219e7d1e736c41b8a44319de3a75ff960523f24696", + "sha256:4465a604de74ffd202d4b891c88228fdfac39a306725fee593c76b4377d847c5", + "sha256:50531d37c4a1737fe3c6540cf0852459cecd4e7a03e4c2791a24bc32db153235", + "sha256:5414c81e6cf088be51a0024e2202e0faf2e9dba2cc247a55e59f4ffc34369bfb", + "sha256:5a11cd06dc29459bf3b9da570af612fcf4dca1060bcfd2b78c36c835a37ae5c1", + "sha256:5eeb3b5294b220d133b569f096ac922e6665811aefefe8e7e4b5d907b1a1bf2b", + "sha256:665b1849fe46e25589835219dc226f77c13fff6c27fc2f34e9e49cb03cf5019a", + "sha256:6afbd60e3a78945bcee586eca4924df4aa3c552065b91a85711cc6771e65a138", + "sha256:6f3ad30165498d4748fffab87b32897fd7f15f67fed7804bfba4ed96a4babf14", + "sha256:9b97da2fe64fb016fa81a88205f8f5e5a9c4a43344c9771b13d94467fdf85b4e", + "sha256:a5e9dce5b5b1ccb809d4386b24f7ea971c8abfd84037f43148db06ecf271c4c5", + "sha256:b62eda8e3a034c692a7b2e589e77bc1d3130121dca2ebb9efea9ce31c14079f6", + "sha256:e6cdab6054fff4fd16c4a3a33a9c4e5aa18ac39f215d0e3a3345d3036cdc418a" ], "index": "pypi", - "version": "==2.0.8" + "version": "==2.0.10" }, "boto3": { "hashes": [ - "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60", - "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106" + "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", + "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" ], "index": "pypi", - "version": "==1.34.24" + "version": "==1.34.46" }, "botocore": { "hashes": [ - "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2", - "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9" + "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", + "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" ], "markers": "python_version >= '3.8'", - "version": "==1.34.24" + "version": "==1.34.46" }, "cffi": { "hashes": [ @@ -116,37 +116,46 @@ "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" ], - "markers": "python_version >= '3.8'", + "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, "cryptography": { "hashes": [ - "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", - "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", - "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", - "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", - "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", - "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", - "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", - "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", - "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", - "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", - "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", - "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", - "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", - "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", - "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", - "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", - "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", - "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", - "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", - "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", - "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", - "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", - "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" + "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", + "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", + "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", + "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", + "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", + "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", + "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", + "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", + "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", + "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", + "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", + "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", + "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", + "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", + "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", + "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", + "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", + "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", + "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", + "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", + "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", + "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", + "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", + "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", + "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", + "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", + "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", + "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", + "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", + "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", + "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" ], "index": "pypi", - "version": "==41.0.7" + "version": "==42.0.4" }, "jmespath": { "hashes": [ From 522c48252c4fea62a27b41cbe2b6fbc78681bdb1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 26 Feb 2024 17:41:00 +0900 Subject: [PATCH 927/962] =?UTF-8?q?fix:=20=E3=82=B9=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=83=9E=E3=82=B7=E3=83=B3=E5=AE=9A=E7=BE=A9=E3=81=AE?= =?UTF-8?q?=E8=AA=A4=E3=82=8A=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../r-export-dbdump-state/r-export-dbdump-state.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json index 248036ea..94ea3d86 100644 --- a/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json +++ b/stepfunctions/r-export-dbdump-state/r-export-dbdump-state.json @@ -9,7 +9,7 @@ "ecs": { "LaunchType": "FARGATE", "Cluster": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:cluster/mbj-newdwh2021-#{ENV_NAME}-export-dbdump-ecs", - "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", + "TaskDefinition": "arn:aws:ecs:#{REGION_AP_NORTHEAST_1}:#{AWS_ACCOUNT_ID}:task-definition/mbj-newdwh2021-#{ENV_NAME}-task-export-dbdump", "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": [ @@ -26,7 +26,7 @@ "Overrides": { "ContainerOverrides": [ { - "Name": "mbj-newdwh2021-#{ENV_NAME}-export-task-dbdump", + "Name": "mbj-newdwh2021-#{ENV_NAME}-container-export-dbdump", "Environment": [ { "Name": "DB_SCHEMA", From 0c000743806bfbb155365e6823f71a5632fd10f2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 26 Feb 2024 18:57:42 +0900 Subject: [PATCH 928/962] =?UTF-8?q?fix:=20DB=E6=8E=A5=E7=B6=9A=E3=82=92?= =?UTF-8?q?=E4=BA=8B=E5=89=8D=E3=81=AB=E8=A1=8C=E3=81=84=E3=80=81=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=82=92=E6=8A=91=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/restore-dbdump/src/restore_backup.py | 40 ++++++++++++++++++------ 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/ecs/restore-dbdump/src/restore_backup.py b/ecs/restore-dbdump/src/restore_backup.py index d047703a..39b92f23 100644 --- a/ecs/restore-dbdump/src/restore_backup.py +++ b/ecs/restore-dbdump/src/restore_backup.py @@ -17,7 +17,7 @@ def exec(): # 事前処理(共通処理としては空振りする) _pre_exec() - #メイン処理 + # メイン処理 # MySQL接続情報を作成する my_cnf_file_content = f""" [client] @@ -34,23 +34,40 @@ def exec(): os.chmod(my_cnf_path, 0o444) + # DBへの接続エラーを早期に検出するため、事前にMySQLサーバーに接続 + mysql_pre_process = subprocess.Popen( + ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", + environment.DB_SCHEMA, '-N', '-e', 'SELECT 1;'], + stderr=subprocess.PIPE + ) + + _, error = mysql_pre_process.communicate() + if mysql_pre_process.returncode != 0: + logger.error( + f'MySQLサーバーへの接続に失敗しました。{"" if error is None else error.decode("utf-8")}') + return constants.BATCH_EXIT_CODE_SUCCESS + # 復元対象のダンプファイルを特定 s3_file_path = environment.DUMP_FILE_S3_PATH # aws s3 cpコマンドを実行してdumpファイルをローカルにダウンロードする - s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) + s3_cp_process = subprocess.Popen( + ['aws', 's3', 'cp', s3_file_path, './dump.gz'], stderr=subprocess.PIPE) _, error = s3_cp_process.communicate() if s3_cp_process.returncode != 0: - logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + logger.error( + f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS # S3コマンドの標準エラーはクローズしておく s3_cp_process.stderr.close() # gzipコマンドを実行してdumpファイルを解凍する - gzip_process = subprocess.Popen(['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + gzip_process = subprocess.Popen( + ['gunzip', '-c', './dump.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # mysqlコマンドを実行し、dumpを復元する mysql_process = subprocess.Popen( - ['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA], + ['mysql', f'--defaults-file={my_cnf_path}', '-P', + f"{environment.DB_PORT}", environment.DB_SCHEMA], stdin=gzip_process.stdout, stderr=subprocess.PIPE ) # gzipの標準出力をmysqlに接続したため、標準出力をクローズする @@ -58,9 +75,10 @@ def exec(): _, error = mysql_process.communicate() if mysql_process.returncode != 0: - logger.error(f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') + logger.error( + f'コマンド実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}') return constants.BATCH_EXIT_CODE_SUCCESS - + # 事後処理(共通処理としては空振りする) _post_exec() @@ -70,19 +88,21 @@ def exec(): except Exception as e: logger.exception(f'ダンプ復元スクリプト中に想定外のエラーが発生しました :{e}') return constants.BATCH_EXIT_CODE_SUCCESS - + + def _pre_exec(): """ ダンプ復元 事前処理 - 共通機能としては事前処理を実装しない。 + 共通機能としては事前処理を実装しない。 事前処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 """ pass + def _post_exec(): """ ダンプ復元 事後処理 - 共通機能としては事後処理を実装しない。 + 共通機能としては事後処理を実装しない。 事後処理が必要なダンプ復元処理を実装する場合、当ロジックをコピーする。 """ pass From 5a71bf972fe74b99faba7350aab6ae40a75c3f26 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 27 Feb 2024 13:41:00 +0900 Subject: [PATCH 929/962] =?UTF-8?q?MSJ=5FPatient=5F=5Fc=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 17 ++++++++++++++++- s3/data/crm/settings/CRM_MSJ_Patient__c.txt | 8 ++++---- s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql | 1 + 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql 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 243b07db..5fc83f7d 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -2659,7 +2659,22 @@ "MSJ_Child_Account_Name__c", "MSJ_Child_Account__c", "MSJ_Parent_Account_Name__c", - "MSJ_Parent_Child_Name__c" + "MSJ_Parent_Child_Name__c", + "MSJ_Age__c", + "MSJ_Comments__c", + "MSJ_Effectiveness_evaluation_date__c", + "MSJ_Gender__c", + "MSJ_Informed_consent__c", + "MSJ_Metastases_location__c", + "MSJ_PS__c", + "MSJ_Scheduled_date_of_informed_consent__c", + "MSJ_Scheduled_start_date_administration__c", + "MSJ_CDX_type__c", + "MSJ_First_line_chemotherapy_efficacy__c", + "MSJ_Num_cycles_of_1st_line_chemotherapy__c", + "MSJ_Primary_site_location__c", + "MSJ_Regimen_of_first_line_chemotherapy__c", + "MSJ_Starting_dose__c" ], "is_skip": false, "is_update_last_fetch_datetime": true diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt index 8f470747..9bf209e6 100644 --- a/s3/data/crm/settings/CRM_MSJ_Patient__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c.txt @@ -4,10 +4,10 @@ utf-8 " CRLF 1 -37 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c +52 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,MSJ_Account_Name__c,MSJ_CRC_Group__c,MSJ_Casus_or_Transfer_Point__c,MSJ_Entry_Date__c,MSJ_IST_Name__c,MSJ_Indication__c,MSJ_Line__c,MSJ_MR_Comments__c,MSJ_MUID__c,MSJ_Medical_Regimen__c,MSJ_Month__c,MSJ_Report_Comments__c,MSJ_Start_Date_Of_Administration__c,MSJ_Year__c,Mobile_ID_vod__c,MSJ_CRC_RAS_KRAS__c,MSJ_End_Date_Of_Administration__c,MSJ_End_Date_of_Stop_Administration__c,MSJ_HN_Hospitalized_Type__c,MSJ_Start_Date_of_Stop_Administration__c,MSJ_Patient_Status__c,MSJ_Patient_TA__c,MSJ_Child_Account_Name__c,MSJ_Child_Account__c,MSJ_Parent_Account_Name__c,MSJ_Parent_Child_Name__c,MSJ_Age__c,MSJ_Comments__c,MSJ_Effectiveness_evaluation_date__c,MSJ_Gender__c,MSJ_Informed_consent__c,MSJ_Metastases_location__c,MSJ_PS__c,MSJ_Scheduled_date_of_informed_consent__c,MSJ_Scheduled_start_date_administration__c,MSJ_CDX_type__c,MSJ_First_line_chemotherapy_efficacy__c,MSJ_Num_cycles_of_1st_line_chemotherapy__c,MSJ_Primary_site_location__c,MSJ_Regimen_of_first_line_chemotherapy__c,MSJ_Starting_dose__c src02c.crm_MSJ_Patient__c org02.crm_MSJ_Patient__c - +CRM_MSJ_Patient__c_ex.sql diff --git a/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql new file mode 100644 index 00000000..161d38ea --- /dev/null +++ b/s3/data/crm/settings/CRM_MSJ_Patient__c_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02c.crm_MSJ_Patient__c', 'SystemModstamp'); From 46140c7818cedb1f876b7d89df81d2d34cfa1156 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 09:55:17 +0900 Subject: [PATCH 930/962] =?UTF-8?q?feature:=20=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=AB=E4=BC=B4=E3=81=84=E3=80=81=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=B7=E3=83=BC=E3=82=B8=E3=83=A3=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._distribution_Call2_Key_Message_vod__c.sql | 26 +++++++++---------- .../crm_distribution_Call2_vod__c.sql | 12 +++++---- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql index 1829fdc1..ca8ab659 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql @@ -40,20 +40,20 @@ START TRANSACTION; -- UPSERT STATEMENT設定 SET @upsert_statement_base = 'INSERT INTO $$distribution_schema$$.crm_Call2_Key_Message_vod__c - (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, - MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, - Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, - Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, - Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, + (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, + Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, + Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, + Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) SELECT - Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, - MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, - Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, - Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, - Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, + Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, + MayEdit, IsLocked, Account_vod__c, Call2_vod__c, Reaction_vod__c, Product_vod__c, Key_Message_vod__c, + Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, + Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, + Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c,Share_Channel_vod__c medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date FROM internal02.crm_Call2_Key_Message_vod__c AS internaltb @@ -76,7 +76,7 @@ SET @upsert_statement_base = Entity_Reference_Id_vod__c = internaltb.Entity_Reference_Id_vod__c, Segment_vod__c = internaltb.Segment_vod__c, Display_Order_vod__c = internaltb.Display_Order_vod__c, Clm_Presentation_Name_vod__c = internaltb.Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c = internaltb.Clm_Presentation_Version_vod__c, - Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c, + Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c,Share_Channel_vod__c medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql index e76a10e8..855377e4 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql @@ -73,7 +73,7 @@ SET @upsert_statement_base = Location_Services_Status_vod__c, MSJ_Double_Visit_Other__c, MSJ_Comment__c, MSJ_For_Reporting__c, MSJ_Number_of_Attendees__c, MSJ_Main_Dept__c, Planned_Type_vjh__c, Cobrowse_URL_Participant_vod__c, MSJ_Activity_Method_Text__c, MSJ_Activity_Method__c, MSJ_Classification__c, MSJ_Double_Visit_MSL__c, - MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, + MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, Suggestion_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, MSJ_Patient_Follow__c, Child_Account_Id_vod__c, Child_Account_vod__c, Location_Id_vod__c, Location_Name_vod__c, MSJ_Comments_about_technology__c, Remote_Meeting_vod__c, Veeva_Remote_Meeting_Id_vod__c, MSJ_Activity_Type_Report__c, MSJ_Activity_Type__c, MSJ_Activity__c, MSJ_Comments__c, MSJ_Therapy__c, MSJ_Time_Hrs__c, EMDS_CO_Reference__c, @@ -83,7 +83,8 @@ SET @upsert_statement_base = MSJ_SIPAGL_1A__c, MSJ_SIPAGL_1B__c, MSJ_SIPAGL_2__c, MSJ_SIPAGL_3__c, MSJ_SIPAGL_4A__c, MSJ_SIPAGL_5A__c, MSJ_SIPAGL_comment__c, MSJ_SIPAGL_4B__c, MSJ_SIPAGL_5B__c, Location_Text_vod__c, Call_Channel_vod__c, MSJ_Scientific_Interaction__c, MSJ_Activity_Email_Reply__c, MSJ_Interaction_Duration__c, MSJ_SIPAGL_1A_date__c, - MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) + MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, Meeting_Request_vod__c, Phone_vod__c, Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c, + file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) SELECT Id, OwnerId, IsDeleted, Name, RecordTypeId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, LastActivityDate, MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Call_Comments_vod__c, @@ -118,7 +119,7 @@ SET @upsert_statement_base = Location_Services_Status_vod__c, MSJ_Double_Visit_Other__c, MSJ_Comment__c, MSJ_For_Reporting__c, MSJ_Number_of_Attendees__c, MSJ_Main_Dept__c, Planned_Type_vjh__c, Cobrowse_URL_Participant_vod__c, MSJ_Activity_Method_Text__c, MSJ_Activity_Method__c, MSJ_Classification__c, MSJ_Double_Visit_MSL__c, - MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, + MSJ_MSL_Comment_for_MR__c, MSJ_APD__c, Medical_Inquiry_vod__c, Suggestion_vod__c, MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c, MSJ_Patient_Follow__c, Child_Account_Id_vod__c, Child_Account_vod__c, Location_Id_vod__c, Location_Name_vod__c, MSJ_Comments_about_technology__c, Remote_Meeting_vod__c, Veeva_Remote_Meeting_Id_vod__c, MSJ_Activity_Type_Report__c, MSJ_Activity_Type__c, MSJ_Activity__c, MSJ_Comments__c, MSJ_Therapy__c, MSJ_Time_Hrs__c, EMDS_CO_Reference__c, @@ -128,7 +129,8 @@ SET @upsert_statement_base = MSJ_SIPAGL_1A__c, MSJ_SIPAGL_1B__c, MSJ_SIPAGL_2__c, MSJ_SIPAGL_3__c, MSJ_SIPAGL_4A__c, MSJ_SIPAGL_5A__c, MSJ_SIPAGL_comment__c, MSJ_SIPAGL_4B__c, MSJ_SIPAGL_5B__c, Location_Text_vod__c, Call_Channel_vod__c, MSJ_Scientific_Interaction__c, MSJ_Activity_Email_Reply__c, MSJ_Interaction_Duration__c, MSJ_SIPAGL_1A_date__c, - MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date + MSJ_CoPromotion__c, Call_Channel_Formula_vod__c, Meeting_Request_vod__c, Phone_vod__c, Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c, + file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date FROM internal02.crm_Call2_vod__c AS internaltb WHERE @@ -271,4 +273,4 @@ END LOOP; CLOSE table_cursor; COMMIT; -END \ No newline at end of file +END From 421b360a560896cd2c78644e50bf96aac258c47e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:03:10 +0900 Subject: [PATCH 931/962] =?UTF-8?q?feat:=20=E4=BF=AE=E6=AD=A3=E6=BC=8F?= =?UTF-8?q?=E3=82=8C=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm_distribution_Call2_Key_Message_vod__c.sql | 6 +++--- .../internal02/crm_distribution_Call2_vod__c.sql | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql index ca8ab659..40a480a7 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql @@ -45,7 +45,7 @@ SET @upsert_statement_base = Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) SELECT Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, @@ -53,7 +53,7 @@ SET @upsert_statement_base = Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c,Share_Channel_vod__c + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date FROM internal02.crm_Call2_Key_Message_vod__c AS internaltb @@ -76,7 +76,7 @@ SET @upsert_statement_base = Entity_Reference_Id_vod__c = internaltb.Entity_Reference_Id_vod__c, Segment_vod__c = internaltb.Segment_vod__c, Display_Order_vod__c = internaltb.Display_Order_vod__c, Clm_Presentation_Name_vod__c = internaltb.Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c = internaltb.Clm_Presentation_Version_vod__c, - Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c,Share_Channel_vod__c + Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c, Share_Channel_vod__c = internaltb.Share_Channel_vod__c medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql index 855377e4..414ea7c7 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql @@ -218,7 +218,7 @@ SET @upsert_statement_base = Cobrowse_URL_Participant_vod__c = internaltb.Cobrowse_URL_Participant_vod__c, MSJ_Activity_Method_Text__c = internaltb.MSJ_Activity_Method_Text__c, MSJ_Activity_Method__c = internaltb.MSJ_Activity_Method__c, MSJ_Classification__c = internaltb.MSJ_Classification__c, MSJ_Double_Visit_MSL__c = internaltb.MSJ_Double_Visit_MSL__c, MSJ_MSL_Comment_for_MR__c = internaltb.MSJ_MSL_Comment_for_MR__c, - MSJ_APD__c = internaltb.MSJ_APD__c, Medical_Inquiry_vod__c = internaltb.Medical_Inquiry_vod__c, + MSJ_APD__c = internaltb.MSJ_APD__c, Medical_Inquiry_vod__c = internaltb.Medical_Inquiry_vod__c, Suggestion_vod__c = internaltb.Suggestion_vod__c, MSJ_Call_Type_MSJ__c = internaltb.MSJ_Call_Type_MSJ__c, MSJ_Prescription_Request__c = internaltb.MSJ_Prescription_Request__c, MSJ_Patient_Follow__c = internaltb.MSJ_Patient_Follow__c, Child_Account_Id_vod__c = internaltb.Child_Account_Id_vod__c, Child_Account_vod__c = internaltb.Child_Account_vod__c, Location_Id_vod__c = internaltb.Location_Id_vod__c, @@ -243,8 +243,10 @@ SET @upsert_statement_base = MSJ_Activity_Email_Reply__c = internaltb.MSJ_Activity_Email_Reply__c, MSJ_Interaction_Duration__c = internaltb.MSJ_Interaction_Duration__c, MSJ_SIPAGL_1A_date__c = internaltb.MSJ_SIPAGL_1A_date__c, MSJ_CoPromotion__c = internaltb.MSJ_CoPromotion__c, - Call_Channel_Formula_vod__c = internaltb.Call_Channel_Formula_vod__c, file_name = internaltb.file_name, - file_row_cnt = internaltb.file_row_cnt, + Call_Channel_Formula_vod__c = internaltb.Call_Channel_Formula_vod__c, + Meeting_Request_vod__c = internaltb.Meeting_Request_vod__c, Phone_vod__c = internaltb.Phone_vod__c, + Detail_Section_Attribute_vod__c = internaltb.Detail_Section_Attribute_vod__c, Remote_Meeting_Type_vod__c = internaltb.Remote_Meeting_Type_vod__c, + file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; OPEN table_cursor; From 10b57c1d354495f8e54f91e4159e64031db7c98d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:06:18 +0900 Subject: [PATCH 932/962] =?UTF-8?q?style:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E6=94=B9=E8=A1=8C=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal02/crm_distribution_Call2_vod__c.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql index 414ea7c7..c5f8c00d 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_vod__c.sql @@ -275,4 +275,4 @@ END LOOP; CLOSE table_cursor; COMMIT; -END +END \ No newline at end of file From 3e6d4e8f0f5377ef647331d7269e784fb0b577b5 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:33:05 +0900 Subject: [PATCH 933/962] =?UTF-8?q?fix:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3=E3=80=82=E3=82=AB?= =?UTF-8?q?=E3=83=B3=E3=83=9E=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm_distribution_Call2_Key_Message_vod__c.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql index 40a480a7..43feb28f 100644 --- a/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql +++ b/rds_mysql/stored_procedure/internal02/crm_distribution_Call2_Key_Message_vod__c.sql @@ -45,7 +45,7 @@ SET @upsert_statement_base = Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c, medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date) SELECT Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, @@ -53,7 +53,7 @@ SET @upsert_statement_base = Mobile_ID_vod__c, Contact_vod__c, Call_Date_vod__c, User_vod__c, Category_vod__c, Vehicle_vod__c, Is_Parent_Call_vod__c, Override_Lock_vod__c, CLM_ID_vod__c, Slide_Version_vod__c, Duration_vod__c, Presentation_ID_vod__c, Start_Time_vod__c, Attendee_Type_vod__c, Entity_Reference_Id_vod__c, Segment_vod__c, - Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c + Display_Order_vod__c, Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c, Clm_Presentation_vod__c, Share_Channel_vod__c, medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date FROM internal02.crm_Call2_Key_Message_vod__c AS internaltb @@ -76,7 +76,7 @@ SET @upsert_statement_base = Entity_Reference_Id_vod__c = internaltb.Entity_Reference_Id_vod__c, Segment_vod__c = internaltb.Segment_vod__c, Display_Order_vod__c = internaltb.Display_Order_vod__c, Clm_Presentation_Name_vod__c = internaltb.Clm_Presentation_Name_vod__c, Clm_Presentation_Version_vod__c = internaltb.Clm_Presentation_Version_vod__c, - Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c, Share_Channel_vod__c = internaltb.Share_Channel_vod__c + Clm_Presentation_vod__c = internaltb.Clm_Presentation_vod__c, Share_Channel_vod__c = internaltb.Share_Channel_vod__c, medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id, file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; From 86f3783d67752715d7624ac7b683067bc54befd7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:37:53 +0900 Subject: [PATCH 934/962] =?UTF-8?q?feat:=20=E5=8F=96=E5=BE=97=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E4=BF=AE=E6=AD=A3=E3=80=82=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E5=88=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 119 +++++++++++++++--- 1 file changed, 105 insertions(+), 14 deletions(-) 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 5fc83f7d..f3275a2f 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -38,6 +38,7 @@ "Clm_Presentation_Name_vod__c", "Clm_Presentation_Version_vod__c", "Clm_Presentation_vod__c", + "Share_Channel_vod__c", "Call2_vod__r.RecordTypeId" ], "is_skip": false, @@ -228,6 +229,7 @@ "MSJ_MSL_Comment_for_MR__c", "MSJ_APD__c", "Medical_Inquiry_vod__c", + "Suggestion_vod__c", "MSJ_Call_Type_MSJ__c", "MSJ_Prescription_Request__c", "MSJ_Patient_Follow__c", @@ -275,7 +277,11 @@ "MSJ_Interaction_Duration__c", "MSJ_SIPAGL_1A_date__c", "MSJ_CoPromotion__c", - "Call_Channel_Formula_vod__c" + "Call_Channel_Formula_vod__c", + "Meeting_Request_vod__c", + "Phone_vod__c", + "Detail_Section_Attribute_vod__c", + "Remote_Meeting_Type_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -546,7 +552,13 @@ "MSJ_Next_Week_Action_Who_MCC__c", "MSJ_Next_Week_Action_What_MCC__c", "MSJ_Next_Week_Action_When_MCC__c", - "MSJ_Target_Patient_Count_MCC__c" + "MSJ_Target_Patient_Count_MCC__c", + "MSJ_Activity_Results_Summary_LC__c", + "MSJ_Next_Week_Action_Where_LC__c", + "MSJ_Next_Week_Action_Who_LC__c", + "MSJ_Next_Week_Action_What_LC__c", + "MSJ_Next_Week_Action_When_LC__c", + "MSJ_Target_Patient_Count_LC__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -611,7 +623,11 @@ "Position_vod__c", "Talk_Title_vod__c", "MSJ_Attendee_Reaction__c", - "MSJ_Registration__c" + "MSJ_Registration__c", + "MSJ_DirectMail_Status__c", + "EM_Event_Team_Member_vod__c", + "Group_Name_vod__c", + "Role_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1177,6 +1193,7 @@ "PermissionsEditPublicFilters", "PermissionsEditPublicTemplates", "PermissionsModifyAllData", + "PermissionsEditBillingInfo", "PermissionsManageCases", "PermissionsManageSolutions", "PermissionsCustomizeApplication", @@ -1222,6 +1239,7 @@ "PermissionsViewContent", "PermissionsManageEmailClientConfig", "PermissionsEnableNotifications", + "PermissionsIsSsoEnabled", "PermissionsManageDataIntegrations", "PermissionsDistributeFromPersWksp", "PermissionsViewDataCategories", @@ -1304,6 +1322,7 @@ "PermissionsManageSandboxes", "PermissionsAutomaticActivityCapture", "PermissionsImportCustomObjects", + "PermissionsSalesforceIQInbox", "PermissionsDelegatedTwoFactor", "PermissionsSelectFilesFromSalesforce", "PermissionsModerateNetworkUsers", @@ -1345,9 +1364,12 @@ "PermissionsApexRestServices", "PermissionsEnableCommunityAppLauncher", "PermissionsGiveRecognitionBadge", + "PermissionsAllowObjectDetection", + "PermissionsSalesforceIQInternal", "PermissionsUseMySearch", "PermissionsLtngPromoReserved01UserPerm", "PermissionsManageSubscriptions", + "PermissionsAllowObjectDetectionTraining", "PermissionsManageSurveys", "PermissionsUseAssistantDialog", "PermissionsUseQuerySuggestions", @@ -1377,6 +1399,7 @@ "PermissionsSkipIdentityConfirmation", "PermissionsSendCustomNotifications", "PermissionsPackaging2Delete", + "PermissionsViewRestrictionAndScopingRules", "PermissionsFSCComprehensiveUserAccess", "PermissionsManageTrustMeasures", "PermissionsViewTrustMeasures", @@ -1388,8 +1411,18 @@ "PermissionsManageExternalConnections", "PermissionsAIViewInsightObjects", "PermissionsAICreateInsightObjects", + "PermissionsViewMLModels", "PermissionsNativeWebviewScrolling", "PermissionsViewDeveloperName", + "PermissionsBypassMFAForUiLogins", + "PermissionsClientSecretRotation", + "PermissionsUpdateReportTypeReferences", + "PermissionsAccessToServiceProcess", + "PermissionsManageOrchInstsAndWorkItems", + "PermissionsCMSECEAuthoringAccess", + "PermissionsEnableIPFSUpload", + "PermissionsEnableBCTransactionPolling", + "PermissionsFSCArcGraphCommunityUser", "Type", "UserLicenseId", "UserType", @@ -1398,6 +1431,7 @@ "LastModifiedDate", "LastModifiedById", "SystemModstamp", + "IsSsoEnabled", "Description", "LastViewedDate", "LastReferencedDate" @@ -1473,7 +1507,15 @@ "MSJ_Sent_Date__c", "MSJ_Email_Subject__c", "MSJ_Opens__c", - "MSJ_Email_Status__c" + "MSJ_Email_Status__c", + "MSJ_Activity_Name__c", + "MSJ_Asset__c", + "MSJ_CIAM_Account__c", + "MSJ_Channel__c", + "MSJ_Content__c", + "MSJ_Registration_Time__c", + "MSJ_Related_External_Account_Data__c", + "MSJ_Tag_Id__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1602,7 +1644,9 @@ "MSJ_MSL_Support__c", "MSJ_Material_Requirement__c", "MSJ_Hospital_Name_Disp__c", - "MSJ_Hospital__c" + "MSJ_Hospital__c", + "MSJ_Chatbot_Check__c", + "MSJ_File_Attached__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -1747,8 +1791,9 @@ "UserPreferencesShowStateToGuestUsers", "UserPreferencesShowPostalCodeToGuestUsers", "UserPreferencesShowCountryToGuestUsers", - "UserPreferencesHideInvoicesRedirectConfirmation", - "UserPreferencesHideStatementsRedirectConfirmation", + "UserPreferencesShowForecastingChangeSignals", + // "UserPreferencesHideInvoicesRedirectConfirmation", + // "UserPreferencesHideStatementsRedirectConfirmation", "UserPreferencesPathAssistantCollapsed", "UserPreferencesCacheDiagnostics", "UserPreferencesShowEmailToGuestUsers", @@ -1779,6 +1824,9 @@ "UserPreferencesSRHOverrideActivities", "UserPreferencesNewLightningReportRunPageEnabled", "UserPreferencesReverseOpenActivitiesView", + "UserPreferencesHasSentWarningEmail", + "UserPreferencesHasSentWarningEmail238", + "UserPreferencesHasSentWarningEmail240", "UserPreferencesHideBrowseProductRedirectConfirmation", "UserPreferencesHideOnlineSalesAppWelcomeMat", "ContactId", @@ -1852,7 +1900,21 @@ "Last_CRMDesktop_Mac_Version_vod__c", "Last_CRMDesktop_Windows_Sync_vod__c", "Last_CRMDesktop_Windows_Version_vod__c", - "MSJ_Test_User__c" + "MSJ_Test_User__c", + "Last_Android_Connect_Version_vod__c", + "Last_Android_Connect_vod__c", + "Last_Android_OS_Version_vod__c", + "Last_Android_Sync_vod__c", + "Last_CRMDesktop_Mac_Conn_Ver_vod__c", + "Last_CRMDesktop_Mac_Connect_vod__c", + "Last_CRMDesktop_Windows_Conn_Ver_vod__c", + "Last_CRMDesktop_Windows_Connect_vod__c", + "MS_Graph_API_Authorized_vod__c", + "MS_Outlook_Last_Pull_Activity_vod__c", + "MS_Outlook_Last_Push_Activity_vod__c", + "Enable_MS_Outlook_Calendar_vod__c", + "Last_iPad_Updates_Applied_vod__c", + "Last_iPhone_Updates_Applied_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2190,6 +2252,24 @@ "MSJ_Marketing_Cloud4__c", "MSJ_Medical_Department__c", "MSJ_Marketing_Cloud0__c", + "MSJ_CIAM_Number__c", + "MSJ_sID__c", + "MSJ_Application_Materials_Deadline__c", + "MSJ_DI_Person__c", + "MSJ_Pharmaceutical_Department_Memo__c", + "MSJ_Pharmaceutical_Examination_Date__c", + "MSJ_Pharmaceutical_Examination_Member__c", + "MSJ_Pharmaceutical_Examination_Rule_Memo__c", + "MSJ_Pharmaceutical_Examination_Rule__c", + "MSJ_Pharmacy_Director__c", + "MSJ_Visit_Regulation__c", + "MSJ_18_Digit_Salesforce_Id__c", + "MSJ_Clinical_Trial_Count__c", + "MSJ_Congresses_Count__c", + "MSJ_Deletion_H1__c", + "MSJ_External_Link_To_Full_H1_Profile__c", + "MSJ_Industry_Payments_Amount__c", + "MSJ_Publication_Count__c", "Mobile_ID_vod__pc", "H1Insights__H1_NPI_Value_for_Testing__pc", "H1Insights__H1_Person_ID__pc", @@ -2327,7 +2407,8 @@ "zvod_Consent_Line_vod__c", "zvod_Signature_Capture_vod__c", "Double_Opt_In_vod__c", - "zvod_Consent_Activity_Tracking_vod__c" + "zvod_Consent_Activity_Tracking_vod__c", + "MSJ_Channel_Type__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2442,7 +2523,12 @@ "MSJ_MSL_Support__c", "MSJ_Handover_Comment__c", "MSJ_Handover_Email__c", - "MSJ_Material_Requirement__c" + "MSJ_Material_Requirement__c", + "MSJ_Material_Used__c", + "MSJ_File_Attached__c", + "MSJ_Off_Label__c", + "MSJ_Include_Quality_Complaint__c", + "MSJ_PSC__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2502,7 +2588,8 @@ "Bcc_vod__c", "Audience_vod__c", "WeChat_Template_ID_vod__c", - "Check_Consent_vod__c" + "Check_Consent_vod__c", + "Publish_Method_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2566,7 +2653,9 @@ "MSJ_Target_Call_Num__c", "MSJ_Tech_segment__c", "MSJ_Title__c", - "MSJ_XLK_Segment__c" + "MSJ_XLK_Segment__c", + "MSJ_Main_Treatment_Plan__c", + "MSJ_Optimal_Visiting_Hours__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -2734,7 +2823,8 @@ "MSJ_Global_Brand__c", "MSJ_Global_Business_Unit__c", "MSJ_Molecules__c", - "MSJ_SBU__c" + "MSJ_SBU__c", + "MSJ_Local_Business_Unit__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -3037,7 +3127,8 @@ "Activity_Tracking_Mode_vod__c", "Email_Source_vod__c", "Subject_vod__c", - "User_Input_Text_vod__c" + "User_Input_Text_vod__c", + "Email_Group_Id_vod__c" ], "is_skip": false, "is_update_last_fetch_datetime": true From b42e88b754a895b4159aa00965055d07fceeba0f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:45:53 +0900 Subject: [PATCH 935/962] =?UTF-8?q?feat:=20=E5=B7=AE=E5=88=86=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E8=A8=AD=E5=AE=9A=E4=BF=AE=E6=AD=A3=E3=80=82=E9=A0=86?= =?UTF-8?q?=E5=BA=8F=E5=A4=89=E6=9B=B4=E3=81=AE=E3=81=BF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) 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 f3275a2f..dca967d4 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -409,11 +409,11 @@ "Description_vod__c", "Keywords_vod__c", "Content_Channel_vod__c", - "original_material_approved_in_veritas__c", - "keywords__c", - "trade_team__c", + "business_function__c", "ewizard_link__c", - "business_function__c" + "keywords__c", + "original_material_approved_in_veritas__c", + "trade_team__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -499,18 +499,18 @@ "MSJ_Hospital_ID__c", "MSJ_Hospital_Name__c", "MSJ_Hospital__c", - "MSJ_Type_of_Insight__c", - "MSJ_Therapeutic_Area__c", - "MSJ_Starred_Insight__c", - "MSJ_Disclaimer__c", - "MSJ_Not_pharmacovigilance_related__c", "MSJ_Approval_Status__c", - "MSJ_Insight_Owner_Sharing__c", "MSJ_Description_J__c", - "MSJ_Summary_J__c", + "MSJ_Disclaimer__c", + "MSJ_HighlightPanel_Display_J__c", + "MSJ_Insight_Owner_Sharing__c", "MSJ_Level_1J__c", - "MSJ_Level_2J__c", - "MSJ_HighlightPanel_Display_J__c" + "MSJ_Not_pharmacovigilance_related__c", + "MSJ_Starred_Insight__c", + "MSJ_Summary_J__c", + "MSJ_Therapeutic_Area__c", + "MSJ_Type_of_Insight__c", + "MSJ_Level_2J__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -948,12 +948,12 @@ "MSJ_SK_10__c", "MSJ_Specific_Action__c", "MSJ_Training_Point__c", - "MSJ_Efforts_of_Year__c", - "MSJ_Efforts_of_Month__c", - "MSJ_Skill_Task__c", - "MSJ_Action_of_This_Month__c", "MSJ_Achievement_of_This_Month__c", - "MSJ_Comment_from_AM__c" + "MSJ_Action_of_This_Month__c", + "MSJ_Comment_from_AM__c", + "MSJ_Efforts_of_Month__c", + "MSJ_Efforts_of_Year__c", + "MSJ_Skill_Task__c" ], "is_skip": false, "is_update_last_fetch_datetime": true @@ -3181,8 +3181,8 @@ "Title_vod__c", "Suggestion_Survey_vod__c", "Category_vod__c", - "MSJ_Reason_unformatted__c", "MSJ_Data_Id__c", + "MSJ_Reason_unformatted__c", "MSJ_reason_id__c" ], "is_skip": false, @@ -3299,11 +3299,11 @@ "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", + "Followup_Activity_Type_vod__c", "MSJ_Visit_Type__c" ], "is_skip": false, @@ -3356,11 +3356,11 @@ "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", + "Followup_Activity_Type_vod__c", "MSJ_Visit_Type__c" ], "is_skip": false, From 3b8abba545189b24a6e0ddd447c14c37d3956a73 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:54:43 +0900 Subject: [PATCH 936/962] =?UTF-8?q?feat:=20=E5=B7=AE=E5=88=86=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E8=A8=AD=E5=AE=9A=E4=BF=AE=E6=AD=A3=E3=80=82=E6=96=B0?= =?UTF-8?q?=E8=A6=8F=E8=BF=BD=E5=8A=A0=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=887=E3=81=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 146 +++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) 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 dca967d4..305196eb 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3460,6 +3460,150 @@ ], "is_skip": false, "is_update_last_fetch_datetime": true - } + }, + [ + { + "object_name": "ProcessDefinition", + "columns": [ + "Id", + "Name", + "DeveloperName", + "Type", + "Description", + "TableEnumOrId", + "LockType", + "State", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstance", + "columns": [ + "Id", + "ProcessDefinitionId", + "TargetObjectId", + "Status", + "CompletedDate", + "LastActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "SubmittedById", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceStep", + "columns": [ + "Id", + "ProcessInstanceId", + "StepStatus", + "OriginalActorId", + "ActorId", + "Comments", + "StepNodeId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceNode", + "columns": [ + "Id", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "ProcessInstanceId", + "ProcessNodeId", + "NodeStatus", + "CompletedDate", + "LastActorId", + "ProcessNodeName", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessNode", + "columns": [ + "Id", + "Name", + "DeveloperName", + "ProcessDefinitionId", + "Description", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceWorkitem", + "columns": [ + "Id", + "ProcessInstanceId", + "OriginalActorId", + "ActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "IsDeleted", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Directory_vod__c", + "columns": [ + "Id", + "OwnerId", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Display_Order_vod__c", + "External_ID_vod__c", + "Level_vod__c", + "Parent_Directory_vod__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + } + ] ] } From 4e1ab7808e75fda3cc9201cc28261a81fbbaf2f7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 10:56:16 +0900 Subject: [PATCH 937/962] =?UTF-8?q?fix:=20=E3=83=AA=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=97=E3=81=BE=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_diff.json | 286 +++++++++--------- 1 file changed, 142 insertions(+), 144 deletions(-) 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 305196eb..f8ff04da 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -3461,149 +3461,147 @@ "is_skip": false, "is_update_last_fetch_datetime": true }, - [ - { - "object_name": "ProcessDefinition", - "columns": [ - "Id", - "Name", - "DeveloperName", - "Type", - "Description", - "TableEnumOrId", - "LockType", - "State", - "CreatedDate", - "CreatedById", - "LastModifiedDate", - "LastModifiedById", - "SystemModstamp" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "ProcessInstance", - "columns": [ - "Id", - "ProcessDefinitionId", - "TargetObjectId", - "Status", - "CompletedDate", - "LastActorId", - "ElapsedTimeInDays", - "ElapsedTimeInHours", - "ElapsedTimeInMinutes", - "SubmittedById", - "IsDeleted", - "CreatedDate", - "CreatedById", - "LastModifiedDate", - "LastModifiedById", - "SystemModstamp" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "ProcessInstanceStep", - "columns": [ - "Id", - "ProcessInstanceId", - "StepStatus", - "OriginalActorId", - "ActorId", - "Comments", - "StepNodeId", - "ElapsedTimeInDays", - "ElapsedTimeInHours", - "ElapsedTimeInMinutes", - "CreatedDate", - "CreatedById", - "SystemModstamp" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "ProcessInstanceNode", - "columns": [ - "Id", - "IsDeleted", - "CreatedDate", - "CreatedById", - "LastModifiedDate", - "LastModifiedById", - "SystemModstamp", - "ProcessInstanceId", - "ProcessNodeId", - "NodeStatus", - "CompletedDate", - "LastActorId", - "ProcessNodeName", - "ElapsedTimeInDays", - "ElapsedTimeInHours", - "ElapsedTimeInMinutes" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "ProcessNode", - "columns": [ - "Id", - "Name", - "DeveloperName", - "ProcessDefinitionId", - "Description", - "SystemModstamp" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "ProcessInstanceWorkitem", - "columns": [ - "Id", - "ProcessInstanceId", - "OriginalActorId", - "ActorId", - "ElapsedTimeInDays", - "ElapsedTimeInHours", - "ElapsedTimeInMinutes", - "IsDeleted", - "CreatedDate", - "CreatedById", - "SystemModstamp" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - }, - { - "object_name": "Directory_vod__c", - "columns": [ - "Id", - "OwnerId", - "IsDeleted", - "Name", - "RecordTypeId", - "CreatedDate", - "CreatedById", - "LastModifiedDate", - "LastModifiedById", - "SystemModstamp", - "MayEdit", - "IsLocked", - "LastViewedDate", - "LastReferencedDate", - "Display_Order_vod__c", - "External_ID_vod__c", - "Level_vod__c", - "Parent_Directory_vod__c" - ], - "is_skip": false, - "is_update_last_fetch_datetime": true - } - ] + { + "object_name": "ProcessDefinition", + "columns": [ + "Id", + "Name", + "DeveloperName", + "Type", + "Description", + "TableEnumOrId", + "LockType", + "State", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstance", + "columns": [ + "Id", + "ProcessDefinitionId", + "TargetObjectId", + "Status", + "CompletedDate", + "LastActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "SubmittedById", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceStep", + "columns": [ + "Id", + "ProcessInstanceId", + "StepStatus", + "OriginalActorId", + "ActorId", + "Comments", + "StepNodeId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceNode", + "columns": [ + "Id", + "IsDeleted", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "ProcessInstanceId", + "ProcessNodeId", + "NodeStatus", + "CompletedDate", + "LastActorId", + "ProcessNodeName", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessNode", + "columns": [ + "Id", + "Name", + "DeveloperName", + "ProcessDefinitionId", + "Description", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "ProcessInstanceWorkitem", + "columns": [ + "Id", + "ProcessInstanceId", + "OriginalActorId", + "ActorId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "IsDeleted", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + }, + { + "object_name": "Directory_vod__c", + "columns": [ + "Id", + "OwnerId", + "IsDeleted", + "Name", + "RecordTypeId", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp", + "MayEdit", + "IsLocked", + "LastViewedDate", + "LastReferencedDate", + "Display_Order_vod__c", + "External_ID_vod__c", + "Level_vod__c", + "Parent_Directory_vod__c" + ], + "is_skip": false, + "is_update_last_fetch_datetime": true + } ] } From 60703222af341a6954e29fe9e89bb0a0f8e5930f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 11:48:19 +0900 Subject: [PATCH 938/962] =?UTF-8?q?feat:=20=E5=85=A8=E4=BB=B6=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E8=A8=AD=E5=AE=9A=E4=BF=AE=E6=AD=A3=E3=80=82=E6=96=B0?= =?UTF-8?q?=E8=A6=8F=E8=BF=BD=E5=8A=A0=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=883=E3=81=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crm/object_info/crm_object_list_all.json | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/s3/config/crm/object_info/crm_object_list_all.json b/s3/config/crm/object_info/crm_object_list_all.json index cfd70934..b12b0a94 100644 --- a/s3/config/crm/object_info/crm_object_list_all.json +++ b/s3/config/crm/object_info/crm_object_list_all.json @@ -104,6 +104,65 @@ "datetime_column": "LastModifiedDate", "last_fetch_datetime_file_name": "AccountShare_ALL.json", "upload_file_name": "CRM_AccountShare_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessDefinition", + "columns": [ + "Id", + "Name", + "DeveloperName", + "Type", + "Description", + "TableEnumOrId", + "LockType", + "State", + "CreatedDate", + "CreatedById", + "LastModifiedDate", + "LastModifiedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessDefinition_ALL.json", + "upload_file_name": "CRM_ProcessDefinition_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessInstanceStep", + "columns": [ + "Id", + "ProcessInstanceId", + "StepStatus", + "OriginalActorId", + "ActorId", + "Comments", + "StepNodeId", + "ElapsedTimeInDays", + "ElapsedTimeInHours", + "ElapsedTimeInMinutes", + "CreatedDate", + "CreatedById", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessInstanceStep_ALL.json", + "upload_file_name": "CRM_ProcessInstanceStep_ALL_{execute_datetime}" + }, + { + "object_name": "ProcessNode", + "columns": [ + "Id", + "Name", + "DeveloperName", + "ProcessDefinitionId", + "Description", + "SystemModstamp" + ], + "is_skip": false, + "is_update_last_fetch_datetime": false, + "last_fetch_datetime_file_name": "ProcessNode_ALL.json", + "upload_file_name": "CRM_ProcessNode_ALL_{execute_datetime}" } ] } From 6f10368c2dd3b01f6aae2c03e38a3849b891dbe6 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 13:50:58 +0900 Subject: [PATCH 939/962] =?UTF-8?q?feat:=20=E6=9C=80=E7=B5=82=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E6=97=A5=E6=99=82=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20=E5=B7=AE=E5=88=867=E6=9C=AC+,?= =?UTF-8?q?=E5=85=A8=E4=BB=B63=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/last_fetch_datetime/Directory_vod__c.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessDefinition.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessInstance.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json | 4 ++++ .../crm/last_fetch_datetime/ProcessInstanceStep_ALL.json | 4 ++++ .../crm/last_fetch_datetime/ProcessInstanceWorkitem.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessNode.json | 4 ++++ s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json | 4 ++++ 10 files changed, 40 insertions(+) create mode 100644 s3/config/crm/last_fetch_datetime/Directory_vod__c.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessDefinition.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessInstance.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessNode.json create mode 100644 s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json diff --git a/s3/config/crm/last_fetch_datetime/Directory_vod__c.json b/s3/config/crm/last_fetch_datetime/Directory_vod__c.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/Directory_vod__c.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessDefinition.json b/s3/config/crm/last_fetch_datetime/ProcessDefinition.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessDefinition.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessDefinition_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstance.json b/s3/config/crm/last_fetch_datetime/ProcessInstance.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstance.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceNode.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceStep_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json b/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessInstanceWorkitem.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessNode.json b/s3/config/crm/last_fetch_datetime/ProcessNode.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessNode.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} diff --git a/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json b/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json new file mode 100644 index 00000000..7453dc17 --- /dev/null +++ b/s3/config/crm/last_fetch_datetime/ProcessNode_ALL.json @@ -0,0 +1,4 @@ +{ + "last_fetch_datetime_from": "1900-01-01T00:00:00.000Z", + "last_fetch_datetime_to": "" +} From 3844088570e274928253dd7b53973754f3a3f8d9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 14:54:28 +0900 Subject: [PATCH 940/962] =?UTF-8?q?feat:=20=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E5=80=8B=E5=88=A5=E8=A8=AD=E5=AE=9A=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E4=BF=AE=E6=AD=A3=20=E6=96=B0?= =?UTF-8?q?=E8=A6=8F=E3=82=AB=E3=83=A9=E3=83=A0=E8=BF=BD=E5=8A=A0=E5=88=86?= =?UTF-8?q?15=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Account.txt | 6 +++--- s3/data/crm/settings/CRM_Approved_Document_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Call2_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Child_Account_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Consent_Type_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt | 4 ++-- s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt | 6 +++--- s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Product_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_Profile.txt | 6 +++--- s3/data/crm/settings/CRM_Sent_Email_vod__c.txt | 6 +++--- s3/data/crm/settings/CRM_User.txt | 6 +++--- 15 files changed, 44 insertions(+), 44 deletions(-) diff --git a/s3/data/crm/settings/CRM_Account.txt b/s3/data/crm/settings/CRM_Account.txt index 4a163455..8790d4db 100644 --- a/s3/data/crm/settings/CRM_Account.txt +++ b/s3/data/crm/settings/CRM_Account.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -248 -Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc -Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc +266 +Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,MSJ_CIAM_Number__c,MSJ_sID__c,MSJ_Application_Materials_Deadline__c,MSJ_DI_Person__c,MSJ_Pharmaceutical_Department_Memo__c,MSJ_Pharmaceutical_Examination_Date__c,MSJ_Pharmaceutical_Examination_Member__c,MSJ_Pharmaceutical_Examination_Rule_Memo__c,MSJ_Pharmaceutical_Examination_Rule__c,MSJ_Pharmacy_Director__c,MSJ_Visit_Regulation__c,MSJ_18_Digit_Salesforce_Id__c,MSJ_Clinical_Trial_Count__c,MSJ_Congresses_Count__c,MSJ_Deletion_H1__c,MSJ_External_Link_To_Full_H1_Profile__c,MSJ_Industry_Payments_Amount__c,MSJ_Publication_Count__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc +Id,IsDeleted,MasterRecordId,Name,LastName,FirstName,Salutation,RecordTypeId,Phone,Fax,Website,PhotoUrl,NumberOfEmployees,Ownership,OwnerId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,IsExcludedFromRealign,PersonContactId,IsPersonAccount,PersonMailingStreet,PersonMailingCity,PersonMailingState,PersonMailingPostalCode,PersonMailingCountry,PersonMailingLatitude,PersonMailingLongitude,PersonMailingGeocodeAccuracy,PersonMailingAddress,PersonOtherStreet,PersonOtherCity,PersonOtherState,PersonOtherPostalCode,PersonOtherCountry,PersonOtherLatitude,PersonOtherLongitude,PersonOtherGeocodeAccuracy,PersonOtherAddress,PersonMobilePhone,PersonHomePhone,PersonOtherPhone,PersonAssistantPhone,PersonEmail,PersonTitle,PersonDepartment,PersonAssistantName,PersonBirthdate,PersonHasOptedOutOfEmail,PersonHasOptedOutOfFax,PersonDoNotCall,PersonLastCURequestDate,PersonLastCUUpdateDate,PersonEmailBouncedReason,PersonEmailBouncedDate,PersonIndividualId,Jigsaw,JigsawCompanyId,AccountSource,SicDesc,External_ID_vod__c,Credentials_vod__c,Territory_vod__c,Exclude_from_Zip_to_Terr_Processing_vod__c,Group_Specialty_1_vod__c,Group_Specialty_2_vod__c,Specialty_1_vod__c,Specialty_2_vod__c,Formatted_Name_vod__c,Territory_Test_vod__c,Mobile_ID_vod__c,Gender_vod__c,ID_vod__c,Do_Not_Sync_Sales_Data_vod__c,ID2_vod__c,Preferred_Name_vod__c,Sample_Default_vod__c,Segmentations_vod__c,Restricted_Products_vod__c,Payer_Id_vod__c,Alternate_Name_vod__c,Do_Not_Call_vod__c,MSJ_Beds__c,Spend_Amount__c,PDRP_Opt_Out_vod__c,Spend_Status_Value_vod__c,PDRP_Opt_Out_Date_vod__c,Spend_Status_vod__c,Enable_Restricted_Products_vod__c,Call_Reminder_vod__c,Account_Group_vod__c,Primary_Parent_vod__c,Color_vod__c,Middle_vod__c,Suffix_vod__c,MSJ_Type__c,No_Orders_vod__c,MSJ_BU_ONC__c,MSJ_BU_FE__c,Account_Search_FirstLast_vod__c,Account_Search_LastFirst_vod__c,MSJ_Operation__c,Practice_at_Hospital_vod__c,Practice_Near_Hospital_vod__c,Do_Not_Create_Child_Account_vod__c,Total_MDs_DOs__c,AHA__c,Order_Type_vod__c,NPI_vod__c,ME__c,Speaker__c,Investigator_vod__c,Default_Order_Type_vod__c,Tax_Status__c,Model__c,Offerings__c,Departments__c,Account_Type__c,MSJ_ONC_Tier__c,Account_Search_Business_vod__c,Business_Professional_Person_vod__c,Hospital_Type_vod__c,Account_Class_vod__c,Furigana_vod__c,MSJ_JISART__c,Total_Revenue_000__c,Net_Income_Loss_000__c,PMPM_Income_Loss_000__c,Commercial_Premiums_PMPM__c,Medical_Loss_Ratio__c,Medical_Expenses_PMPM__c,Commercial_Patient_Days_1000__c,HMO_Market_Shr__c,HMO__c,HMO_POS__c,PPO__c,PPO_POS__c,Medicare__c,Medicaid__c,MSJ_HP_Name_E__c,MSJ_Department__c,MSJ_Date_Of_Birth__c,MSJ_FE_GF_Potential__c,MSJ_FE_SZ_Potential__c,MSJ_EB_CRC_Ladder__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,Business_Description__c,Regional_Strategy__c,Contracts_Process__c,MSJ_GF_segment__c,MSJ_DCF_DR_Code__c,MSJ_SZ_Segment__c,MSJ_Remark__c,MSJ_Title__c,MSJ_Role__c,MSJ_Kana__c,MSJ_Specialism__c,MSJ_Graduated_from__c,MSJ_Year_Graduation__c,Target__c,KOL_vod__c,MSJ_EPPV_Code__c,MSJ_DCF_HP_Code__c,Total_Lives__c,Total_Physicians_Enrolled__c,MSJ_Delete__c,MSJ_KOL_LOL__c,MSJ_ONC_Status__c,Account_Identifier_vod__c,Approved_Email_Opt_Type_vod__c,Language_vod__c,MSJ_KRAS_Routine_Date__c,MSJ_KRAS_Routine__c,MSJ_DRP_Target__c,MSJ_Fertility_Evaluation_Score__c,MSJ_Fertility_Tracking_Last_Modify_Date__c,Total_Pharmacists__c,MSJ_Number_of_Gonadotropin__c,MSJ_Number_of_IUI_cycle__c,MSJ_Number_of_OI_monthly_cycle__c,MSJ_OI_Protocol_learning_level__c,MSJ_H_N_Tier__c,MSJ_XLK_Segment__c,MSJ_XLK_Tier__c,Career_Status_vod__c,Photo_vod__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_FE_CE_Potential__c,MSJ_FE_1C_potential__c,MSJ_FE_OV_potential__c,MSJ_FE_Tech_potential__c,MSJ_CE_segment__c,MSJ_1C_segment__c,MSJ_OV_segment__c,MSJ_Tech_segment__c,MSJ_Target_Call_Num__c,MSJ_DR_Change_Log__c,MSJ_Global_scientific_exposure__c,MSJ_H_index__c,MSJ_Num_of_Article_3Y__c,MSJ_Num_of_Article__c,MSJ_Num_of_Article_as_1st_Author_3Y__c,MSJ_Num_of_article_growth_rate_3Y__c,MSJ_Num_of_cited_3Y__c,MSJ_Num_of_impact_factor_3Y__c,MSJ_impact_factor_as_1st_Author_3Y__c,EMDS_Has_Pipeline_Opportunity__c,EMDS_Pipeline_Count__c,MSJ_BVC_Segment__c,MSJ_BVC_Tier__c,MSJ_BVC_AcctOpen__c,MSJ_BVC_MCC_Patients__c,MSJ_ONC_HP_Segment__c,MSJ_AE_Department__c,MSJ_AE_Facility__c,MSJ_AE_Name__c,MSJ_AE_Title__c,MSJ_Email__c,MSJ_FE_GF2_Potential__c,MSJ_FE_Location_potential__c,MSJ_GF2_segment__c,MSJ_OPTIN_target__c,MSJ_Merck_Specialty1__c,MSJ_Merck_Specialty2__c,MSJ_Marketing_Cloud_Integration__c,MSJ_Marketing_Cloud1__c,MSJ_Marketing_Cloud2__c,MSJ_Marketing_Cloud3__c,MSJ_Marketing_Cloud4__c,MSJ_Medical_Department__c,MSJ_Marketing_Cloud0__c,MSJ_CIAM_Number__c,MSJ_sID__c,MSJ_Application_Materials_Deadline__c,MSJ_DI_Person__c,MSJ_Pharmaceutical_Department_Memo__c,MSJ_Pharmaceutical_Examination_Date__c,MSJ_Pharmaceutical_Examination_Member__c,MSJ_Pharmaceutical_Examination_Rule_Memo__c,MSJ_Pharmaceutical_Examination_Rule__c,MSJ_Pharmacy_Director__c,MSJ_Visit_Regulation__c,MSJ_18_Digit_Salesforce_Id__c,MSJ_Clinical_Trial_Count__c,MSJ_Congresses_Count__c,MSJ_Deletion_H1__c,MSJ_External_Link_To_Full_H1_Profile__c,MSJ_Industry_Payments_Amount__c,MSJ_Publication_Count__c,Mobile_ID_vod__pc,H1Insights__H1_NPI_Value_for_Testing__pc,H1Insights__H1_Person_ID__pc,H1Insights__H1_Request_Status__pc,H1Insights__H1_URL__pc,H1Insights__NPI_Number__pc,H1Insights__NPI_Number_for_H1_Insights__pc,MSJ_Marketing_Cloud_Integration__pc src02.crm_Account org02.crm_Account CRM_Account_ex.sql diff --git a/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt b/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt index 0633cbbe..620b1c0d 100644 --- a/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt +++ b/s3/data/crm/settings/CRM_Approved_Document_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -53 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c +54 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c,Publish_Method_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Detail_Group_vod__c,Document_Description_vod__c,Document_Host_URL_vod__c,Document_ID_vod__c,Document_Last_Mod_DateTime_vod__c,Email_Allows_Documents_vod__c,Email_Domain_vod__c,Email_Fragment_HTML_vod__c,Email_From_Address_vod__c,Email_From_Name_vod__c,Email_HTML_1_vod__c,Email_HTML_2_vod__c,Email_ReplyTo_Address_vod__c,Email_ReplyTo_Name_vod__c,Email_Subject_vod__c,Email_Template_Fragment_Document_ID_vod__c,Email_Template_Fragment_HTML_vod__c,ISI_Document_ID_vod__c,Language_vod__c,Other_Document_ID_List_vod__c,PI_Document_ID_vod__c,Piece_Document_ID_vod__c,Product_vod__c,Status_vod__c,Territory_vod__c,Vault_Instance_ID_vod__c,Allow_Any_Product_Fragment_vod__c,Allowed_Document_IDs_vod__c,Engage_Document_Id_vod__c,Vault_Document_ID_vod__c,Key_Message_vod__c,Events_Management_Subtype_vod__c,Survey_vod__c,Content_Type_vod__c,Bcc_vod__c,Audience_vod__c,WeChat_Template_ID_vod__c,Check_Consent_vod__c,Publish_Method_vod__c src02.crm_Approved_Document_vod__c org02.crm_Approved_Document_vod__c diff --git a/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt index 98dd227c..338efbe3 100644 --- a/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_Key_Message_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -36 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,Call2_vod__r.RecordTypeId -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,medaca_parent_record_type_id +37 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,Share_Channel_vod__c,Call2_vod__r.RecordTypeId +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Account_vod__c,Call2_vod__c,Reaction_vod__c,Product_vod__c,Key_Message_vod__c,Mobile_ID_vod__c,Contact_vod__c,Call_Date_vod__c,User_vod__c,Category_vod__c,Vehicle_vod__c,Is_Parent_Call_vod__c,Override_Lock_vod__c,CLM_ID_vod__c,Slide_Version_vod__c,Duration_vod__c,Presentation_ID_vod__c,Start_Time_vod__c,Attendee_Type_vod__c,Entity_Reference_Id_vod__c,Segment_vod__c,Display_Order_vod__c,Clm_Presentation_Name_vod__c,Clm_Presentation_Version_vod__c,Clm_Presentation_vod__c,Share_Channel_vod__c,medaca_parent_record_type_id internal02.crm_Call2_Key_Message_vod__c org02.crm_Call2_Key_Message_vod__c CRM_Call2_Key_Message_vod__c_ex.sql diff --git a/s3/data/crm/settings/CRM_Call2_vod__c.txt b/s3/data/crm/settings/CRM_Call2_vod__c.txt index 214c862a..69388ce7 100644 --- a/s3/data/crm/settings/CRM_Call2_vod__c.txt +++ b/s3/data/crm/settings/CRM_Call2_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -205 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c +210 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,Suggestion_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c,Meeting_Request_vod__c,Phone_vod__c,Detail_Section_Attribute_vod__c,Remote_Meeting_Type_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Call_Comments_vod__c,Sample_Card_vod__c,Add_Detail_vod__c,Property_vod__c,Account_vod__c,zvod_Product_Discussion_vod__c,Status_vod__c,Parent_Address_vod__c,Account_Plan_vod__c,zvod_SaveNew_vod__c,Next_Call_Notes_vod__c,Pre_Call_Notes_vod__c,Mobile_ID_vod__c,zvod_Account_Credentials_vod_c_vod__c,zvod_Account_Preferred_Name_vod_c_vod__c,zvod_Account_Sample_Status_vod_c_vod__c,zvod_Attendees_vod__c,zvod_Key_Messages_vod__c,zvod_Detailing_vod__c,zvod_Expenses_vod__c,zvod_Followup_vod__c,zvod_Samples_vod__c,zvod_Save_vod__c,zvod_Submit_vod__c,zvod_Delete_vod__c,Activity_Type__c,Significant_Event__c,Location_vod__c,Subject_vod__c,Unlock_vod__c,Call_Datetime_vod__c,Disbursed_To_vod__c,Disclaimer_vod__c,Request_Receipt_vod__c,Signature_Date_vod__c,Signature_vod__c,Territory_vod__c,Submitted_By_Mobile_vod__c,Call_Type_vod__c,Add_Key_Message_vod__c,Address_vod__c,Attendees_vod__c,Attendee_Type_vod__c,Call_Date_vod__c,Detailed_Products_vod__c,No_Disbursement_vod__c,Parent_Call_vod__c,User_vod__c,Contact_vod__c,zvod_Entity_vod__c,Medical_Event_vod__c,Mobile_Created_Datetime_vod__c,Mobile_Last_Modified_Datetime_vod__c,License_vod__c,Is_Parent_Call_vod__c,Entity_Display_Name_vod__c,Override_Lock_vod__c,Last_Device_vod__c,Ship_Address_Line_1_vod__c,Ship_Address_Line_2_vod__c,Ship_City_vod__c,Ship_Country_vod__c,Ship_License_Expiration_Date_vod__c,Ship_License_Status_vod__c,Ship_License_vod__c,Ship_State_vod__c,Ship_To_Address_vod__c,Ship_Zip_vod__c,Ship_To_Address_Text_vod__c,CLM_vod__c,zvod_CLMDetails_vod__c,Is_Sampled_Call_vod__c,zvod_Surveys_vod__c,Presentations_vod__c,Entity_Reference_Id_vod__c,Error_Reference_Call_vod__c,Duration_vod__c,Color_vod__c,Allowed_Products_vod__c,zvod_Attachments_vod__c,Sample_Card_Reason_vod__c,ASSMCA_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,DEA_Address_Line_1_vod__c,DEA_Address_Line_2_vod__c,DEA_Address_vod__c,DEA_City_vod__c,DEA_Expiration_Date_vod__c,DEA_State_vod__c,DEA_Zip_4_vod__c,DEA_Zip_vod__c,DEA_vod__c,Ship_Zip_4_vod__c,State_vod__c,Zip_4_vod__c,Zip_vod__c,Sample_Send_Card_vod__c,zvod_Address_vod_c_DEA_Status_vod_c_vod__c,Signature_Page_Image_vod__c,Credentials_vod__c,Salutation_vod__c,zvod_Account_Call_Reminder_vod_c_vod__c,MSJ_Meeting_Duration__c,MSJ_Double_Visit_AM__c,zvod_Business_Account_vod__c,Product_Priority_1_vod__c,Product_Priority_2_vod__c,Product_Priority_3_vod__c,Product_Priority_4_vod__c,Product_Priority_5_vod__c,zvod_More_Actions_vod__c,zvod_Call_Conflict_Status_vod__c,Signature_Timestamp_vod__c,Expense_Amount_vod__c,Total_Expense_Attendees_Count_vod__c,Attendee_list_vod__c,Expense_Post_Status_vod__c,Attendee_Post_Status_vod__c,Expense_System_External_ID_vod__c,Incurred_Expense_vod__c,Assigner_vod__c,Assignment_Datetime_vod__c,zvod_Call_Objective_vod__c,Signature_Location_Longitude_vod__c,Signature_Location_Latitude_vod__c,Location_Services_Status_vod__c,MSJ_Double_Visit_Other__c,MSJ_Comment__c,MSJ_For_Reporting__c,MSJ_Number_of_Attendees__c,MSJ_Main_Dept__c,Planned_Type_vjh__c,Cobrowse_URL_Participant_vod__c,MSJ_Activity_Method_Text__c,MSJ_Activity_Method__c,MSJ_Classification__c,MSJ_Double_Visit_MSL__c,MSJ_MSL_Comment_for_MR__c,MSJ_APD__c,Medical_Inquiry_vod__c,Suggestion_vod__c,MSJ_Call_Type_MSJ__c,MSJ_Prescription_Request__c,MSJ_Patient_Follow__c,Child_Account_Id_vod__c,Child_Account_vod__c,Location_Id_vod__c,Location_Name_vod__c,MSJ_Comments_about_technology__c,Remote_Meeting_vod__c,Veeva_Remote_Meeting_Id_vod__c,MSJ_Activity_Type_Report__c,MSJ_Activity_Type__c,MSJ_Activity__c,MSJ_Comments__c,MSJ_Therapy__c,MSJ_Time_Hrs__c,EMDS_CO_Reference__c,EMDS_Call_Sub_Type__c,EMDS_Call_Type__c,EMDS_Call_Unsuccessful__c,EMDS_Congress_Type__c,EMDS_Date_of_Service__c,EMDS_Fertility_DisInterest__c,EMDS_Fertility_Interest__c,EMDS_Installed_Equipment__c,EMDS_Pipeline_Stage_Value__c,EMDS_Pipeline_Stage__c,EMDS_Pipeline__c,EMDS_Reason_for_Call__c,EMDS_Training_Completed__c,MSJ_BrainStorming__c,MSJ_SIPAGL_1A__c,MSJ_SIPAGL_1B__c,MSJ_SIPAGL_2__c,MSJ_SIPAGL_3__c,MSJ_SIPAGL_4A__c,MSJ_SIPAGL_5A__c,MSJ_SIPAGL_comment__c,MSJ_SIPAGL_4B__c,MSJ_SIPAGL_5B__c,Location_Text_vod__c,Call_Channel_vod__c,MSJ_Scientific_Interaction__c,MSJ_Activity_Email_Reply__c,MSJ_Interaction_Duration__c,MSJ_SIPAGL_1A_date__c,MSJ_CoPromotion__c,Call_Channel_Formula_vod__c,Meeting_Request_vod__c,Phone_vod__c,Detail_Section_Attribute_vod__c,Remote_Meeting_Type_vod__c internal02.crm_Call2_vod__c org02.crm_Call2_vod__c CRM_Call2_vod__c_ex.sql diff --git a/s3/data/crm/settings/CRM_Child_Account_vod__c.txt b/s3/data/crm/settings/CRM_Child_Account_vod__c.txt index 38fc8afc..ce397749 100644 --- a/s3/data/crm/settings/CRM_Child_Account_vod__c.txt +++ b/s3/data/crm/settings/CRM_Child_Account_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -57 -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c -Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c +59 +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c,MSJ_Main_Treatment_Plan__c,MSJ_Optimal_Visiting_Hours__c +Id,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Parent_Account_vod__c,Child_Account_vod__c,External_ID_vod__c,Mobile_ID_vod__c,Primary_vod__c,Copy_Address_vod__c,Child_Name_vod__c,Parent_Name_vod__c,Parent_Child_Name_vod__c,Account_Code__c,Child_Department__c,Child_Role__c,Child_Title__c,Child_Remark__c,MSJ_1C_segment__c,MSJ_BU_FE__c,MSJ_BU_ONC__c,MSJ_BVC_Segment__c,MSJ_CE_segment__c,MSJ_Child_Account_Link__c,MSJ_DCF_DR_Code__c,MSJ_DCF_HP_Code__c,MSJ_DR_Change_Log__c,MSJ_Delete__c,MSJ_Department__c,MSJ_EB_CRC_Segment__c,MSJ_EB_HN_Segment__c,MSJ_EB_H_N_LA_Segment__c,MSJ_EB_H_N_RM_Segment__c,MSJ_External_ID__c,MSJ_Fax__c,MSJ_GF2_segment__c,MSJ_GF_segment__c,MSJ_KOL_LOL__c,MSJ_KOL__c,MSJ_ONC_HP_Segment__c,MSJ_OPTIN_target__c,MSJ_OV_segment__c,MSJ_Parent_Child_Name__c,MSJ_Phone__c,MSJ_Remark__c,MSJ_Target_Call_Num__c,MSJ_Tech_segment__c,MSJ_Title__c,MSJ_XLK_Segment__c,MSJ_Main_Treatment_Plan__c,MSJ_Optimal_Visiting_Hours__c src02.crm_Child_Account_vod__c org02.crm_Child_Account_vod__c CRM_Child_Account_vod__c_ex.sql diff --git a/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt b/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt index 686860a2..9a6daa03 100644 --- a/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt +++ b/s3/data/crm/settings/CRM_Consent_Type_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -26 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c +27 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c,MSJ_Channel_Type__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consent_Header_vod__c,Channel_Label_vod__c,Channel_Source_vod__c,Consent_Expires_In_vod__c,Default_Consent_Type_vod__c,Disclaimer_Text_vod__c,Display_Order_vod__c,Product_Preference_vod__c,zvod_Consent_Default_Consent_Text_vod__c,zvod_Consent_Line_vod__c,zvod_Signature_Capture_vod__c,Double_Opt_In_vod__c,zvod_Consent_Activity_Tracking_vod__c,MSJ_Channel_Type__c src02.crm_Consent_Type_vod__c org02.crm_Consent_Type_vod__c diff --git a/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt b/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt index 8880f510..6551bcbb 100644 --- a/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt +++ b/s3/data/crm/settings/CRM_Event_Attendee_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -32 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c +36 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c,MSJ_DirectMail_Status__c,EM_Event_Team_Member_vod__c,Group_Name_vod__c,Role_vod__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,Attendee_vod__c,User_vod__c,Medical_Event_vod__c,Attendee_Type_vod__c,Status_vod__c,Contact_vod__c,Attendee_Name_vod__c,Account_vod__c,Start_Date_vod__c,Signature_vod__c,Signature_Datetime_vod__c,MSJ_Copy_Account_Type__c,MSJ_Evaluation__c,MSJ_Hospital__c,MSJ_Role__c,Mobile_ID_vod__c,MSJ_Evaluation_Comment__c,Position_vod__c,Talk_Title_vod__c,MSJ_Attendee_Reaction__c,MSJ_Registration__c,MSJ_DirectMail_Status__c,EM_Event_Team_Member_vod__c,Group_Name_vod__c,Role_vod__c src02c.crm_Event_Attendee_vod__c org02.crm_Event_Attendee_vod__c diff --git a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt index 6fa21db9..d5663949 100644 --- a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 47 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c src02m.crm_MSJ_Inquiry_Assignment__c org02.crm_MSJ_Inquiry_Assignment__c diff --git a/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt b/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt index 4dfe693a..070310ff 100644 --- a/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_MR_Weekly_Report__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -35 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c +41 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c,MSJ_Activity_Results_Summary_LC__c,MSJ_Next_Week_Action_Where_LC__c,MSJ_Next_Week_Action_Who_LC__c,MSJ_Next_Week_Action_What_LC__c,MSJ_Next_Week_Action_When_LC__c,MSJ_Target_Patient_Count_LC__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Account_Name__c,MSJ_Activity_Results_Summary__c,MSJ_MUID__c,MSJ_Next_Week_Action_What__c,MSJ_Next_Week_Action_When__c,MSJ_Next_Week_Action_Where__c,MSJ_Next_Week_Action_Who__c,MSJ_Report_Week__c,MSJ_Target_Patient_Count__c,Mobile_ID_vod__c,MSJ_Activity_Results_Summary_HN__c,MSJ_Next_Week_Action_Where_HN__c,MSJ_Next_Week_Action_Who_HN__c,MSJ_Next_Week_Action_What_HN__c,MSJ_Next_Week_Action_When_HN__c,MSJ_Target_Patient_Count_HN__c,MSJ_Activity_Results_Summary_MCC__c,MSJ_Next_Week_Action_Where_MCC__c,MSJ_Next_Week_Action_Who_MCC__c,MSJ_Next_Week_Action_What_MCC__c,MSJ_Next_Week_Action_When_MCC__c,MSJ_Target_Patient_Count_MCC__c,MSJ_Activity_Results_Summary_LC__c,MSJ_Next_Week_Action_Where_LC__c,MSJ_Next_Week_Action_Who_LC__c,MSJ_Next_Week_Action_What_LC__c,MSJ_Next_Week_Action_When_LC__c,MSJ_Target_Patient_Count_LC__c src02c.crm_MSJ_MR_Weekly_Report__c org02.crm_MSJ_MR_Weekly_Report__c diff --git a/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt b/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt index ebc185d4..1750b9e3 100644 --- a/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt +++ b/s3/data/crm/settings/CRM_Medical_Inquiry_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -67 -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c -Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c +69 +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c,MSJ_Chatbot_Check__c,MSJ_File_Attached__c +Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Address_Line_1_vod__c,Address_Line_2_vod__c,City_vod__c,Delivery_Method_vod__c,Email_vod__c,Fax_Number_vod__c,Inquiry_Text__c,Lock_vod__c,Mobile_ID_vod__c,Phone_Number_vod__c,Product__c,Rush_Delivery__c,Signature_Date_vod__c,Signature_vod__c,State_vod__c,Status_vod__c,Zip_vod__c,zvod_Delivery_Method_vod__c,zvod_Disclaimer_vod__c,Submitted_By_Mobile_vod__c,Disclaimer_vod__c,Entity_Reference_Id_vod__c,Call2_vod__c,Country_vod__c,Override_Lock_vod__c,MSJ_Department__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Assignment__c,MSJ_Inquiry_Date__c,MSJ_Inquiry_Input_Manager__c,MSJ_Inquiry_Input_User__c,MSJ_MSL_Manager__c,MSJ_Notice_to_MR__c,MSJ_Person_in_charge_1__c,MSJ_Person_in_charge_2__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply_User__c,MSJ_Reply__c,MSJ_Title__c,MSJ_AE_Infomation__c,MSJ_FAQ_Number_Report__c,MSJ_Return_Call_Report__c,MSJ_Inquiry_Origin_Report__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_MSL_Support__c,MSJ_Material_Requirement__c,MSJ_Hospital_Name_Disp__c,MSJ_Hospital__c,MSJ_Chatbot_Check__c,MSJ_File_Attached__c src02m.crm_Medical_Inquiry_vod__c org02.crm_Medical_Inquiry_vod__c diff --git a/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt b/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt index 4888bbd8..392e3390 100644 --- a/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt +++ b/s3/data/crm/settings/CRM_Multichannel_Activity_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -47 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c +55 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c,MSJ_Activity_Name__c,MSJ_Asset__c,MSJ_CIAM_Account__c,MSJ_Channel__c,MSJ_Content__c,MSJ_Registration_Time__c,MSJ_Related_External_Account_Data__c,MSJ_Tag_Id__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_External_ID_Map_vod__c,Account_vod__c,Call_vod__c,City_vod__c,Client_Name_vod__c,Client_OS_vod__c,Client_Type_vod__c,Country_vod__c,Debug_vod__c,Device_vod__c,IP_Address_vod__c,Multichannel_Activity_vod__c,Referring_Site_vod__c,Region_vod__c,Sent_Email_vod__c,Session_Id_vod__c,Site_vod__c,Start_DateTime_vod__c,Total_Duration_vod__c,URL_vod__c,User_Agent_vod__c,VExternal_Id_vod__c,Viewport_Height_vod__c,Viewport_Width_vod__c,Color_vod__c,Icon_vod__c,MCD_Primary_Key_vod__c,Record_Type_Name_vod__c,MSJ_Date_Opened__c,MSJ_Sent_Date__c,MSJ_Email_Subject__c,MSJ_Opens__c,MSJ_Email_Status__c,MSJ_Activity_Name__c,MSJ_Asset__c,MSJ_CIAM_Account__c,MSJ_Channel__c,MSJ_Content__c,MSJ_Registration_Time__c,MSJ_Related_External_Account_Data__c,MSJ_Tag_Id__c src02c.crm_Multichannel_Activity_vod__c org02.crm_Multichannel_Activity_vod__c diff --git a/s3/data/crm/settings/CRM_Product_vod__c.txt b/s3/data/crm/settings/CRM_Product_vod__c.txt index 360c7c7f..cb5d81fb 100644 --- a/s3/data/crm/settings/CRM_Product_vod__c.txt +++ b/s3/data/crm/settings/CRM_Product_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -53 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c +54 +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c,MSJ_Local_Business_Unit__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Consumer_site__c,Product_info__c,Therapeutic_Class_vod__c,Parent_Product_vod__c,Therapeutic_Area_vod__c,Product_Type_vod__c,Require_Key_Message_vod__c,Cost_vod__c,External_ID_vod__c,Manufacturer_vod__c,Company_Product_vod__c,Controlled_Substance_vod__c,Description_vod__c,Sample_Quantity_Picklist_vod__c,Display_Order_vod__c,No_Metrics_vod__c,Distributor_vod__c,Sample_Quantity_Bound_vod__c,Sample_U_M_vod__c,No_Details_vod__c,Quantity_Per_Case_vod__c,Schedule_vod__c,Restricted_vod__c,Pricing_Rule_Quantity_Bound_vod__c,No_Promo_Items_vod__c,User_Aligned_vod__c,Restricted_States_vod__c,Sort_Code_vod__c,No_Cycle_Plans_vod__c,Inventory_Order_UOM_vod__c,Inventory_Quantity_Per_Case_vod__c,VExternal_Id_vod__c,Country__c,MSJ_Product_Classification__c,MSJ_Indication__c,MSJ_Therapeutic_Area__c,MSJ_Global_Brand__c,MSJ_Global_Business_Unit__c,MSJ_Molecules__c,MSJ_SBU__c,MSJ_Local_Business_Unit__c src02.crm_Product_vod__c org02.crm_Product_vod__c diff --git a/s3/data/crm/settings/CRM_Profile.txt b/s3/data/crm/settings/CRM_Profile.txt index 8835935e..6eae13fd 100644 --- a/s3/data/crm/settings/CRM_Profile.txt +++ b/s3/data/crm/settings/CRM_Profile.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -237 -Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,Description,LastViewedDate,LastReferencedDate -Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,Description,LastViewedDate,LastReferencedDate +255 +Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsEditBillingInfo,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsIsSsoEnabled,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsSalesforceIQInbox,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsAllowObjectDetection,PermissionsSalesforceIQInternal,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsAllowObjectDetectionTraining,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsViewRestrictionAndScopingRules,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsViewMLModels,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,PermissionsBypassMFAForUiLogins,PermissionsClientSecretRotation,PermissionsUpdateReportTypeReferences,PermissionsAccessToServiceProcess,PermissionsManageOrchInstsAndWorkItems,PermissionsCMSECEAuthoringAccess,PermissionsEnableIPFSUpload,PermissionsEnableBCTransactionPolling,PermissionsFSCArcGraphCommunityUser,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsSsoEnabled,Description,LastViewedDate,LastReferencedDate +Id,Name,PermissionsEmailSingle,PermissionsEmailMass,PermissionsEditTask,PermissionsEditEvent,PermissionsExportReport,PermissionsImportPersonal,PermissionsDataExport,PermissionsManageUsers,PermissionsEditPublicFilters,PermissionsEditPublicTemplates,PermissionsModifyAllData,PermissionsEditBillingInfo,PermissionsManageCases,PermissionsManageSolutions,PermissionsCustomizeApplication,PermissionsEditReadonlyFields,PermissionsRunReports,PermissionsViewSetup,PermissionsTransferAnyEntity,PermissionsNewReportBuilder,PermissionsManageSelfService,PermissionsManageCssUsers,PermissionsActivateContract,PermissionsApproveContract,PermissionsImportLeads,PermissionsManageLeads,PermissionsTransferAnyLead,PermissionsViewAllData,PermissionsEditPublicDocuments,PermissionsViewEncryptedData,PermissionsEditBrandTemplates,PermissionsEditHtmlTemplates,PermissionsManageTranslation,PermissionsDeleteActivatedContract,PermissionsSendSitRequests,PermissionsApiUserOnly,PermissionsManageRemoteAccess,PermissionsCanUseNewDashboardBuilder,PermissionsManageCategories,PermissionsConvertLeads,PermissionsTestInstanceCreate,PermissionsPasswordNeverExpires,PermissionsUseTeamReassignWizards,PermissionsInstallMultiforce,PermissionsPublishMultiforce,PermissionsEditOppLineItemUnitPrice,PermissionsManageTerritories,PermissionsCreateMultiforce,PermissionsBulkApiHardDelete,PermissionsInboundMigrationToolsUser,PermissionsSolutionImport,PermissionsManageCallCenters,PermissionsManageSynonyms,PermissionsOutboundMigrationToolsUser,PermissionsViewContent,PermissionsManageEmailClientConfig,PermissionsEnableNotifications,PermissionsIsSsoEnabled,PermissionsManageDataIntegrations,PermissionsDistributeFromPersWksp,PermissionsViewDataCategories,PermissionsManageDataCategories,PermissionsAuthorApex,PermissionsManageMobile,PermissionsApiEnabled,PermissionsManageCustomReportTypes,PermissionsEditCaseComments,PermissionsTransferAnyCase,PermissionsContentAdministrator,PermissionsCreateWorkspaces,PermissionsManageContentPermissions,PermissionsManageContentProperties,PermissionsManageContentTypes,PermissionsScheduleJob,PermissionsManageExchangeConfig,PermissionsManageAnalyticSnapshots,PermissionsScheduleReports,PermissionsManageBusinessHourHolidays,PermissionsManageDynamicDashboards,PermissionsManageInteraction,PermissionsViewMyTeamsDashboards,PermissionsResetPasswords,PermissionsFlowUFLRequired,PermissionsActivitiesAccess,PermissionsEmailTemplateManagement,PermissionsEmailAdministration,PermissionsChatterFileLink,PermissionsForceTwoFactor,PermissionsViewEventLogFiles,PermissionsManageNetworks,PermissionsManageAuthProviders,PermissionsRunFlow,PermissionsCreateCustomizeDashboards,PermissionsCreateDashboardFolders,PermissionsViewPublicDashboards,PermissionsManageDashbdsInPubFolders,PermissionsCreateCustomizeReports,PermissionsCreateReportFolders,PermissionsViewPublicReports,PermissionsManageReportsInPubFolders,PermissionsEditMyDashboards,PermissionsEditMyReports,PermissionsViewAllUsers,PermissionsConnectOrgToEnvironmentHub,PermissionsCreateCustomizeFilters,PermissionsContentHubUser,PermissionsGovernNetworks,PermissionsSalesConsole,PermissionsTwoFactorApi,PermissionsDeleteTopics,PermissionsEditTopics,PermissionsCreateTopics,PermissionsAssignTopics,PermissionsIdentityEnabled,PermissionsIdentityConnect,PermissionsContentWorkspaces,PermissionsCustomMobileAppsAccess,PermissionsViewHelpLink,PermissionsManageProfilesPermissionsets,PermissionsAssignPermissionSets,PermissionsManageRoles,PermissionsManageIpAddresses,PermissionsManageSharing,PermissionsManageInternalUsers,PermissionsManagePasswordPolicies,PermissionsManageLoginAccessPolicies,PermissionsManageCustomPermissions,PermissionsStdAutomaticActivityCapture,PermissionsManageTwoFactor,PermissionsDebugApex,PermissionsLightningExperienceUser,PermissionsConfigCustomRecs,PermissionsSubmitMacrosAllowed,PermissionsBulkMacrosAllowed,PermissionsManageSessionPermissionSets,PermissionsCreateAuditFields,PermissionsUpdateWithInactiveOwner,PermissionsManageSandboxes,PermissionsAutomaticActivityCapture,PermissionsImportCustomObjects,PermissionsSalesforceIQInbox,PermissionsDelegatedTwoFactor,PermissionsSelectFilesFromSalesforce,PermissionsModerateNetworkUsers,PermissionsMergeTopics,PermissionsSubscribeToLightningReports,PermissionsManagePvtRptsAndDashbds,PermissionsAllowLightningLogin,PermissionsCampaignInfluence2,PermissionsViewDataAssessment,PermissionsCanApproveFeedPost,PermissionsAllowViewEditConvertedLeads,PermissionsShowCompanyNameAsUserBadge,PermissionsAccessCMC,PermissionsViewHealthCheck,PermissionsManageHealthCheck,PermissionsPackaging2,PermissionsManageCertificates,PermissionsCreateReportInLightning,PermissionsPreventClassicExperience,PermissionsListEmailSend,PermissionsChangeDashboardColors,PermissionsManageRecommendationStrategies,PermissionsManagePropositions,PermissionsSubscribeReportRolesGrps,PermissionsSubscribeDashboardRolesGrps,PermissionsUseWebLink,PermissionsHasUnlimitedNBAExecutions,PermissionsViewOnlyEmbeddedAppUser,PermissionsViewAllActivities,PermissionsSubscribeReportToOtherUsers,PermissionsLightningConsoleAllowedForUser,PermissionsSubscribeReportsRunAsUser,PermissionsSubscribeToLightningDashboards,PermissionsSubscribeDashboardToOtherUsers,PermissionsCreateLtngTempInPub,PermissionsTransactionalEmailSend,PermissionsViewPrivateStaticResources,PermissionsCreateLtngTempFolder,PermissionsApexRestServices,PermissionsEnableCommunityAppLauncher,PermissionsGiveRecognitionBadge,PermissionsAllowObjectDetection,PermissionsSalesforceIQInternal,PermissionsUseMySearch,PermissionsLtngPromoReserved01UserPerm,PermissionsManageSubscriptions,PermissionsAllowObjectDetectionTraining,PermissionsManageSurveys,PermissionsUseAssistantDialog,PermissionsUseQuerySuggestions,PermissionsViewRoles,PermissionsLMOutboundMessagingUserPerm,PermissionsModifyDataClassification,PermissionsPrivacyDataAccess,PermissionsQueryAllFiles,PermissionsModifyMetadata,PermissionsManageCMS,PermissionsSandboxTestingInCommunityApp,PermissionsCanEditPrompts,PermissionsViewUserPII,PermissionsManageHubConnections,PermissionsB2BMarketingAnalyticsUser,PermissionsTraceXdsQueries,PermissionsViewAllCustomSettings,PermissionsViewAllForeignKeyNames,PermissionsHeadlessCMSAccess,PermissionsLMEndMessagingSessionUserPerm,PermissionsConsentApiUpdate,PermissionsAccessContentBuilder,PermissionsAccountSwitcherUser,PermissionsManageC360AConnections,PermissionsManageReleaseUpdates,PermissionsViewAllProfiles,PermissionsSkipIdentityConfirmation,PermissionsSendCustomNotifications,PermissionsPackaging2Delete,PermissionsViewRestrictionAndScopingRules,PermissionsFSCComprehensiveUserAccess,PermissionsManageTrustMeasures,PermissionsViewTrustMeasures,PermissionsIsotopeCToCUser,PermissionsIsotopeAccess,PermissionsIsotopeLEX,PermissionsQuipMetricsAccess,PermissionsQuipUserEngagementMetrics,PermissionsManageExternalConnections,PermissionsAIViewInsightObjects,PermissionsAICreateInsightObjects,PermissionsViewMLModels,PermissionsNativeWebviewScrolling,PermissionsViewDeveloperName,PermissionsBypassMFAForUiLogins,PermissionsClientSecretRotation,PermissionsUpdateReportTypeReferences,PermissionsAccessToServiceProcess,PermissionsManageOrchInstsAndWorkItems,PermissionsCMSECEAuthoringAccess,PermissionsEnableIPFSUpload,PermissionsEnableBCTransactionPolling,PermissionsFSCArcGraphCommunityUser,Type,UserLicenseId,UserType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsSsoEnabled,Description,LastViewedDate,LastReferencedDate src02.crm_Profile org02.crm_Profile CRM_Profile_ex.sql diff --git a/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt b/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt index acf7303d..b9c5fbf1 100644 --- a/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt +++ b/s3/data/crm/settings/CRM_Sent_Email_vod__c.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -65 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c +66 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c,Email_Group_Id_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,LastActivityDate,MayEdit,IsLocked,Account_Email_vod__c,Account_vod__c,Approved_Email_Template_vod__c,Capture_Datetime_vod__c,Detail_Group_vod__c,Email_Config_Values_vod__c,Email_Content2_vod__c,Email_Content_vod__c,Email_Fragments_vod__c,Email_Sent_Date_vod__c,Failure_Msg_vod__c,Last_Activity_Date_vod__c,Last_Device_vod__c,MC_Capture_Datetime_vod__c,Mobile_ID_vod__c,Opened_vod__c,Product_Display_vod__c,Product_vod__c,Sender_Email_vod__c,Status_vod__c,Valid_Consent_Exists_vod__c,Approved_Document_Views_vod__c,Click_Count_vod__c,Last_Click_Date_vod__c,Last_Open_Date_vod__c,Open_Count_vod__c,Receipt_Entity_Type_vod__c,Receipt_Record_Id_vod__c,Territory_vod__c,Call2_vod__c,Medical_Inquiry_vod__c,Parent_Email_vod__c,Related_Transaction_ID_vod__c,Case_vod__c,Key_Message_vod__c,Suggestion_vod__c,EM_Attendee_vod__c,EM_Event_Speaker_vod__c,EM_Event_Team_Member_vod__c,Event_Attendee_vod__c,Event_vod__c,Medical_Event_vod__c,Scheduled_Send_Datetime_vod__c,User_vod__c,Content_Type_vod__c,Bcc_vod__c,Event_Attendee_Mobile_Id_vod__c,Event_Mobile_Id_vod__c,Activity_Tracking_Mode_vod__c,Email_Source_vod__c,Subject_vod__c,User_Input_Text_vod__c,Email_Group_Id_vod__c src02c.crm_Sent_Email_vod__c org02.crm_Sent_Email_vod__c diff --git a/s3/data/crm/settings/CRM_User.txt b/s3/data/crm/settings/CRM_User.txt index 1d58107e..cac0736f 100644 --- a/s3/data/crm/settings/CRM_User.txt +++ b/s3/data/crm/settings/CRM_User.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -200 -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c +216 +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c src02.crm_User org02.crm_User From d8db17873cc8d893b105c6e3321aa6538c9e066a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 15:10:13 +0900 Subject: [PATCH 941/962] =?UTF-8?q?feat:=20=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E5=80=8B=E5=88=A5=E8=A8=AD=E5=AE=9A=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E4=BF=AE=E6=AD=A3=20=E3=82=AB?= =?UTF-8?q?=E3=83=A9=E3=83=A0=E9=A0=86=E5=BA=8F=E5=A4=89=E6=9B=B4=E5=88=86?= =?UTF-8?q?6=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt | 4 ++-- s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt | 4 ++-- s3/data/crm/settings/CRM_Event.txt | 4 ++-- s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt | 4 ++-- s3/data/crm/settings/CRM_Suggestion_vod__c.txt | 4 ++-- s3/data/crm/settings/CRM_Task.txt | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt b/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt index 335b255b..d8bf1999 100644 --- a/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt +++ b/s3/data/crm/settings/CRM_Clm_Presentation_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 46 -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,original_material_approved_in_veritas__c,keywords__c,trade_team__c,ewizard_link__c,business_function__c -Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,original_material_approved_in_veritas__c,keywords__c,trade_team__c,ewizard_link__c,business_function__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,business_function__c,ewizard_link__c,keywords__c,original_material_approved_in_veritas__c,trade_team__c +Id,OwnerId,IsDeleted,Name,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Presentation_Id_vod__c,Product_vod__c,Default_Presentation_vod__c,Training_vod__c,ParentId_vod__c,Hidden_vod__c,Type_vod__c,Approved_vod__c,Copied_From_vod__c,Copy_Date_vod__c,Survey_vod__c,Original_Record_ID_vod__c,Directory_vod__c,End_Date_vod__c,Start_Date_vod__c,Status_vod__c,VExternal_Id_vod__c,Vault_DNS_vod__c,Vault_Doc_Id_vod__c,Vault_External_Id_vod__c,Vault_GUID_vod__c,Vault_Last_Modified_Date_Time_vod__c,Version_vod__c,Enable_Survey_Overlay_vod__c,Description_vod__c,Keywords_vod__c,Content_Channel_vod__c,business_function__c,ewizard_link__c,keywords__c,original_material_approved_in_veritas__c,trade_team__c src02.crm_Clm_Presentation_vod__c org02.crm_Clm_Presentation_vod__c diff --git a/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt b/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt index aa2112a3..8a11df9e 100644 --- a/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt +++ b/s3/data/crm/settings/CRM_Coaching_Report_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 144 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Efforts_of_Year__c,MSJ_Efforts_of_Month__c,MSJ_Skill_Task__c,MSJ_Action_of_This_Month__c,MSJ_Achievement_of_This_Month__c,MSJ_Comment_from_AM__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Efforts_of_Year__c,MSJ_Efforts_of_Month__c,MSJ_Skill_Task__c,MSJ_Action_of_This_Month__c,MSJ_Achievement_of_This_Month__c,MSJ_Comment_from_AM__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Achievement_of_This_Month__c,MSJ_Action_of_This_Month__c,MSJ_Comment_from_AM__c,MSJ_Efforts_of_Month__c,MSJ_Efforts_of_Year__c,MSJ_Skill_Task__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Mobile_ID_vod__c,Manager_vod__c,Employee_vod__c,Review_Date__c,Review_Period__c,Status__c,Comments__c,Strategic_Planning__c,Customer_Focus__c,Knowledge_Expertise__c,Business_Account_Planning__c,Call_Productivity__c,Overall_Rating__c,MSJ_A01__c,MSJ_A02__c,MSJ_A03__c,MSJ_AM_Memo__c,MSJ_Aid_Total__c,MSJ_C0_GC__c,MSJ_C1_GC__c,MSJ_C2_GC__c,MSJ_Countermeasure__c,MSJ_Deadline__c,MSJ_Double_Visit_Time__c,MSJ_Hospital__c,MSJ_K01_FE__c,MSJ_K01_ONC__c,MSJ_K02_FE__c,MSJ_K02_ONC__c,MSJ_K03_FE__c,MSJ_K03_ONC__c,MSJ_K04_FE__c,MSJ_K04_ONC__c,MSJ_K05_FE__c,MSJ_K05_ONC__c,MSJ_K06_FE__c,MSJ_K06_ONC__c,MSJ_K0_GC__c,MSJ_K1_GC__c,MSJ_K2_GC__c,MSJ_Knowledge_Total__c,MSJ_L0_GC__c,MSJ_L1_GC__c,MSJ_L2_GC__c,MSJ_MR_GC__c,MSJ_MR_Problems__c,MSJ_N0_GC__c,MSJ_N1_GC__c,MSJ_N2_GC__c,MSJ_Num_of_DTL__c,MSJ_P01__c,MSJ_P02__c,MSJ_P03__c,MSJ_P04__c,MSJ_P05__c,MSJ_P0_GC__c,MSJ_P1_GC__c,MSJ_P2_GC__c,MSJ_PlanningTotal__c,MSJ_R0_GC__c,MSJ_R1_GC__c,MSJ_R2_GC__c,MSJ_S01__c,MSJ_S02__c,MSJ_S03__c,MSJ_S04__c,MSJ_S05__c,MSJ_S06__c,MSJ_S07__c,MSJ_S08__c,MSJ_S09__c,MSJ_S10__c,MSJ_S11__c,MSJ_S12__c,MSJ_Skill_Total__c,MSJ_After_Call_01__c,MSJ_After_Call_02__c,MSJ_After_Call_03__c,MSJ_After_Call_04__c,MSJ_Closing__c,MSJ_Comment_by_MR__c,MSJ_Confirmed_by_MR__c,MSJ_Createdby__c,MSJ_FT_AM_Name__c,MSJ_Interview_Preparation__c,MSJ_Interview_Reflection__c,MSJ_Notify_To_MR__c,MSJ_Opening__c,MSJ_Others_01_Result__c,MSJ_Others_01__c,MSJ_Others_02_Result__c,MSJ_Others_02__c,MSJ_Patient_Thinking__c,MSJ_Probing__c,MSJ_Supporting__c,MSJ_Patient_Thinking_for_FE__c,MSJ_After_Call_05__c,MSJ_After_Call_06__c,MSJ_After_Call_07__c,MSJ_After_Call_08__c,MSJ_Createdby_FE__c,MSJ_Createdby_ONC__c,MSJ_Development_Level__c,MSJ_Interview_Prep_01__c,MSJ_Interview_Prep_02__c,MSJ_Leadership_Style__c,MSJ_Overcome_01__c,MSJ_Overcome_02__c,MSJ_Overcome_03__c,MSJ_Overcome_04__c,MSJ_Review_01__c,MSJ_Review_02__c,MSJ_SK_01__c,MSJ_SK_02__c,MSJ_SK_03__c,MSJ_SK_04__c,MSJ_SK_05__c,MSJ_SK_06__c,MSJ_SK_07__c,MSJ_SK_08__c,MSJ_SK_09__c,MSJ_SK_10__c,MSJ_Specific_Action__c,MSJ_Training_Point__c,MSJ_Achievement_of_This_Month__c,MSJ_Action_of_This_Month__c,MSJ_Comment_from_AM__c,MSJ_Efforts_of_Month__c,MSJ_Efforts_of_Year__c,MSJ_Skill_Task__c src02c.crm_Coaching_Report_vod__c org02.crm_Coaching_Report_vod__c diff --git a/s3/data/crm/settings/CRM_Event.txt b/s3/data/crm/settings/CRM_Event.txt index b2c94bcd..9f5e1dfe 100644 --- a/s3/data/crm/settings/CRM_Event.txt +++ b/s3/data/crm/settings/CRM_Event.txt @@ -5,8 +5,8 @@ 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 +Id,RecordTypeId,WhoId,WhatId,Subject,Location,IsAllDayEvent,ActivityDateTime,ActivityDate,DurationInMinutes,StartDateTime,EndDateTime,EndDate,Description,AccountId,OwnerId,IsPrivate,ShowAs,IsDeleted,IsChild,IsGroupEvent,GroupEventType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateTime,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,ReminderDateTime,IsReminderSet,EventSubtype,IsRecurrence2Exclusion,Recurrence2PatternText,Recurrence2PatternVersion,IsRecurrence2,IsRecurrence2Exception,Recurrence2PatternStartDate,Recurrence2PatternTimeZone,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +Id,RecordTypeId,WhoId,WhatId,Subject,Location,IsAllDayEvent,ActivityDateTime,ActivityDate,DurationInMinutes,StartDateTime,EndDateTime,EndDate,Description,AccountId,OwnerId,IsPrivate,ShowAs,IsDeleted,IsChild,IsGroupEvent,GroupEventType,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateTime,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,ReminderDateTime,IsReminderSet,EventSubtype,IsRecurrence2Exclusion,Recurrence2PatternText,Recurrence2PatternVersion,IsRecurrence2,IsRecurrence2Exception,Recurrence2PatternStartDate,Recurrence2PatternTimeZone,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c src02c.crm_Event org02.crm_Event diff --git a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt index 11064620..ac63dfcc 100644 --- a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt +++ b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 66 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Type_of_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Starred_Insight__c,MSJ_Disclaimer__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Approval_Status__c,MSJ_Insight_Owner_Sharing__c,MSJ_Description_J__c,MSJ_Summary_J__c,MSJ_Level_1J__c,MSJ_Level_2J__c,MSJ_HighlightPanel_Display_J__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Type_of_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Starred_Insight__c,MSJ_Disclaimer__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Approval_Status__c,MSJ_Insight_Owner_Sharing__c,MSJ_Description_J__c,MSJ_Summary_J__c,MSJ_Level_1J__c,MSJ_Level_2J__c,MSJ_HighlightPanel_Display_J__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Summary_J__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Summary_J__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c src02m.crm_Medical_Insight_vod__c org02.crm_Medical_Insight_vod__c diff --git a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt index a53c4c53..e20d8016 100644 --- a/s3/data/crm/settings/CRM_Suggestion_vod__c.txt +++ b/s3/data/crm/settings/CRM_Suggestion_vod__c.txt @@ -5,8 +5,8 @@ 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 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Priority_Score_vod__c,Account_vod__c,Action_Count_vod__c,Actioned_vod__c,Call_Objective_CLM_ID_vod__c,Call_Objective_From_Date_vod__c,Call_Objective_On_By_Default_vod__c,Call_Objective_Record_Type_vod__c,Call_Objective_To_Date_vod__c,Dismiss_Count_vod__c,Dismissed_vod__c,Display_Dismiss_vod__c,Display_Mark_As_Complete_vod__c,Display_Score_vod__c,Email_Template_ID_vod__c,Email_Template_Vault_ID_vod__c,Email_Template_vod__c,Expiration_Date_vod__c,Mark_Complete_Count_vod__c,Marked_As_Complete_vod__c,No_Homepage_vod__c,Planned_Call_Date_vod__c,Posted_Date_vod__c,Priority_vod__c,Reason_vod__c,Record_Type_Name_vod__c,Suggestion_External_Id_vod__c,Suppress_Reason_vod__c,Title_vod__c,Suggestion_Survey_vod__c,Category_vod__c,MSJ_Data_Id__c,MSJ_Reason_unformatted__c,MSJ_reason_id__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_Priority_Score_vod__c,Account_vod__c,Action_Count_vod__c,Actioned_vod__c,Call_Objective_CLM_ID_vod__c,Call_Objective_From_Date_vod__c,Call_Objective_On_By_Default_vod__c,Call_Objective_Record_Type_vod__c,Call_Objective_To_Date_vod__c,Dismiss_Count_vod__c,Dismissed_vod__c,Display_Dismiss_vod__c,Display_Mark_As_Complete_vod__c,Display_Score_vod__c,Email_Template_ID_vod__c,Email_Template_Vault_ID_vod__c,Email_Template_vod__c,Expiration_Date_vod__c,Mark_Complete_Count_vod__c,Marked_As_Complete_vod__c,No_Homepage_vod__c,Planned_Call_Date_vod__c,Posted_Date_vod__c,Priority_vod__c,Reason_vod__c,Record_Type_Name_vod__c,Suggestion_External_Id_vod__c,Suppress_Reason_vod__c,Title_vod__c,Suggestion_Survey_vod__c,Category_vod__c,MSJ_Data_Id__c,MSJ_Reason_unformatted__c,MSJ_reason_id__c src02c.crm_Suggestion_vod__c org02.crm_Suggestion_vod__c diff --git a/s3/data/crm/settings/CRM_Task.txt b/s3/data/crm/settings/CRM_Task.txt index fba41118..ccc6afb2 100644 --- a/s3/data/crm/settings/CRM_Task.txt +++ b/s3/data/crm/settings/CRM_Task.txt @@ -5,8 +5,8 @@ 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 +Id,RecordTypeId,WhoId,WhatId,Subject,ActivityDate,Status,Priority,IsHighPriority,OwnerId,Description,IsDeleted,AccountId,IsClosed,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,CallDurationInSeconds,CallType,CallDisposition,CallObject,ReminderDateTime,IsReminderSet,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateOnly,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,RecurrenceRegeneratedType,TaskSubtype,CompletedDateTime,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c +Id,RecordTypeId,WhoId,WhatId,Subject,ActivityDate,Status,Priority,IsHighPriority,OwnerId,Description,IsDeleted,AccountId,IsClosed,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,IsArchived,CallDurationInSeconds,CallType,CallDisposition,CallObject,ReminderDateTime,IsReminderSet,RecurrenceActivityId,IsRecurrence,RecurrenceStartDateOnly,RecurrenceEndDateOnly,RecurrenceTimeZoneSidKey,RecurrenceType,RecurrenceInterval,RecurrenceDayOfWeekMask,RecurrenceDayOfMonth,RecurrenceInstance,RecurrenceMonthOfYear,RecurrenceRegeneratedType,TaskSubtype,CompletedDateTime,Override_Lock_vod__c,Mobile_ID_vod__c,Color_vod__c,Event_Canceled_vod__c,MSJ_Data_ID__c,MSJ_Reason_ID__c,MSJ_Task_External_Id__c,MSJ_Task_Source__c,Followup_Activity_Type_vod__c,MSJ_Visit_Type__c src02c.crm_Task org02.crm_Task From 0767305ec6c39aea270311e29944735f334a79bc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 15:14:18 +0900 Subject: [PATCH 942/962] =?UTF-8?q?feat:=20=E3=82=AB=E3=83=A9=E3=83=A0?= =?UTF-8?q?=E9=A0=86=E5=BA=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt index ac63dfcc..74abbaa8 100644 --- a/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt +++ b/s3/data/crm/settings/CRM_Medical_Insight_vod__c.txt @@ -5,8 +5,8 @@ utf-8 CRLF 1 66 -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Summary_J__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c -Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Therapeutic_Area__c,MSJ_Summary_J__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Summary_J__c,MSJ_Therapeutic_Area__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Account_vod__c,Clinical_Trial_vod__c,Date_vod__c,Description_vod__c,Entity_Reference_Id_vod__c,Interaction_vod__c,Medical_Event_vod__c,Mobile_ID_vod__c,Other_Source_vod__c,Override_Lock_vod__c,Publication_vod__c,Status_vod__c,Summary_vod__c,Unlock_vod__c,Commercial_Medical__c,MSJ_Level_1A__c,MSJ_Level_1B__c,MSJ_Level_2A__c,MSJ_Level_2B__c,MSJ_Level_3A__c,MSJ_Level_3B__c,MSJ_Level_4A__c,MSJ_Level_4B__c,MSJ_SubStatus__c,MSJ_Type_A__c,MSJ_Type_B__c,MSJ_Description_Backup__c,MSJ_Country__c,MSJ_Received_at_Boomi__c,MSJ_Level_1A_Value__c,MSJ_Level_1B_Value__c,MSJ_Level_2A_Value__c,MSJ_Level_2B_Value__c,MSJ_Level_3A_Value__c,MSJ_Level_3B_Value__c,MSJ_Level_4A_Value__c,MSJ_Level_4B_Value__c,MSJ_Hospital_ID__c,MSJ_Hospital_Name__c,MSJ_Hospital__c,MSJ_Approval_Status__c,MSJ_Description_J__c,MSJ_Disclaimer__c,MSJ_HighlightPanel_Display_J__c,MSJ_Insight_Owner_Sharing__c,MSJ_Level_1J__c,MSJ_Not_pharmacovigilance_related__c,MSJ_Starred_Insight__c,MSJ_Summary_J__c,MSJ_Therapeutic_Area__c,MSJ_Type_of_Insight__c,MSJ_Level_2J__c src02m.crm_Medical_Insight_vod__c org02.crm_Medical_Insight_vod__c From 2d9fa09ce80f9674859fc1c60e2c07c17b6edd9a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 17:46:15 +0900 Subject: [PATCH 943/962] =?UTF-8?q?feat:=20=E5=B7=AE=E5=88=86=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88?= =?UTF-8?q?7=E6=9C=AC=E8=BF=BD=E5=8A=A0(=E6=89=BF=E8=AA=8D=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=BB=E3=82=B9=E3=83=BB=E3=83=87=E3=82=A3=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=83=AA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_Directory_vod__c.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_ProcessDefinition.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_ProcessInstance.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_ProcessInstanceNode.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_ProcessInstanceStep.txt | 13 +++++++++++++ .../crm/settings/CRM_ProcessInstanceWorkitem.txt | 13 +++++++++++++ s3/data/crm/settings/CRM_ProcessNode.txt | 13 +++++++++++++ 7 files changed, 91 insertions(+) create mode 100644 s3/data/crm/settings/CRM_Directory_vod__c.txt create mode 100644 s3/data/crm/settings/CRM_ProcessDefinition.txt create mode 100644 s3/data/crm/settings/CRM_ProcessInstance.txt create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceNode.txt create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceStep.txt create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt create mode 100644 s3/data/crm/settings/CRM_ProcessNode.txt diff --git a/s3/data/crm/settings/CRM_Directory_vod__c.txt b/s3/data/crm/settings/CRM_Directory_vod__c.txt new file mode 100644 index 00000000..3db7cc48 --- /dev/null +++ b/s3/data/crm/settings/CRM_Directory_vod__c.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +18 +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Display_Order_vod__c,External_ID_vod__c,Level_vod__c,Parent_Directory_vod__c +Id,OwnerId,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,Display_Order_vod__c,External_ID_vod__c,Level_vod__c,Parent_Directory_vod__c +src02.crm_Directory_vod__c +org02.crm_Directory_vod__c + + diff --git a/s3/data/crm/settings/CRM_ProcessDefinition.txt b/s3/data/crm/settings/CRM_ProcessDefinition.txt new file mode 100644 index 00000000..90d56974 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessDefinition +org02.crm_ProcessDefinition +CRM_ProcessDefinition_ex.sql + diff --git a/s3/data/crm/settings/CRM_ProcessInstance.txt b/s3/data/crm/settings/CRM_ProcessInstance.txt new file mode 100644 index 00000000..b3f9cd76 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstance.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +16 +Id,ProcessDefinitionId,TargetObjectId,Status,CompletedDate,LastActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,SubmittedById,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,ProcessDefinitionId,TargetObjectId,Status,CompletedDate,LastActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,SubmittedById,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessInstance +org02.crm_ProcessInstance + + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceNode.txt b/s3/data/crm/settings/CRM_ProcessInstanceNode.txt new file mode 100644 index 00000000..3c6e3063 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceNode.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +16 +Id,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,ProcessInstanceId,ProcessNodeId,NodeStatus,CompletedDate,LastActorId,ProcessNodeName,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes +Id,IsDeleted,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,ProcessInstanceId,ProcessNodeId,NodeStatus,CompletedDate,LastActorId,ProcessNodeName,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes +src02.crm_ProcessInstanceNode +org02.crm_ProcessInstanceNode + + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep.txt b/s3/data/crm/settings/CRM_ProcessInstanceStep.txt new file mode 100644 index 00000000..735ee3f4 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceStep +org02.crm_ProcessInstanceStep +CRM_ProcessInstanceStep_ex.sql + diff --git a/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt b/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt new file mode 100644 index 00000000..7db5dc2a --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceWorkitem.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +11 +Id,ProcessInstanceId,OriginalActorId,ActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,IsDeleted,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,OriginalActorId,ActorId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,IsDeleted,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceWorkitem +org02.crm_ProcessInstanceWorkitem + + diff --git a/s3/data/crm/settings/CRM_ProcessNode.txt b/s3/data/crm/settings/CRM_ProcessNode.txt new file mode 100644 index 00000000..ab97d394 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode.txt @@ -0,0 +1,13 @@ +CRM +, +utf-8 +" +CRLF +1 +6 +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +src02.crm_ProcessNode +org02.crm_ProcessNode +CRM_ProcessNode_ex.sql + From 5caf62d636a8bb6adc748bd0acead24b6cc9fb81 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 17:49:47 +0900 Subject: [PATCH 944/962] =?UTF-8?q?feat:=20=E5=85=A8=E4=BB=B6=E9=80=A3?= =?UTF-8?q?=E6=90=BA=E8=BF=BD=E5=8A=A03=E6=9C=AC(=E6=89=BF=E8=AA=8D?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=BB=E3=82=B93=E3=81=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt | 14 ++++++++++++++ .../crm/settings/CRM_ProcessInstanceStep_ALL.txt | 14 ++++++++++++++ s3/data/crm/settings/CRM_ProcessNode_ALL.txt | 14 ++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt create mode 100644 s3/data/crm/settings/CRM_ProcessNode_ALL.txt diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt new file mode 100644 index 00000000..f58c2c41 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +Id,Name,DeveloperName,Type,Description,TableEnumOrId,LockType,State,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp +src02.crm_ProcessDefinition_all +org02.crm_ProcessDefinition_all +CRM_ProcessDefinition_ALL_ex.sql + +truncate_src_table:src02.src02.crm_ProcessDefinition_all diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt new file mode 100644 index 00000000..9139997b --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +13 +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +Id,ProcessInstanceId,StepStatus,OriginalActorId,ActorId,Comments,StepNodeId,ElapsedTimeInDays,ElapsedTimeInHours,ElapsedTimeInMinutes,CreatedDate,CreatedById,SystemModstamp +src02.crm_ProcessInstanceStep_all +org02.crm_ProcessInstanceStep_all +CRM_ProcessInstanceStep_ALL_ex.sql + +truncate_src_table:src02.src02.crm_ProcessInstanceStep_all diff --git a/s3/data/crm/settings/CRM_ProcessNode_ALL.txt b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt new file mode 100644 index 00000000..518de73f --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt @@ -0,0 +1,14 @@ +CRM +, +utf-8 +" +CRLF +1 +6 +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +Id,Name,DeveloperName,ProcessDefinitionId,Description,SystemModstamp +src02.crm_ProcessNode_all +org02.crm_ProcessNode_all +CRM_ProcessNode_ALL_ex.sql + +truncate_src_table:src02.src02.crm_ProcessNode_all From b67eb9d543cdd775a9fe6709a4914c12b290208d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 17:54:49 +0900 Subject: [PATCH 945/962] =?UTF-8?q?feat:=20=E6=8B=A1=E5=BC=B5SQL=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=EF=BC=88=E5=B1=A5=E6=AD=B4=E7=AE=A1=E7=90=863?= =?UTF-8?q?=E6=9C=AC=E3=80=81=E3=83=87=E3=83=BC=E3=82=BF=E5=90=8C=E6=9C=9F?= =?UTF-8?q?3=E6=9C=AC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql | 1 + s3/data/crm/settings/CRM_ProcessDefinition_ex.sql | 1 + s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql | 1 + s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql | 1 + s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql | 1 + s3/data/crm/settings/CRM_ProcessNode_ex.sql | 1 + 6 files changed, 6 insertions(+) create mode 100644 s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql create mode 100644 s3/data/crm/settings/CRM_ProcessDefinition_ex.sql create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql create mode 100644 s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql create mode 100644 s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql create mode 100644 s3/data/crm/settings/CRM_ProcessNode_ex.sql diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql new file mode 100644 index 00000000..3b81f574 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessDefinition', 'src02.crm_ProcessDefinition_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql b/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql new file mode 100644 index 00000000..af83cf28 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessDefinition', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql new file mode 100644 index 00000000..abb06152 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessInstanceStep', 'src02.crm_ProcessInstanceStep_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql b/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql new file mode 100644 index 00000000..39f0af64 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessInstanceStep', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql b/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql new file mode 100644 index 00000000..b81a5836 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ALL_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_data_sync('src02.crm_ProcessNode', 'src02.crm_ProcessNode_all', 'SystemModstamp'); diff --git a/s3/data/crm/settings/CRM_ProcessNode_ex.sql b/s3/data/crm/settings/CRM_ProcessNode_ex.sql new file mode 100644 index 00000000..1d8d6918 --- /dev/null +++ b/s3/data/crm/settings/CRM_ProcessNode_ex.sql @@ -0,0 +1 @@ +CALL internal02.crm_history('src02.crm_ProcessNode', 'SystemModstamp'); From 4cf7d5e66c15b1c14d1cfdb2423abbb11ca34fe2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 6 Mar 2024 17:58:22 +0900 Subject: [PATCH 946/962] =?UTF-8?q?feat:=20=E5=80=8B=E5=88=A5=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=83=9E=E3=83=83=E3=83=94=E3=83=B3=E3=82=B0=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E4=BF=AE=E6=AD=A3=EF=BC=88=E5=B7=AE?= =?UTF-8?q?=E5=88=867=E6=9C=AC=E3=80=81=E5=85=A8=E4=BB=B63=E6=9C=AC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/configmap.config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/s3/data/crm/settings/configmap.config b/s3/data/crm/settings/configmap.config index d89f98e3..8c4249dc 100644 --- a/s3/data/crm/settings/configmap.config +++ b/s3/data/crm/settings/configmap.config @@ -61,9 +61,19 @@ CRM_Task_[0-9]{14}\.(CSV|csv) CRM_Task.txt CRM_MSJ_Congresses__c_[0-9]{14}\.(CSV|csv) CRM_MSJ_Congresses__c.txt CRM_Publication__c_[0-9]{14}\.(CSV|csv) CRM_Publication__c.txt CRM_Clinical_Trial__c_[0-9]{14}\.(CSV|csv) CRM_Clinical_Trial__c.txt +CRM_ProcessDefinition_[0-9]{14}\.(CSV|csv) CRM_ProcessDefinition.txt +CRM_ProcessInstance_[0-9]{14}\.(CSV|csv) CRM_ProcessInstance.txt +CRM_ProcessInstanceStep_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceStep.txt +CRM_ProcessInstanceNode_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceNode.txt +CRM_ProcessNode_[0-9]{14}\.(CSV|csv) CRM_ProcessNode.txt +CRM_ProcessInstanceWorkitem_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceWorkitem.txt +CRM_Directory_vod__c_[0-9]{14}\.(CSV|csv) CRM_Directory_vod__c.txt /* 【CRMデータ 全件連携】 */ CRM_Territory2_ALL_[0-9]{14}\.(CSV|csv) CRM_Territory2_ALL.txt CRM_UserTerritory2Association_ALL_[0-9]{14}\.(CSV|csv) CRM_UserTerritory2Association_ALL.txt CRM_Group_ALL_[0-9]{14}\.(CSV|csv) CRM_Group_ALL.txt CRM_ObjectTerritory2Association_ALL_[0-9]{14}\.(CSV|csv) CRM_ObjectTerritory2Association_ALL.txt CRM_AccountShare_ALL_[0-9]{14}\.(CSV|csv) CRM_AccountShare_ALL.txt +CRM_ProcessDefinition_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessDefinition_ALL.txt +CRM_ProcessInstanceStep_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessInstanceStep_ALL.txt +CRM_ProcessNode_ALL_[0-9]{14}\.(CSV|csv) CRM_ProcessNode_ALL.txt From fb29466a4a5f40fb947d92e48cfe3c33fc44ef0f Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 7 Mar 2024 14:20:57 +0900 Subject: [PATCH 947/962] =?UTF-8?q?=E3=83=A1=E3=83=AB=E3=82=AF=E6=96=BD?= =?UTF-8?q?=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=83=A9=E3=83=A0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index bbaa5fd0..585a261d 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -86,7 +86,14 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): END AS address, fmv1.postal_cd, fmv1.tel_num, - LEFT(fmv1.closed_dt, 10), + CASE + WHEN + fmv1.fcl_type IN ('20') THEN LEFT(fmv1.closed_dt, 10) + WHEN + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.closed_dt != '9999-12-31' THEN LEFT(fmv1.closed_dt, 10) + ELSE + null + END, fmv1.v_inst_cd, fmv1.ins_dt, fmv1.upd_dt From 6ecb2b0f0cddd9564e47a9586ff2b94cbff693b6 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 7 Mar 2024 16:46:42 +0900 Subject: [PATCH 948/962] =?UTF-8?q?=E6=8A=BD=E5=87=BA=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 585a261d..527f0e02 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -87,13 +87,13 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): fmv1.postal_cd, fmv1.tel_num, CASE - WHEN - fmv1.fcl_type IN ('20') THEN LEFT(fmv1.closed_dt, 10) - WHEN - fmv1.fcl_type IN ('A1', 'A0') AND fmv1.closed_dt != '9999-12-31' THEN LEFT(fmv1.closed_dt, 10) - ELSE - null - END, + WHEN + fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) + WHEN + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN fmv1.end_date + ELSE + null + END, fmv1.v_inst_cd, fmv1.ins_dt, fmv1.upd_dt From 7b7ff612f5a9cd792e73c6671cdd23fda64671d0 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 7 Mar 2024 17:28:00 +0900 Subject: [PATCH 949/962] =?UTF-8?q?=E6=97=A5=E4=BB=98=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=83=83=E3=83=88=E6=BC=8F=E3=82=8C=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=83=BBAS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index 527f0e02..e39c5da9 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -88,12 +88,12 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): fmv1.tel_num, CASE WHEN - fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) + fmv1.fcl_type BETWEEN '20' AND '29' THEN DATE_FORMAT(LEFT(fmv1.closed_dt, 10), "%Y%m%d") WHEN - fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN fmv1.end_date + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y%m%d") ELSE null - END, + END AS delete_date, fmv1.v_inst_cd, fmv1.ins_dt, fmv1.upd_dt From 261553880710bcac80bd1f51809cbee4db7e00d0 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Fri, 8 Mar 2024 09:32:03 +0900 Subject: [PATCH 950/962] =?UTF-8?q?=E6=97=A5=E4=BB=98=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=BC=E3=83=9E=E3=83=83=E3=83=88=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/laundering/mst_inst_laundering.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py index e39c5da9..783b7db2 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/mst_inst_laundering.py @@ -88,9 +88,9 @@ def _insert_mst_inst_from_fcl_mst_v(db: Database): fmv1.tel_num, CASE WHEN - fmv1.fcl_type BETWEEN '20' AND '29' THEN DATE_FORMAT(LEFT(fmv1.closed_dt, 10), "%Y%m%d") + fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) WHEN - fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y%m%d") + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y-%m-%d") ELSE null END AS delete_date, From ce4d44cbb8b9e9c124a5f4de5152069809b6a0f4 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 8 Mar 2024 14:24:00 +0900 Subject: [PATCH 951/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=80=82=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E6=95=B0=E3=81=AE=E4=BF=AE=E6=AD=A3=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt index d5663949..c32f99d6 100644 --- a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt @@ -4,7 +4,7 @@ utf-8 " CRLF 1 -47 +49 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c src02m.crm_MSJ_Inquiry_Assignment__c From 731f8d4e7bfa765b86072939e7814692d911a5f5 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 8 Mar 2024 14:25:44 +0900 Subject: [PATCH 952/962] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=80=82=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E6=95=B0=E3=81=AE=E4=BF=AE=E6=AD=A3=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt index c32f99d6..4ea3e4c9 100644 --- a/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt +++ b/s3/data/crm/settings/CRM_MSJ_Inquiry_Assignment__c.txt @@ -4,7 +4,7 @@ utf-8 " CRLF 1 -49 +52 Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c Id,IsDeleted,Name,RecordTypeId,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,MayEdit,IsLocked,LastViewedDate,LastReferencedDate,MSJ_Medical_Inquiry__c,MSJ_Close__c,MSJ_Doctor_Name__c,MSJ_Hospital_Name__c,MSJ_Indication__c,MSJ_Inquiry_Text__c,MSJ_MEC_User__c,MSJ_MSL_Manager__c,MSJ_MSL_User__c,MSJ_Notice_to_MR__c,MSJ_Product_for_MEC__c,MSJ_Product_for_MR__c,MSJ_Reply_Date__c,MSJ_Reply__c,MSJ_AE_Infomation__c,MSJ_Cancel__c,MSJ_FAQ_number_c__c,MSJ_Return_Call__c,MSJ_Inquiry_Origin__c,First_Response__c,Inquiry_Created_Date__c,Inquiry_Type_1__c,Inquiry_Type_2__c,MSJ_First_User__c,MSJ_MEC_Comment__c,MSJ_Send_Email__c,MSJ_Temp_Aggregated_Info__c,MSJ_AE_Report__c,MSJ_Background__c,MSJ_Inquiry_Date__c,MSJ_MSL_Support__c,MSJ_Handover_Comment__c,MSJ_Handover_Email__c,MSJ_Material_Requirement__c,MSJ_Material_Used__c,MSJ_File_Attached__c,MSJ_Off_Label__c,MSJ_Include_Quality_Complaint__c,MSJ_PSC__c src02m.crm_MSJ_Inquiry_Assignment__c From 6f814e83a49f43d232020c22ee324012ef11d22d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 11 Mar 2024 14:58:34 +0900 Subject: [PATCH 953/962] =?UTF-8?q?fix:=20S11=20#13,=20#14=20=E6=9C=AA?= =?UTF-8?q?=E5=8F=97=E9=A0=98=E9=80=9A=E7=9F=A5=E5=B9=B4=E6=9C=88=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=E3=81=AE=E4=B8=8D?= =?UTF-8?q?=E5=82=99=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encise-data-unreceive-check.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py index d762c275..389c82f9 100644 --- a/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py +++ b/lambda/encise-data-unreceive-check/encise-data-unreceive-check.py @@ -223,8 +223,9 @@ def encise_data_unreceive_check(records: list, execute_month: str) -> tuple[list is_file_not_exists = False # 存在したファイルの年月部分を抜き出し、チェック対象年月(処理稼働月-1)である場合 match_group_yyyymm = match_result.group(1) - check_target_yyyymm = (datetime.datetime.now( - ZoneInfo(TZ)) - relativedelta(month=1)).strftime('%Y%m') + today = datetime.datetime.now(ZoneInfo(TZ)) + minus_1_month = today + relativedelta(months=-1) + check_target_yyyymm = minus_1_month.strftime('%Y%m') if match_group_yyyymm == check_target_yyyymm: logger.info( f'I-04-04 I/Fファイルの受領を確認しました ファイル名:{file_name}') From c47af3577540ec620d8093a60bd4f952a28d2efe Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 12 Mar 2024 10:13:35 +0900 Subject: [PATCH 954/962] =?UTF-8?q?feat:=20.log=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=82=92git=E7=AE=A1=E7=90=86=E5=AF=BE=E8=B1=A1?= =?UTF-8?q?=E3=81=8B=E3=82=89=E9=99=A4=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index edc232ea..bbfbbcbe 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ stepfunctions/*/build # python test .coverage .report/ + +# log +.log \ No newline at end of file From 6dafd8215a8940e5f7e76b801e50636dff662e3f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 12 Mar 2024 10:15:58 +0900 Subject: [PATCH 955/962] =?UTF-8?q?feat:=20=E4=B8=80=E6=B0=97=E9=80=9A?= =?UTF-8?q?=E8=B2=AB=E3=83=86=E3=82=B9=E3=83=88=E3=81=A7=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B0=E3=82=92=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=AB=E6=9B=B8=E3=81=8D=E5=87=BA=E3=81=99=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/.gitignore | 20 ++++++++++++++++++++ ecs/crm-datafetch/tests/test_walk_through.py | 9 +++++++++ 2 files changed, 29 insertions(+) create mode 100644 ecs/crm-datafetch/.gitignore diff --git a/ecs/crm-datafetch/.gitignore b/ecs/crm-datafetch/.gitignore new file mode 100644 index 00000000..bbfbbcbe --- /dev/null +++ b/ecs/crm-datafetch/.gitignore @@ -0,0 +1,20 @@ +# Node.jsで実装されたLambdaの管理対象外ファイル群 +package-lock.json +node_modules/ +# ローカル確認用環境変数ファイル +.env +# Pythonの仮想環境ファイル +.venv +# pythonのキャッシュファイル +__pycache__/ + +# StepFunctionsステートメント定義変換後のフォルダ +stepfunctions/*/build +**/.vscode/settings.json + +# python test +.coverage +.report/ + +# log +.log \ No newline at end of file diff --git a/ecs/crm-datafetch/tests/test_walk_through.py b/ecs/crm-datafetch/tests/test_walk_through.py index e2be6670..75bf894d 100644 --- a/ecs/crm-datafetch/tests/test_walk_through.py +++ b/ecs/crm-datafetch/tests/test_walk_through.py @@ -6,6 +6,7 @@ from datetime import datetime, timezone import boto3 import pytest + from src.controller import controller from src.parser.json_parser import JsonParser from src.system_var.constants import YYYYMMDDTHHMMSSTZ @@ -114,6 +115,10 @@ def test_walk_through(s3_test, s3_client, monkeypatch, caplog): logger.info(f'##########################') # Assertion log_messages = caplog.messages + # ログの目視確認を容易にするため、ローカルファイルに書き出す。 + with open('crm_datafetch_test_walk_through_diff.log', 'w', encoding='utf8') as f: + f.write('\n'.join(log_messages)) + # ループ前のログ確認 assert 'I-CTRL-01 CRMデータ取得処理を開始します' in log_messages assert 'I-CTRL-02 データ取得準備処理呼び出し' in log_messages @@ -170,6 +175,10 @@ def test_walk_through(s3_test, s3_client, monkeypatch, caplog): logger.info(f'##########################') # ログ再取得 log_messages_all = caplog.messages + # ログの目視確認を容易にするため、ローカルファイルに書き出す。 + with open('crm_datafetch_test_walk_through_all.log', 'w', encoding='utf8') as f: + f.write('\n'.join(log_messages_all)) + object_info_list_all = object_info_files[1] # 開始ログなどはテスト済みなのでチェックを省く for object_info in object_info_list_all['objects']: From 74de4d2251ce39ee27911a274115484a91fb0f96 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 14 Mar 2024 10:02:33 +0900 Subject: [PATCH 956/962] =?UTF-8?q?fix:=20=E3=82=A4=E3=83=B3=E3=83=9D?= =?UTF-8?q?=E3=83=BC=E3=83=88=E6=96=B9=E6=B3=95=E3=81=AB=E4=B8=8D=E5=82=99?= =?UTF-8?q?=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt | 2 +- s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt | 2 +- s3/data/crm/settings/CRM_ProcessNode_ALL.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt index f58c2c41..ac6f851b 100644 --- a/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt +++ b/s3/data/crm/settings/CRM_ProcessDefinition_ALL.txt @@ -11,4 +11,4 @@ src02.crm_ProcessDefinition_all org02.crm_ProcessDefinition_all CRM_ProcessDefinition_ALL_ex.sql -truncate_src_table:src02.src02.crm_ProcessDefinition_all +truncate_src_table:src02.crm_ProcessDefinition_all diff --git a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt index 9139997b..a1ea6a4f 100644 --- a/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt +++ b/s3/data/crm/settings/CRM_ProcessInstanceStep_ALL.txt @@ -11,4 +11,4 @@ src02.crm_ProcessInstanceStep_all org02.crm_ProcessInstanceStep_all CRM_ProcessInstanceStep_ALL_ex.sql -truncate_src_table:src02.src02.crm_ProcessInstanceStep_all +truncate_src_table:src02.crm_ProcessInstanceStep_all diff --git a/s3/data/crm/settings/CRM_ProcessNode_ALL.txt b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt index 518de73f..6aea379d 100644 --- a/s3/data/crm/settings/CRM_ProcessNode_ALL.txt +++ b/s3/data/crm/settings/CRM_ProcessNode_ALL.txt @@ -11,4 +11,4 @@ src02.crm_ProcessNode_all org02.crm_ProcessNode_all CRM_ProcessNode_ALL_ex.sql -truncate_src_table:src02.src02.crm_ProcessNode_all +truncate_src_table:src02.crm_ProcessNode_all From 3a18e30a4a8adec7b23358c7d37245bbc3fb5fe0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 14 Mar 2024 15:29:10 +0900 Subject: [PATCH 957/962] =?UTF-8?q?feat:=20User=E3=82=AA=E3=83=96=E3=82=B8?= =?UTF-8?q?=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AE=E9=A0=85=E7=9B=AE=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E6=9B=B8=E3=81=8B=E3=82=89=E6=B6=88=E3=81=88=E3=81=9F?= =?UTF-8?q?2=E9=A0=85=E7=9B=AE=E3=81=AF=E5=BC=95=E3=81=8D=E7=B6=9A?= =?UTF-8?q?=E3=81=8D=E9=80=A3=E6=90=BA=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=80=81=E6=9C=AB=E5=B0=BE=E3=81=AE=E9=A0=85=E7=9B=AE=E3=81=A8?= =?UTF-8?q?=E3=81=97=E3=81=A6=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/config/crm/object_info/crm_object_list_diff.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f8ff04da..e4b17fdd 100644 --- a/s3/config/crm/object_info/crm_object_list_diff.json +++ b/s3/config/crm/object_info/crm_object_list_diff.json @@ -1792,8 +1792,6 @@ "UserPreferencesShowPostalCodeToGuestUsers", "UserPreferencesShowCountryToGuestUsers", "UserPreferencesShowForecastingChangeSignals", - // "UserPreferencesHideInvoicesRedirectConfirmation", - // "UserPreferencesHideStatementsRedirectConfirmation", "UserPreferencesPathAssistantCollapsed", "UserPreferencesCacheDiagnostics", "UserPreferencesShowEmailToGuestUsers", @@ -1914,7 +1912,9 @@ "MS_Outlook_Last_Push_Activity_vod__c", "Enable_MS_Outlook_Calendar_vod__c", "Last_iPad_Updates_Applied_vod__c", - "Last_iPhone_Updates_Applied_vod__c" + "Last_iPhone_Updates_Applied_vod__c", + "UserPreferencesHideInvoicesRedirectConfirmation", + "UserPreferencesHideStatementsRedirectConfirmation" ], "is_skip": false, "is_update_last_fetch_datetime": true From c1289ff1e5eea873a69b4bfadd4c14584e6a5a3b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 14 Mar 2024 15:43:30 +0900 Subject: [PATCH 958/962] =?UTF-8?q?feat:=20User=E3=82=AA=E3=83=96=E3=82=B8?= =?UTF-8?q?=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AE=E9=A0=85=E7=9B=AE=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E6=9B=B8=E3=81=8B=E3=82=89=E6=B6=88=E3=81=88=E3=81=9F?= =?UTF-8?q?2=E9=A0=85=E7=9B=AE=E3=81=AF=E5=BC=95=E3=81=8D=E7=B6=9A?= =?UTF-8?q?=E3=81=8D=E9=80=A3=E6=90=BA=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=80=81=E6=9C=AB=E5=B0=BE=E3=81=AE=E9=A0=85=E7=9B=AE=E3=81=A8?= =?UTF-8?q?=E3=81=97=E3=81=A6=E7=99=BB=E9=8C=B2=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- s3/data/crm/settings/CRM_User.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/s3/data/crm/settings/CRM_User.txt b/s3/data/crm/settings/CRM_User.txt index cac0736f..2023bb99 100644 --- a/s3/data/crm/settings/CRM_User.txt +++ b/s3/data/crm/settings/CRM_User.txt @@ -4,9 +4,9 @@ utf-8 " CRLF 1 -216 -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c -Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c +218 +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation +Id,Username,LastName,FirstName,Name,CompanyName,Division,Department,Title,Street,City,State,PostalCode,Country,Latitude,Longitude,GeocodeAccuracy,Address,Email,EmailPreferencesAutoBcc,EmailPreferencesAutoBccStayInTouch,EmailPreferencesStayInTouchReminder,SenderEmail,SenderName,Signature,StayInTouchSubject,StayInTouchSignature,StayInTouchNote,Phone,Fax,MobilePhone,Alias,CommunityNickname,BadgeText,IsActive,TimeZoneSidKey,UserRoleId,LocaleSidKey,ReceivesInfoEmails,ReceivesAdminInfoEmails,EmailEncodingKey,ProfileId,UserType,LanguageLocaleKey,EmployeeNumber,DelegatedApproverId,ManagerId,LastLoginDate,CreatedDate,CreatedById,LastModifiedDate,LastModifiedById,SystemModstamp,OfflineTrialExpirationDate,OfflinePdaTrialExpirationDate,UserPermissionsMarketingUser,UserPermissionsOfflineUser,UserPermissionsWirelessUser,UserPermissionsAvantgoUser,UserPermissionsCallCenterAutoLogin,UserPermissionsSFContentUser,UserPermissionsInteractionUser,UserPermissionsSupportUser,UserPermissionsChatterAnswersUser,ForecastEnabled,UserPreferencesActivityRemindersPopup,UserPreferencesEventRemindersCheckboxDefault,UserPreferencesTaskRemindersCheckboxDefault,UserPreferencesReminderSoundOff,UserPreferencesDisableAllFeedsEmail,UserPreferencesApexPagesDeveloperMode,UserPreferencesReceiveNoNotificationsAsApprover,UserPreferencesReceiveNotificationsAsDelegatedApprover,UserPreferencesHideCSNGetChatterMobileTask,UserPreferencesHideCSNDesktopTask,UserPreferencesHideChatterOnboardingSplash,UserPreferencesHideSecondChatterOnboardingSplash,UserPreferencesShowTitleToExternalUsers,UserPreferencesShowManagerToExternalUsers,UserPreferencesShowEmailToExternalUsers,UserPreferencesShowWorkPhoneToExternalUsers,UserPreferencesShowMobilePhoneToExternalUsers,UserPreferencesShowFaxToExternalUsers,UserPreferencesShowStreetAddressToExternalUsers,UserPreferencesShowCityToExternalUsers,UserPreferencesShowStateToExternalUsers,UserPreferencesShowPostalCodeToExternalUsers,UserPreferencesShowCountryToExternalUsers,UserPreferencesShowProfilePicToGuestUsers,UserPreferencesShowTitleToGuestUsers,UserPreferencesShowCityToGuestUsers,UserPreferencesShowStateToGuestUsers,UserPreferencesShowPostalCodeToGuestUsers,UserPreferencesShowCountryToGuestUsers,UserPreferencesShowForecastingChangeSignals,UserPreferencesPathAssistantCollapsed,UserPreferencesCacheDiagnostics,UserPreferencesShowEmailToGuestUsers,UserPreferencesShowManagerToGuestUsers,UserPreferencesShowWorkPhoneToGuestUsers,UserPreferencesShowMobilePhoneToGuestUsers,UserPreferencesShowFaxToGuestUsers,UserPreferencesShowStreetAddressToGuestUsers,UserPreferencesLightningExperiencePreferred,UserPreferencesPreviewLightning,UserPreferencesHideEndUserOnboardingAssistantModal,UserPreferencesHideLightningMigrationModal,UserPreferencesHideSfxWelcomeMat,UserPreferencesHideBiggerPhotoCallout,UserPreferencesGlobalNavBarWTShown,UserPreferencesGlobalNavGridMenuWTShown,UserPreferencesCreateLEXAppsWTShown,UserPreferencesFavoritesWTShown,UserPreferencesRecordHomeSectionCollapseWTShown,UserPreferencesRecordHomeReservedWTShown,UserPreferencesFavoritesShowTopFavorites,UserPreferencesExcludeMailAppAttachments,UserPreferencesSuppressTaskSFXReminders,UserPreferencesSuppressEventSFXReminders,UserPreferencesPreviewCustomTheme,UserPreferencesHasCelebrationBadge,UserPreferencesUserDebugModePref,UserPreferencesSRHOverrideActivities,UserPreferencesNewLightningReportRunPageEnabled,UserPreferencesReverseOpenActivitiesView,UserPreferencesHasSentWarningEmail,UserPreferencesHasSentWarningEmail238,UserPreferencesHasSentWarningEmail240,UserPreferencesHideBrowseProductRedirectConfirmation,UserPreferencesHideOnlineSalesAppWelcomeMat,ContactId,AccountId,CallCenterId,Extension,FederationIdentifier,AboutMe,FullPhotoUrl,SmallPhotoUrl,IsExtIndicatorVisible,OutOfOfficeMessage,MediumPhotoUrl,DigestFrequency,DefaultGroupNotificationFrequency,LastViewedDate,LastReferencedDate,BannerPhotoUrl,SmallBannerPhotoUrl,MediumBannerPhotoUrl,IsProfilePhotoActive,IndividualId,Last_Mobile_Connect_vod__c,Last_Tablet_Connect_vod__c,Last_Mobile_Connect_Version_vod__c,Last_Tablet_Connect_Version_vod__c,Last_Mobile_Sync_vod__c,Last_Tablet_Sync_vod__c,RaiseLoggingLevel_vod__c,SendDetailedLog_vod__c,Last_Blackberry_Connect_vod__c,Last_Blackberry_Connect_Version_vod__c,Last_Blackberry_Sync_vod__c,Force_Full_Refresh_vod__c,Override_SystemModstamp_Timestamp_vod__c,Facetime_Email_vod__c,Facetime_Phone_vod__c,Product_Expertise_vod__c,Available_vod__c,Available_Last_Update_vod__c,Last_iPad_Connect_Version_vod__c,Last_iPad_Connect_vod__c,Last_iPad_Sync_vod__c,Inventory_Order_Allocation_Group_vod__c,Concur_User_Id_vod__c,Last_iPad_iOS_Version_vod__c,Approved_Email_Admin_vod__c,Last_WinModern_Connect_Version_vod__c,Last_WinModern_Connect_vod__c,Last_WinModern_Sync_vod__c,Primary_Territory_vod__c,Analytics_Admin_vod__c,Content_Admin_vod__c,Last_WinModern_Windows_Version_vod__c,Upload_VTrans_vod__c,Sync_Frequency_vjh__c,Clear_Client_Sync_Errors_vod__c,Remote_Meeting_Host_Id_vod__c,Remote_Meeting_Host_Token_vod__c,Last_iPhone_Connect_Version_vod__c,Last_iPhone_Connect_vod__c,Last_iPhone_Sync_vod__c,Last_iPhone_iOS_Version_vod__c,Remote_Meeting_Start_From_CRM_Online_vod__c,Country_Code_vod__c,User_Type_vod__c,Engage_Group_Provisioning_Status_vod__c,Engage_Group_Request_vod__c,Engage_Group_vod__c,Last_CRMDesktop_Mac_Sync_vod__c,Last_CRMDesktop_Mac_Version_vod__c,Last_CRMDesktop_Windows_Sync_vod__c,Last_CRMDesktop_Windows_Version_vod__c,MSJ_Test_User__c,Last_Android_Connect_Version_vod__c,Last_Android_Connect_vod__c,Last_Android_OS_Version_vod__c,Last_Android_Sync_vod__c,Last_CRMDesktop_Mac_Conn_Ver_vod__c,Last_CRMDesktop_Mac_Connect_vod__c,Last_CRMDesktop_Windows_Conn_Ver_vod__c,Last_CRMDesktop_Windows_Connect_vod__c,MS_Graph_API_Authorized_vod__c,MS_Outlook_Last_Pull_Activity_vod__c,MS_Outlook_Last_Push_Activity_vod__c,Enable_MS_Outlook_Calendar_vod__c,Last_iPad_Updates_Applied_vod__c,Last_iPhone_Updates_Applied_vod__c,UserPreferencesHideInvoicesRedirectConfirmation,UserPreferencesHideStatementsRedirectConfirmation src02.crm_User org02.crm_User From 3f506a90f347670154bd3f49a71c510905800a7e Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Mon, 18 Mar 2024 16:01:14 +0900 Subject: [PATCH 959/962] =?UTF-8?q?=E8=84=86=E5=BC=B1=E6=80=A7=E3=82=B9?= =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=B3=E3=81=AEpipfile=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 301 ++++++------ ecs/jskult-batch-daily/Pipfile.lock | 270 ++++++----- ecs/jskult-batch-laundering/Pipfile.lock | 111 +++-- ecs/jskult-dbdump/Pipfile.lock | 111 +++-- ecs/jskult-webapp/Pipfile.lock | 459 +++++++++--------- .../check-view-security-option/Pipfile.lock | 90 ++-- 6 files changed, 696 insertions(+), 646 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 4608c4cd..dcb85854 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,19 +26,20 @@ }, "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "certifi": { "hashes": [ @@ -204,41 +205,41 @@ }, "cryptography": { "hashes": [ - "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", - "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", - "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", - "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", - "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", - "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", - "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", - "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", - "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", - "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", - "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", - "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", - "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", - "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", - "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", - "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", - "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", - "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", - "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", - "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", - "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", - "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", - "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", - "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", - "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", - "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", - "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", - "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", - "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", - "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", - "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", - "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], "markers": "python_version >= '3.7'", - "version": "==42.0.4" + "version": "==42.0.5" }, "idna": { "hashes": [ @@ -372,11 +373,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "pytz": { "hashes": [ @@ -438,6 +439,7 @@ "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.2.3" }, "urllib3": { @@ -464,23 +466,25 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "certifi": { "hashes": [ @@ -649,99 +653,99 @@ "toml" ], "hashes": [ - "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73", - "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10", - "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86", - "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55", - "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb", - "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b", - "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac", - "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c", - "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe", - "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1", - "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244", - "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405", - "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64", - "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643", - "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95", - "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962", - "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf", - "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469", - "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8", - "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f", - "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3", - "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc", - "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3", - "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3", - "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647", - "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b", - "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c", - "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2", - "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17", - "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95", - "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047", - "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec", - "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7", - "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088", - "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f", - "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50", - "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a", - "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9", - "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265", - "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642", - "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e", - "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b", - "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e", - "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a", - "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef", - "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03", - "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2", - "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6", - "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def", - "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305", - "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a", - "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c" + "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa", + "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003", + "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f", + "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c", + "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e", + "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0", + "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9", + "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52", + "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", + "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", + "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0", + "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079", + "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352", + "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", + "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", + "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", + "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", + "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765", + "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc", + "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", + "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501", + "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7", + "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", + "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f", + "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", + "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", + "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", + "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51", + "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840", + "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", + "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", + "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e", + "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45", + "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba", + "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d", + "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", + "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", + "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", + "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", + "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9", + "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a", + "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", + "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1", + "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3", + "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914", + "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", + "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", + "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d", + "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0", + "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94", + "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc", + "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2" ], "markers": "python_version >= '3.8'", - "version": "==7.4.2" + "version": "==7.4.3" }, "cryptography": { "hashes": [ - "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", - "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", - "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", - "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", - "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", - "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", - "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", - "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", - "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", - "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", - "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", - "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", - "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", - "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", - "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", - "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", - "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", - "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", - "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", - "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", - "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", - "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", - "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", - "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", - "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", - "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", - "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", - "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", - "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", - "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", - "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", - "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], "markers": "python_version >= '3.7'", - "version": "==42.0.4" + "version": "==42.0.5" }, "exceptiongroup": { "hashes": [ @@ -757,6 +761,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "idna": { @@ -867,19 +872,20 @@ }, "moto": { "hashes": [ - "sha256:71bb832a18b64f10fc4cec117b9b0e2305e5831d9a17eb74f6b9819ed7613843", - "sha256:7e27395e5c63ff9554ae14b5baa41bfe6d6b1be0e59eb02977c6ce28411246de" + "sha256:070ac2edf89ad7aee28534481ce68e2f344c8a6a8fefec5427eea0d599bfdbdb", + "sha256:261d312d1d69c2afccb450a0566666d7b75d76ed6a7d00aac278a9633b073ff0" ], "index": "pypi", - "version": "==5.0.2" + "markers": "python_version >= '3.8'", + "version": "==5.0.3" }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pluggy": { "hashes": [ @@ -914,11 +920,12 @@ }, "pytest": { "hashes": [ - "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae", - "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca" + "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7", + "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044" ], "index": "pypi", - "version": "==8.0.1" + "markers": "python_version >= '3.8'", + "version": "==8.1.1" }, "pytest-cov": { "hashes": [ @@ -926,6 +933,7 @@ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==4.1.0" }, "pytest-html": { @@ -934,6 +942,7 @@ "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==4.1.1" }, "pytest-metadata": { @@ -946,11 +955,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "pyyaml": { "hashes": [ diff --git a/ecs/jskult-batch-daily/Pipfile.lock b/ecs/jskult-batch-daily/Pipfile.lock index 4085bbed..ee64e81a 100644 --- a/ecs/jskult-batch-daily/Pipfile.lock +++ b/ecs/jskult-batch-daily/Pipfile.lock @@ -18,19 +18,20 @@ "default": { "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "greenlet": { "hashes": [ @@ -109,16 +110,16 @@ "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], - "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.1.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "s3transfer": { "hashes": [ @@ -138,58 +139,59 @@ }, "sqlalchemy": { "hashes": [ - "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", - "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", - "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", - "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", - "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", - "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", - "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", - "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", - "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", - "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", - "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", - "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", - "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", - "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", - "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", - "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", - "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", - "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", - "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", - "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", - "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", - "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", - "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", - "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", - "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", - "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", - "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", - "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", - "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", - "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", - "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", - "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", - "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", - "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", - "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", - "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", - "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", - "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", - "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", - "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", - "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", - "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", - "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", - "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", - "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", - "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", - "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", - "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", - "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" ], "index": "pypi", - "version": "==2.0.27" + "markers": "python_version >= '3.7'", + "version": "==2.0.28" }, "tenacity": { "hashes": [ @@ -197,15 +199,16 @@ "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.2.3" }, "typing-extensions": { "hashes": [ - "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", - "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], "markers": "python_version >= '3.8'", - "version": "==4.10.0rc1" + "version": "==4.10.0" }, "urllib3": { "hashes": [ @@ -223,84 +226,86 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:006d220ba2e1a45f1de083d5022d4955abb0aedd78904cd5a779b955b019ec73", - "sha256:06fe398145a2e91edaf1ab4eee66149c6776c6b25b136f4a86fcbbb09512fd10", - "sha256:175f56572f25e1e1201d2b3e07b71ca4d201bf0b9cb8fad3f1dfae6a4188de86", - "sha256:18cac867950943fe93d6cd56a67eb7dcd2d4a781a40f4c1e25d6f1ed98721a55", - "sha256:1a5ee18e3a8d766075ce9314ed1cb695414bae67df6a4b0805f5137d93d6f1cb", - "sha256:20a875bfd8c282985c4720c32aa05056f77a68e6d8bbc5fe8632c5860ee0b49b", - "sha256:2412e98e70f16243be41d20836abd5f3f32edef07cbf8f407f1b6e1ceae783ac", - "sha256:2599972b21911111114100d362aea9e70a88b258400672626efa2b9e2179609c", - "sha256:2ed37e16cf35c8d6e0b430254574b8edd242a367a1b1531bd1adc99c6a5e00fe", - "sha256:32b4ab7e6c924f945cbae5392832e93e4ceb81483fd6dc4aa8fb1a97b9d3e0e1", - "sha256:34423abbaad70fea9d0164add189eabaea679068ebdf693baa5c02d03e7db244", - "sha256:3507427d83fa961cbd73f11140f4a5ce84208d31756f7238d6257b2d3d868405", - "sha256:3733545eb294e5ad274abe131d1e7e7de4ba17a144505c12feca48803fea5f64", - "sha256:3ff5bdb08d8938d336ce4088ca1a1e4b6c8cd3bef8bb3a4c0eb2f37406e49643", - "sha256:3ff7f92ae5a456101ca8f48387fd3c56eb96353588e686286f50633a611afc95", - "sha256:42a9e754aa250fe61f0f99986399cec086d7e7a01dd82fd863a20af34cbce962", - "sha256:51593a1f05c39332f623d64d910445fdec3d2ac2d96b37ce7f331882d5678ddf", - "sha256:5b11f9c6587668e495cc7365f85c93bed34c3a81f9f08b0920b87a89acc13469", - "sha256:69f1665165ba2fe7614e2f0c1aed71e14d83510bf67e2ee13df467d1c08bf1e8", - "sha256:78cdcbf7b9cb83fe047ee09298e25b1cd1636824067166dc97ad0543b079d22f", - "sha256:7df95fdd1432a5d2675ce630fef5f239939e2b3610fe2f2b5bf21fa505256fa3", - "sha256:81a5fb41b0d24447a47543b749adc34d45a2cf77b48ca74e5bf3de60a7bd9edc", - "sha256:840456cb1067dc350af9080298c7c2cfdddcedc1cb1e0b30dceecdaf7be1a2d3", - "sha256:8562ca91e8c40864942615b1d0b12289d3e745e6b2da901d133f52f2d510a1e3", - "sha256:861d75402269ffda0b33af94694b8e0703563116b04c681b1832903fac8fd647", - "sha256:8b98c89db1b150d851a7840142d60d01d07677a18f0f46836e691c38134ed18b", - "sha256:a178b7b1ac0f1530bb28d2e51f88c0bab3e5949835851a60dda80bff6052510c", - "sha256:a8ddbd158e069dded57738ea69b9744525181e99974c899b39f75b2b29a624e2", - "sha256:ac4bab32f396b03ebecfcf2971668da9275b3bb5f81b3b6ba96622f4ef3f6e17", - "sha256:ac9e95cefcf044c98d4e2c829cd0669918585755dd9a92e28a1a7012322d0a95", - "sha256:adbdfcda2469d188d79771d5696dc54fab98a16d2ef7e0875013b5f56a251047", - "sha256:b3c8bbb95a699c80a167478478efe5e09ad31680931ec280bf2087905e3b95ec", - "sha256:b3f2b1eb229f23c82898eedfc3296137cf1f16bb145ceab3edfd17cbde273fb7", - "sha256:b4ae777bebaed89e3a7e80c4a03fac434a98a8abb5251b2a957d38fe3fd30088", - "sha256:b953275d4edfab6cc0ed7139fa773dfb89e81fee1569a932f6020ce7c6da0e8f", - "sha256:bf54c3e089179d9d23900e3efc86d46e4431188d9a657f345410eecdd0151f50", - "sha256:bf711d517e21fb5bc429f5c4308fbc430a8585ff2a43e88540264ae87871e36a", - "sha256:c00e54f0bd258ab25e7f731ca1d5144b0bf7bec0051abccd2bdcff65fa3262c9", - "sha256:c11ca2df2206a4e3e4c4567f52594637392ed05d7c7fb73b4ea1c658ba560265", - "sha256:c5f9683be6a5b19cd776ee4e2f2ffb411424819c69afab6b2db3a0a364ec6642", - "sha256:cf89ab85027427d351f1de918aff4b43f4eb5f33aff6835ed30322a86ac29c9e", - "sha256:d1b750a8409bec61caa7824bfd64a8074b6d2d420433f64c161a8335796c7c6b", - "sha256:d779a48fac416387dd5673fc5b2d6bd903ed903faaa3247dc1865c65eaa5a93e", - "sha256:d9a1ef0f173e1a19738f154fb3644f90d0ada56fe6c9b422f992b04266c55d5a", - "sha256:ddb79414c15c6f03f56cc68fa06994f047cf20207c31b5dad3f6bab54a0f66ef", - "sha256:ef00d31b7569ed3cb2036f26565f1984b9fc08541731ce01012b02a4c238bf03", - "sha256:f40ac873045db4fd98a6f40387d242bde2708a3f8167bd967ccd43ad46394ba2", - "sha256:f593a4a90118d99014517c2679e04a4ef5aee2d81aa05c26c734d271065efcb6", - "sha256:f5df76c58977bc35a49515b2fbba84a1d952ff0ec784a4070334dfbec28a2def", - "sha256:f72cdd2586f9a769570d4b5714a3837b3a59a53b096bb954f1811f6a0afad305", - "sha256:f8e845d894e39fb53834da826078f6dc1a933b32b1478cf437007367efaf6f6a", - "sha256:fe6e43c8b510719b48af7db9631b5fbac910ade4bd90e6378c85ac5ac706382c" + "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa", + "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003", + "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f", + "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c", + "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e", + "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0", + "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9", + "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52", + "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", + "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", + "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0", + "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079", + "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352", + "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", + "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", + "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", + "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", + "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765", + "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc", + "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", + "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501", + "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7", + "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", + "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f", + "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", + "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", + "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", + "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51", + "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840", + "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", + "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", + "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e", + "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45", + "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba", + "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d", + "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", + "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", + "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", + "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", + "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9", + "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a", + "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", + "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1", + "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3", + "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914", + "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", + "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", + "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d", + "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0", + "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94", + "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc", + "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2" ], "markers": "python_version >= '3.8'", - "version": "==7.4.2" + "version": "==7.4.3" }, "exceptiongroup": { "hashes": [ @@ -316,6 +321,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "iniconfig": { @@ -344,11 +350,11 @@ }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pluggy": { "hashes": [ @@ -376,11 +382,12 @@ }, "pytest": { "hashes": [ - "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae", - "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca" + "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7", + "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044" ], "index": "pypi", - "version": "==8.0.1" + "markers": "python_version >= '3.8'", + "version": "==8.1.1" }, "pytest-cov": { "hashes": [ @@ -388,15 +395,16 @@ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==4.1.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "s3transfer": { "hashes": [ diff --git a/ecs/jskult-batch-laundering/Pipfile.lock b/ecs/jskult-batch-laundering/Pipfile.lock index 67f59dae..cb296143 100644 --- a/ecs/jskult-batch-laundering/Pipfile.lock +++ b/ecs/jskult-batch-laundering/Pipfile.lock @@ -86,62 +86,64 @@ "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.1.0" }, "sqlalchemy": { "hashes": [ - "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", - "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", - "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", - "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", - "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", - "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", - "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", - "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", - "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", - "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", - "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", - "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", - "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", - "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", - "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", - "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", - "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", - "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", - "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", - "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", - "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", - "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", - "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", - "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", - "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", - "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", - "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", - "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", - "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", - "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", - "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", - "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", - "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", - "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", - "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", - "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", - "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", - "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", - "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", - "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", - "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", - "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", - "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", - "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", - "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", - "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", - "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", - "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", - "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" ], "index": "pypi", - "version": "==2.0.27" + "markers": "python_version >= '3.7'", + "version": "==2.0.28" }, "tenacity": { "hashes": [ @@ -149,15 +151,16 @@ "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.2.3" }, "typing-extensions": { "hashes": [ - "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", - "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], "markers": "python_version >= '3.8'", - "version": "==4.10.0rc1" + "version": "==4.10.0" } }, "develop": { @@ -167,6 +170,7 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "flake8": { @@ -175,6 +179,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "mccabe": { diff --git a/ecs/jskult-dbdump/Pipfile.lock b/ecs/jskult-dbdump/Pipfile.lock index 67f59dae..cb296143 100644 --- a/ecs/jskult-dbdump/Pipfile.lock +++ b/ecs/jskult-dbdump/Pipfile.lock @@ -86,62 +86,64 @@ "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.1.0" }, "sqlalchemy": { "hashes": [ - "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", - "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", - "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", - "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", - "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", - "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", - "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", - "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", - "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", - "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", - "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", - "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", - "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", - "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", - "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", - "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", - "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", - "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", - "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", - "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", - "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", - "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", - "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", - "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", - "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", - "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", - "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", - "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", - "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", - "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", - "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", - "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", - "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", - "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", - "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", - "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", - "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", - "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", - "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", - "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", - "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", - "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", - "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", - "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", - "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", - "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", - "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", - "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", - "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" ], "index": "pypi", - "version": "==2.0.27" + "markers": "python_version >= '3.7'", + "version": "==2.0.28" }, "tenacity": { "hashes": [ @@ -149,15 +151,16 @@ "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.2.3" }, "typing-extensions": { "hashes": [ - "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", - "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], "markers": "python_version >= '3.8'", - "version": "==4.10.0rc1" + "version": "==4.10.0" } }, "develop": { @@ -167,6 +170,7 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "flake8": { @@ -175,6 +179,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "mccabe": { diff --git a/ecs/jskult-webapp/Pipfile.lock b/ecs/jskult-webapp/Pipfile.lock index ad94f3b4..2c605b9b 100644 --- a/ecs/jskult-webapp/Pipfile.lock +++ b/ecs/jskult-webapp/Pipfile.lock @@ -34,19 +34,20 @@ }, "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "certifi": { "hashes": [ @@ -220,40 +221,40 @@ }, "cryptography": { "hashes": [ - "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", - "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", - "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", - "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", - "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", - "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", - "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", - "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", - "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", - "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", - "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", - "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", - "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", - "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", - "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", - "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", - "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", - "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", - "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", - "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", - "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", - "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", - "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", - "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", - "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", - "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", - "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", - "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", - "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", - "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", - "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", - "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], - "version": "==42.0.4" + "version": "==42.0.5" }, "et-xmlfile": { "hashes": [ @@ -273,11 +274,12 @@ }, "fastapi": { "hashes": [ - "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d", - "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73" + "sha256:266775f0dcc95af9d3ef39bad55cff525329a931d5fd51930aadd4f428bf7ff3", + "sha256:87a1f6fb632a218222c5984be540055346a8f5d8a68e8f6fb647b1dc9934de4b" ], "index": "pypi", - "version": "==0.109.2" + "markers": "python_version >= '3.8'", + "version": "==0.110.0" }, "greenlet": { "hashes": [ @@ -349,6 +351,7 @@ "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033" ], "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==21.2.0" }, "h11": { @@ -414,6 +417,7 @@ "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==3.1.3" }, "jmespath": { @@ -530,6 +534,7 @@ "sha256:f617ebe1fdceadc2b87497c4d56f3c863155179488feb63f83a62cf95df37b69" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.0.13" }, "numpy": { @@ -580,50 +585,52 @@ "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==3.1.2" }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pandas": { "hashes": [ - "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1", - "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e", - "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f", - "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2", - "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18", - "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae", - "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd", - "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab", - "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430", - "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a", - "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106", - "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5", - "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670", - "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88", - "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b", - "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d", - "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71", - "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5", - "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e", - "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc", - "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30", - "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7", - "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3", - "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a", - "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440", - "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a", - "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042", - "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1", - "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9" + "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee", + "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e", + "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572", + "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944", + "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403", + "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89", + "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab", + "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6", + "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb", + "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9", + "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019", + "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be", + "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd", + "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c", + "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88", + "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0", + "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397", + "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc", + "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2", + "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7", + "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06", + "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51", + "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0", + "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a", + "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16", + "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02", + "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359", + "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b", + "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df" ], "index": "pypi", - "version": "==2.2.0" + "markers": "python_version >= '3.9'", + "version": "==2.2.1" }, "pycparser": { "hashes": [ @@ -634,96 +641,97 @@ }, "pydantic": { "hashes": [ - "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f", - "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9" + "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6", + "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5" ], "index": "pypi", - "version": "==2.6.1" + "markers": "python_version >= '3.8'", + "version": "==2.6.4" }, "pydantic-core": { "hashes": [ - "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379", - "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06", - "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05", - "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7", - "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753", - "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a", - "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731", - "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc", - "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380", - "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3", - "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c", - "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11", - "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990", - "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a", - "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2", - "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8", - "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97", - "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a", - "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8", - "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef", - "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77", - "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33", - "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82", - "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5", - "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b", - "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55", - "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e", - "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b", - "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7", - "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec", - "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc", - "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469", - "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b", - "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20", - "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e", - "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d", - "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f", - "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b", - "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039", - "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e", - "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2", - "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f", - "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b", - "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc", - "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8", - "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522", - "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e", - "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784", - "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a", - "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890", - "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485", - "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545", - "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f", - "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943", - "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878", - "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f", - "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17", - "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7", - "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286", - "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c", - "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb", - "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646", - "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978", - "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8", - "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15", - "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272", - "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2", - "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55", - "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf", - "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545", - "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4", - "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a", - "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804", - "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4", - "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0", - "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a", - "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113", - "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d", - "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25" + "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a", + "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed", + "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979", + "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff", + "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5", + "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45", + "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340", + "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad", + "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23", + "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6", + "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7", + "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241", + "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda", + "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187", + "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba", + "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c", + "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2", + "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c", + "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132", + "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf", + "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972", + "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db", + "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade", + "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4", + "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8", + "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f", + "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9", + "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48", + "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec", + "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d", + "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9", + "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb", + "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4", + "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89", + "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c", + "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9", + "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da", + "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac", + "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b", + "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf", + "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e", + "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137", + "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1", + "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b", + "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8", + "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e", + "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053", + "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01", + "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe", + "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd", + "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805", + "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183", + "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8", + "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99", + "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820", + "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074", + "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256", + "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8", + "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975", + "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad", + "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e", + "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca", + "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df", + "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b", + "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a", + "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a", + "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721", + "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a", + "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f", + "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2", + "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97", + "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6", + "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed", + "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc", + "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1", + "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe", + "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120", + "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f", + "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a" ], "markers": "python_version >= '3.8'", - "version": "==2.16.2" + "version": "==2.16.3" }, "pyjwt": { "hashes": [ @@ -731,6 +739,7 @@ "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.8.0" }, "pymysql": { @@ -738,7 +747,7 @@ "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], - "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.1.0" }, "pynamodb": { @@ -747,15 +756,16 @@ "sha256:7217f87b6e5c9866d915265fd462fa4a012b37b0149bf1f814b33100b50e901f" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==6.0.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "python-dotenv": { "hashes": [ @@ -770,6 +780,7 @@ "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==0.0.9" }, "pytz": { @@ -841,6 +852,7 @@ "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.31.0" }, "s3transfer": { @@ -861,66 +873,67 @@ }, "sniffio": { "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.1" }, "sqlalchemy": { "hashes": [ - "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", - "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", - "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", - "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", - "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", - "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", - "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", - "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", - "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", - "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", - "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", - "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", - "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", - "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", - "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", - "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", - "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", - "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", - "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", - "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", - "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", - "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", - "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", - "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", - "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", - "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", - "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", - "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", - "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", - "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", - "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", - "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", - "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", - "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", - "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", - "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", - "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", - "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", - "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", - "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", - "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", - "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", - "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", - "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", - "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", - "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", - "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", - "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", - "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" + "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2", + "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa", + "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462", + "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d", + "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b", + "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526", + "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b", + "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53", + "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d", + "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4", + "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750", + "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db", + "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc", + "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da", + "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2", + "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368", + "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f", + "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5", + "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d", + "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986", + "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5", + "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197", + "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf", + "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7", + "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7", + "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc", + "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075", + "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5", + "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b", + "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c", + "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b", + "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6", + "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9", + "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385", + "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c", + "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9", + "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67", + "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02", + "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a", + "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097", + "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133", + "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6", + "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8", + "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75", + "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252", + "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9", + "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05", + "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71", + "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6" ], "index": "pypi", - "version": "==2.0.27" + "markers": "python_version >= '3.7'", + "version": "==2.0.28" }, "starlette": { "hashes": [ @@ -932,11 +945,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:ada05f19b82a2ea6eeac4e7412a2328e70b5237f05f3ffef49cae6db558a914e", - "sha256:aee036f82b858bd4b43160c5dc2deb1780129223957eab47c3cac26b93b50e65" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], "markers": "python_version >= '3.8'", - "version": "==4.10.0rc1" + "version": "==4.10.0" }, "tzdata": { "hashes": [ @@ -956,11 +969,12 @@ }, "uvicorn": { "hashes": [ - "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a", - "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4" + "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1", + "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067" ], "index": "pypi", - "version": "==0.27.1" + "markers": "python_version >= '3.8'", + "version": "==0.28.0" }, "uvloop": { "hashes": [ @@ -1161,6 +1175,7 @@ "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==2.0.1" } }, @@ -1171,6 +1186,7 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "flake8": { @@ -1179,6 +1195,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "mccabe": { diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index f6bdbd0e..8f7fdc66 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -43,23 +43,25 @@ "sha256:e6cdab6054fff4fd16c4a3a33a9c4e5aa18ac39f215d0e3a3345d3036cdc418a" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.10" }, "boto3": { "hashes": [ - "sha256:0d382baac02ba4ead82230f34ba377fbf5f6481321dca911e6664b752d79b682", - "sha256:eb5d84c2127ffddf8e7f4dd6f9084f86cb18dca8416fb5d6bea278298cf8d84c" + "sha256:4b40bf2c8494647c9e88c180537dc9fc0c1047a9fffbb1e5b0da6596f1e59b7b", + "sha256:992e994c7e481a5d3259c699574882b79d631a46f7c369bea350b7ccb0651317" ], "index": "pypi", - "version": "==1.34.46" + "markers": "python_version >= '3.8'", + "version": "==1.34.61" }, "botocore": { "hashes": [ - "sha256:21a6c391c6b4869aed66bc888b8e6d54581b343514cfe97dbe71ede12026c3cc", - "sha256:f54330ba1e8ce31489a4e09b4ba8afbf84be01bbc48dbb31d44897fb7657f7ad" + "sha256:079f3288d38f97fd5656c25c44a94bea0e7090b938abfdeea463eaadb210c4a0", + "sha256:72df4af7e4e6392552c882d48c74e4be9bf7be4cd8d829711b312fbae13d7034" ], "markers": "python_version >= '3.8'", - "version": "==1.34.46" + "version": "==1.34.61" }, "cffi": { "hashes": [ @@ -121,41 +123,42 @@ }, "cryptography": { "hashes": [ - "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b", - "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce", - "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88", - "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7", - "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20", - "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", - "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", - "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1", - "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", - "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b", - "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298", - "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1", - "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824", - "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", - "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", - "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129", - "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb", - "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", - "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854", - "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", - "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923", - "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885", - "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", - "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd", - "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2", - "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18", - "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b", - "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992", - "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74", - "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660", - "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925", - "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449" + "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", + "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", + "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", + "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", + "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", + "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", + "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", + "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", + "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", + "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", + "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", + "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", + "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", + "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", + "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", + "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", + "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", + "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", + "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", + "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", + "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", + "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", + "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", + "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", + "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", + "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", + "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", + "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", + "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", + "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", + "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", + "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" ], "index": "pypi", - "version": "==42.0.4" + "markers": "python_version >= '3.7'", + "version": "==42.0.5" }, "jmespath": { "hashes": [ @@ -178,15 +181,16 @@ "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.1.0" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "s3transfer": { "hashes": [ @@ -271,6 +275,7 @@ "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.0.4" }, "flake8": { @@ -279,6 +284,7 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "mccabe": { From 6fd5ada477fdb323dd1d6db72932fa2048a88e00 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 19 Mar 2024 11:50:55 +0900 Subject: [PATCH 960/962] =?UTF-8?q?=E9=80=81=E4=BF=A1=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=82=92CSV=E3=81=AB=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/transfer-encise-data/transfer-encise-data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lambda/transfer-encise-data/transfer-encise-data.py b/lambda/transfer-encise-data/transfer-encise-data.py index bc58963c..5e09b7d3 100644 --- a/lambda/transfer-encise-data/transfer-encise-data.py +++ b/lambda/transfer-encise-data/transfer-encise-data.py @@ -83,7 +83,9 @@ def lambda_handler(event, context): s3_client.copy_object( Bucket=DATA_IMPORT_BUCKET, Key=f'{ENCISE_TARGET_FOLDER}/{event_file_name}', - CopySource=copy_source + CopySource=copy_source, + ContentType='text/csv', # ファイルのタイプを指定する必要があるため、ContentTypeを指定する。 + MetadataDirective='REPLACE' # ファイルのメタデータを置き換える必要があるため、MetadataDirectiveを指定する。 ) # コピー後、元のバケットからは削除する s3_client.delete_object(Bucket=event_bucket_name, Key=event_object_key) From f97f80f84eaa389f3bda8f3a5692323d3f3d744d Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Tue, 19 Mar 2024 17:07:50 +0900 Subject: [PATCH 961/962] =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=AF=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97=E7=94=A8=E3=81=AEContentType=E6=8C=87?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/transfer-encise-data/transfer-encise-data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lambda/transfer-encise-data/transfer-encise-data.py b/lambda/transfer-encise-data/transfer-encise-data.py index 5e09b7d3..0f90483c 100644 --- a/lambda/transfer-encise-data/transfer-encise-data.py +++ b/lambda/transfer-encise-data/transfer-encise-data.py @@ -75,7 +75,9 @@ def lambda_handler(event, context): s3_client.copy_object( Bucket=ENCISE_BACKUP_BUCKET, Key=f'{event_folder_name}/{execute_date_yyyymm}/{event_file_name}', - CopySource=copy_source + CopySource=copy_source, + ContentType='text/csv', # ファイルのタイプを指定する必要があるため、ContentTypeを指定する。 + MetadataDirective='REPLACE' # ファイルのメタデータを置き換える必要があるため、MetadataDirectiveを指定する。 ) logger.info(f'I-04-01 Encise受信データのバックアップ完了:{ENCISE_BACKUP_BUCKET}/{event_folder_name}/{execute_date_yyyymm}/{event_file_name}') From b853c71b35bb7dbcf3a1e980de4ecb9c641481c0 Mon Sep 17 00:00:00 2001 From: "nik.n" Date: Thu, 28 Mar 2024 10:39:43 +0900 Subject: [PATCH 962/962] =?UTF-8?q?DB=E3=83=80=E3=83=B3=E3=83=97SG?= =?UTF-8?q?=E5=80=A4=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stepfunctions/TOOLS/convert_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stepfunctions/TOOLS/convert_config.yaml b/stepfunctions/TOOLS/convert_config.yaml index c0f62a09..a6bf5c42 100644 --- a/stepfunctions/TOOLS/convert_config.yaml +++ b/stepfunctions/TOOLS/convert_config.yaml @@ -45,7 +45,7 @@ resource: # セキュリティグループ(ecs-jskult-batch-laundering) - &PRD_SG_JSKULT_BATCH_LAUNDERING "sg-0d2bc30c1a2939c32" # セキュリティグループ(ecs-export-dbdump) - - &PRD_SG_EXPORT_DBDUMP "sg-xxxxxxxxxxxxxxxx" + - &PRD_SG_EXPORT_DBDUMP "sg-07ce73feffb53fadc" config: # CRMデータ取得 r-crm-datafetch-state:

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

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

{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} @@ -100,7 +100,7 @@
登録Excel:登録CSV: {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} {{mainte_csv_up.csv_file_name}} From b50a43a7bdc3b3313bf3e4f03e4671156fae73a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 21 Jul 2023 17:06:37 +0900 Subject: [PATCH 512/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 24 +++++++++++-------- .../src/templates/instEmpCsvUL.html | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 17585794..d8714f7a 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -5,6 +5,7 @@ from io import TextIOWrapper from datetime import datetime from abc import ABCMeta, abstractmethod from src.system_var import constants +from src.util.string_util import is_not_empty from src.repositories.mst_inst_repository import MstInstRepository from src.repositories.bu_master_cd_repository import BuMasterRepository from src.repositories.emp_master_repository import EmpMasterRepository @@ -121,11 +122,13 @@ class MasterMainteCSVItem(metaclass=ABCMeta): end_date_col_name: str) -> tuple[list[str], datetime, datetime]: error_list = [] - if start_date is not None: + start_date_time: datetime = None + end_date_time: datetime = None + if is_not_empty(start_date): (result, start_date_time) = self.__parse_str_to_date(start_date) if result is False: error_list.append(f'{self.line_num}行目の{start_date_col_name}が実在しない日付になっています。') - if end_date is not None: + if is_not_empty(end_date): (result, end_date_time) = self.__parse_str_to_date(end_date) if result is False: error_list.append(f'{self.line_num}行目の{end_date_col_name}が実在しない日付になっています。') @@ -252,7 +255,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_inst_cd_exists(self) -> list[str]: error_list = [] - if super().is_exist_inst_cd() is False: + if is_not_empty(self.inst_cd) and super().is_exist_inst_cd() is False: error_list.append( f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_INST_CD_COL_NO]}\ は施設マスタに存在しないコードです。') @@ -260,7 +263,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_emp_cd_exists(self) -> list[str]: error_list = [] - if self.start_date is None or len(self.start_date) == 0: + if not self.start_date or not self.emp_cd: return error_list if super().is_exist_emp_cd(self.start_date) is True: @@ -271,7 +274,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_bu_cd_exists(self) -> list[str]: error_list = [] - if super().is_exist_bu_cd() is False: + if is_not_empty(self.bu_cd) and super().is_exist_bu_cd() is False: error_list.append(f'{self.line_num}行目の{constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_BU_CD_COL_NO]}\ はビジネスユニットマスタに存在しないコードです。') return error_list @@ -283,7 +286,7 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): self.end_date, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE], constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]) - if len(error_list) > 0 or self.start_date is None or self.end_date is None: + if len(error_list) > 0 or not self.start_date or not self.end_date: return error_list if start_date_time > end_date_time: @@ -411,13 +414,15 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_inst_cd_exists(self) -> list[str]: error_list = [] - if super().is_exist_inst_cd() is False: + if is_not_empty(self.inst_cd) and super().is_exist_inst_cd() is False: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_CD_COL_NO]}\ は施設マスタに存在しないコードです。') return error_list def check_emp_cd_exists(self) -> list[str]: error_list = [] + if not self.start_date or not self.emp_cd: + return error_list if self.comment != '追加' and self.comment != '担当者修正': return error_list @@ -431,8 +436,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): """BuCd存在チェック""" error_list = [] - if super().is_exist_bu_cd() is False: - + if is_not_empty(self.bu_cd) and super().is_exist_bu_cd() is False: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO]}\ はビジネスユニットマスタに存在しないコードです。') return error_list @@ -460,7 +464,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): end_date, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], end_date_col_name) - if len(error_list) > 0 or start_date is None or end_date is None: + if len(error_list) > 0 or not start_date or not end_date: return error_list if start_date_time > end_date_time: diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 178bdd18..45744fcf 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -29,7 +29,7 @@

- + - + @@ -84,7 +84,7 @@ {% for phm in bio.phm_models %} {% endfor %} @@ -94,12 +94,12 @@ - + From 29131334d4111e454ff9dc029eabc89693758481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Jul 2023 17:48:25 +0900 Subject: [PATCH 518/962] =?UTF-8?q?feat:=20=E3=83=A9=E3=82=B8=E3=82=AA?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E7=B6=AD=E6=8C=81=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81sessionSt?= =?UTF-8?q?orage=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/function/businessLogicScript.js | 1 + .../src/templates/instEmpCsvUL.html | 44 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 768a0ac1..d68e4d86 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -222,6 +222,7 @@ function checkNumberOnlyForm($this) // メニューへボタンの関数 // 機能概要:マスターメンテメニュー画面に遷移する function backToMainteMenu(){ + sessionStorage.clear(); location.href = "/masterMainte/masterMainteMenu/"; } diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 04b2f798..c4f2ca75 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -7,16 +7,47 @@ From c0aa09c87bde73a2c093daa9e76c2cd9020b8976 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 24 Jul 2023 18:44:43 +0900 Subject: [PATCH 521/962] =?UTF-8?q?refactor:=20=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/{bio_sales_view.py => bio_sales_lot.py} | 0 ecs/jskult-webapp/src/model/view/bio_disp_model.py | 2 +- ...bio_sales_view_repository.py => bio_sales_lot_repository.py} | 2 +- ecs/jskult-webapp/src/services/bio_view_service.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename ecs/jskult-webapp/src/model/db/{bio_sales_view.py => bio_sales_lot.py} (100%) rename ecs/jskult-webapp/src/repositories/{bio_sales_view_repository.py => bio_sales_lot_repository.py} (98%) diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py similarity index 100% rename from ecs/jskult-webapp/src/model/db/bio_sales_view.py rename to ecs/jskult-webapp/src/model/db/bio_sales_lot.py diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index 851dc6a9..dd9c2bb0 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -1,4 +1,4 @@ -from src.model.db.bio_sales_view import BioSalesLotDBModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.util.sanitize import sanitize diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py similarity index 98% rename from ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py rename to ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index 4eead447..c7b5fe91 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_view import BioSalesLotDBModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index c0b3c43c..f77a6a5b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesLotRepository +from src.repositories.bio_sales_lot_repository import BioSalesLotRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ From 52976343f79d89454d8d5445a1cc425ac8568f14 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 25 Jul 2023 08:52:07 +0900 Subject: [PATCH 522/962] =?UTF-8?q?feat:=201=E5=91=BC=E3=81=B3=E5=87=BA?= =?UTF-8?q?=E3=81=97=E8=BE=BA=E3=81=AE=E5=88=86=E5=89=B2=E6=95=B0=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 11 ++++++----- ecs/jskult-webapp/src/system_var/constants.py | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) 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 080149de..5c0cd4d7 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -9,7 +9,7 @@ from src.model.db.pharmacy_product_master import PharmacyProductMasterModel from src.model.db.wholesaler_master import WholesalerMasterModel from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel -from src.system_var import constants, environment +from src.system_var import environment class BioViewModel(BaseModel): @@ -51,16 +51,17 @@ class BioViewModel(BaseModel): ) def bio_data_json_str(self): + """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj search_data_list = [model.dict() for model in self.bio_data] search_data_len = len(search_data_list) - # 1ページあたりの表示件数単位で、リストにPUSH - part_page_size = constants.BIO_SEARCH_LIST_PAGE_SIZE - for i in range(0, search_data_len, part_page_size): - yield json.dumps(search_data_list[i:i + part_page_size], ensure_ascii=False, default=date_handler) + # 呼び出し一回あたりの分割数 + part_size = 500 + for i in range(0, search_data_len, part_size): + yield json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) def make_whs_name(self): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index fbcb1016..d5d4eaea 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -7,7 +7,6 @@ DUMP_STATUS_UNPROCESSED = '0' # 生物由来照会 -BIO_SEARCH_LIST_PAGE_SIZE = 100 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') From 6ad11cbac7ed83f636b540a66a12347fe664b214 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 25 Jul 2023 10:35:02 +0900 Subject: [PATCH 523/962] =?UTF-8?q?fix:=20=E3=83=86=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=83=88=E3=81=B8=E3=81=AE=E5=9F=8B=E8=BE=BC?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=82=AF=E3=82=A9=E3=83=BC=E3=83=88=E3=81=8C?= =?UTF-8?q?=E3=81=8A=E3=81=8B=E3=81=97=E3=81=8F=E3=81=AA=E3=82=8B=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 5 ++++- ecs/jskult-webapp/src/templates/bioSearchList.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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 5c0cd4d7..ee36080b 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -61,7 +61,10 @@ class BioViewModel(BaseModel): # 呼び出し一回あたりの分割数 part_size = 500 for i in range(0, search_data_len, part_size): - yield json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # テンプレートに埋め込むため、ダブルクォートをエスケープして返す + json_str = json_str.replace('"', '\\"') + yield json_str def make_whs_name(self): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 5f25dc0f..bac1b4ab 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -340,7 +340,7 @@ // {% autoescape False%} // ジェネレータで100件ずつ取ってリストに詰める // {% for bio_data_json_str in bio.bio_data_json_str() %} - searchResultData.push(...JSON.parse('{{bio_data_json_str}}')) + searchResultData.push(...JSON.parse("{{bio_data_json_str}}")) // {% endfor %} // {% endautoescape%} // {% endif %} From 119cba7f534b8ec87761488b00a50b4e647530bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Jul 2023 10:43:58 +0900 Subject: [PATCH 524/962] =?UTF-8?q?SQL=E5=8F=96=E5=BE=97=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E9=A0=86=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repositories/bio_sales_lot_repository.py | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index c7b5fe91..b061a79d 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -12,43 +12,43 @@ logger = get_logger('生物由来参照') class BioSalesLotRepository(BaseRepository): FETCH_SQL = """\ SELECT + data_kind, slip_mgt_num, + rec_ymd, rec_whs_cd, rec_whs_sub_cd, - rec_whs_org_cd, - rec_comm_cd, - rec_tran_kbn, - rev_hsdnymd_srk, - rec_urag_num, - rec_nonyu_fcl_name, - rec_nonyu_fcl_addr, - rec_lot_num, - rec_ymd, - v_tran_cd, - tran_kbn_name, - v_whsorg_cd, - whs_org_name, - v_whs_cd, whs_name, - nonyu_fcl_cd, + rec_whs_org_cd, + rec_urag_num, + rev_hsdnymd_srk, + rec_tran_kbn, + tran_kbn_name, + mkr_cd, + rec_comm_cd, product_name, whs_rep_comm_name, + nonyu_fcl_cd, + rec_nonyu_fcl_name, whs_rep_nonyu_fcl_name, + rec_nonyu_fcl_addr, whs_rep_nonyu_fcl_addr, - mkr_cd, + rec_lot_num, qty, + expr_dt, + data_kbn, + err_dtl_kind, bef_slip_mgt_num, - iko_flg, - ins_dt, ins_usr, + ins_dt, inst_cd, inst_name_form, address, tel_num, - data_kbn, - data_kind, - err_dtl_kind, - expr_dt + v_whsorg_cd, + whs_org_name, + v_tran_cd, + v_whs_cd, + iko_flg FROM src05.bio_sales_lot WHERE From d9ba55e023c6ab52dfd49cc1c9fd099d975b7c66 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 25 Jul 2023 11:24:25 +0900 Subject: [PATCH 525/962] =?UTF-8?q?fix:=20=E3=82=B7=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=83=AB=E3=83=BB=E3=83=80=E3=83=96=E3=83=AB=E3=82=AF=E3=82=A9?= =?UTF-8?q?=E3=83=BC=E3=83=88=E4=B8=A1=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 5 +++-- ecs/jskult-webapp/src/templates/bioSearchList.html | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) 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 ee36080b..57d5f153 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -62,8 +62,9 @@ class BioViewModel(BaseModel): part_size = 500 for i in range(0, search_data_len, part_size): json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) - # テンプレートに埋め込むため、ダブルクォートをエスケープして返す - json_str = json_str.replace('"', '\\"') + # JavaScriptに埋め込むため、クォートをエスケープ + json_str = json_str.replace("'", "\\'") + json_str = json_str.replace('\\"', '\\\\"') yield json_str def make_whs_name(self): diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index bac1b4ab..01f171a5 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -338,9 +338,9 @@ const searchResultData = [] // {% if bio.is_form_submitted() and not (bio.is_data_overflow_max_length() or bio.is_data_empty()) %} // {% autoescape False%} - // ジェネレータで100件ずつ取ってリストに詰める + // ジェネレータですこしずつ取得してリストに詰める // {% for bio_data_json_str in bio.bio_data_json_str() %} - searchResultData.push(...JSON.parse("{{bio_data_json_str}}")) + searchResultData.push(...JSON.parse('{{bio_data_json_str}}')) // {% endfor %} // {% endautoescape%} // {% endif %} From ca136730e931e3f0f682bc3b929600e804fc7927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 25 Jul 2023 14:09:48 +0900 Subject: [PATCH 526/962] =?UTF-8?q?feat:=20=E3=83=90=E3=83=AA=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=AC=E3=83=99?= =?UTF-8?q?=E3=83=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index a7997298..39e01583 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -101,13 +101,13 @@ class MasterMainteCSVItem(metaclass=ABCMeta): try: check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') except Exception as e: - logger.exception(f'適用期間の日付が不正{e}') + logger.info(f'適用期間の日付が不正{e}') return (False, None) try: reverse_check_date: str = check_date_time.strftime('%Y%m%d') except Exception as e: - logger.exception(f'適用期間の日付が不正{e}') + logger.info(f'適用期間の日付が不正{e}') return (False, None) if check_date != reverse_check_date: From 41286822720803427ef3b1ff4f09614065d60c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 25 Jul 2023 14:23:37 +0900 Subject: [PATCH 527/962] =?UTF-8?q?feat:=20=E6=97=A5=E4=BB=98=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=AC=E3=83=99?= =?UTF-8?q?=E3=83=AB=E3=82=92debug=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 39e01583..fa308a26 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -101,13 +101,13 @@ class MasterMainteCSVItem(metaclass=ABCMeta): try: check_date_time: datetime = datetime.strptime(check_date, '%Y%m%d') except Exception as e: - logger.info(f'適用期間の日付が不正{e}') + logger.debug(f'適用期間の日付が不正{e}') return (False, None) try: reverse_check_date: str = check_date_time.strftime('%Y%m%d') except Exception as e: - logger.info(f'適用期間の日付が不正{e}') + logger.debug(f'適用期間の日付が不正{e}') return (False, None) if check_date != reverse_check_date: From e8b9432be2384bf215a0786d10cbc055161a3db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 25 Jul 2023 14:55:08 +0900 Subject: [PATCH 528/962] =?UTF-8?q?feat:=20IndexError=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=9B=E3=81=9A=E3=80=81CSV=E3=81=AE=E5=88=97?= =?UTF-8?q?=E4=B8=8D=E8=B6=B3=E3=81=AE=E7=A2=BA=E8=AA=8D=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index fa308a26..16591161 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -136,12 +136,9 @@ class MasterMainteCSVItem(metaclass=ABCMeta): return (error_list, start_date_time, end_date_time) def get_csv_value(self, column_no: int): - try: - column_value = self.csv_row[column_no] - except IndexError: - column_value = '' - - return column_value + if len(self.csv_row) <= column_no: + return '' + return self.csv_row[column_no] @abstractmethod def csv_row_data(self) -> dict: From 3c0c8fb1b64f1dd0708df8c2adcdd8b02975806d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 25 Jul 2023 16:58:09 +0900 Subject: [PATCH 529/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/data/BioData_template.xlsx | Bin 10348 -> 10423 bytes .../repositories/bio_sales_lot_repository.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx index 4a6292ff20b0ab793c282b122e8254d682f6ee53..ec1575a2932f20bd823620b1001e6192ca7f420b 100644 GIT binary patch delta 4416 zcmY+IcTf{b*TzHW9YP5rN=rhKDoBtTMKA=UccgQr6X_se3`kHqMCo0M6ltMISCHP3 zCLp~^0Hqg!*E{pg{qEiUXLshevomMU?s=Xi>eT60EKyKv-4(1Z0RjL*_?y&VjDfE9 zj0Ds3tm-T4Q$>i@R|LNvndrE%8w)3$r7-WL$My2p8Q&O0@Bco|z!#98wedJ_Ppt=C z?(8(mE6%(jf3`491=ZJ#0Y-ha7iRHHS(=Bl?2_@@74k>2dg>Fv14GL6leG6Pb6&w4kN*WpgB*9@7vGjs!P>lkOBIyk9!V&IZ zM6F#Mr%Y{4)tL6l`>CN&vXPo7kr{C=x=DJazQD34OqSNp(ZndUcL#%E5(}3%lDp(7 z@egO){fzwSBn=#Ou1-MwRC+Zr??LR{aEBZ-3WVF_iR5^Bsk+5DTjcq_=|`1)bB3Kx+ixk*-M_uu-+!5G zXkmgLSZ9h$8F5Y2)o>86MlsSZE03X4B10Lmjy<)z=ulv~H|uQS>1*I$0!y?26N zaA84JZq(Ym)Omj5DO%kZ`W%e8x(X@&%Yq*da&`R|GalycstRBf?=LO)jW~i7LZ#%i zl5=YY>Nfp`g<^OnDGRv0znUWB#`tEw`qR|LuCKvW90GkA8rA%6@k|8fe1uNVQl}L8 zL^S`jX9_Wo{Z6r2zuF)<|GIxIyXGF#_EC#RWj|Kx?oMN<4k*Sv!peiQE* zzo?f22VD!*?`*g3PFW*RY>P&sO3)KUnO(0KLX-Ts;X&J5_9`K!7=6}X1#etNTxk#X zyOzi4BdTo%QVpvX$)Bxqe*gabcZCA#u+%R-jf$1iB0EF!Ts2|Cv&*Hxu6~^!6I2yn z{Dk7taOS}-n}Z9ys0@@)5TGYDl5J#@Q{dP=p!ViBUWD-uTJu(}e+ONu)$SL|z?z11 zK4YoFped`jRdb~;{h^ddt|z#Hi4 zi^rc|Z9{K}T@o-GzV+-272gf>P6`mm{vKE4?^b*_0cX$?-Pon>ig7>7U!zZvA-eXb zkJV3Ixr0K?g^X^dP}89>je`xq{YWjN<^DsFOlz zdcp2OxHZgm8aTi5OA0)bf$bPhHW|?~$_7lnXRn}5xn$_Lk7S(1o&(n#EtCvU_H>3?Q|v#BYwbp>SR-%UwX+=5sWA&*OvE8M#m653@U zL$|pS6nCYq4>Vk_3{Z)FpbvVs1H@}!Whhm2jA6@U% z(z}y&jxjt`xF)k<{vf;L$llRd!kt}zhJXgye=%eyIx|kZ*Pnf9$Z<&DPB9mwpwlje zqEr*Q+qJb9ud4V?=4aVTj{nHz2`5h&1&9Aj9mXPh+#It%=~yi8^r27ZW$EdM*0h~XO|=|U|0Z9DS8T}GNs93~#C9m5eW;%Y{-{vNg+AHao1v+=e} zhnX0r_h$$y``}sT&E_UxgBCTmLVG1Pn<&K_cNE6tc#fj_63kEbqa_fOv(ptr_soKC zEF<0u+u(ISdq;p*=Qxt-eTn@`<~`vQo0l!UI4bO0P09NoaF^_<*Cixq%FF*x9Nu|&ElQBhqP-3V!~3D0d~E* zMjWE2Fn>BIKC}{G;pwgV_K6-uR)Ja~mk)oJrH|~&JLQ>5R5dT3z+;-!1^V%m(}Ni_ zY}!?}*+kcw2|<;y@K$oGa(ByBRRfc&y^>0EqK7mDk!sW&9GdASxZE=ERHg~RT7h6s zLnXurDhO1rrJ;*Bel?Y&);c{Uy1ngvf2Vljec`GFL=D3^M8!u|hq-uM>-Ee9QoH9i zv__<#df}`}&_qqSKz{F`QjZw~p~N5*b-^=DXf}GtcNnZ%o=nf3sYN3cg;7f>eX0Hw z-6)x{F}V@(lnVXoViSUYES#4ZNml5z@Z8rtEGi@s(R)Oo?PhKymacbn4t(kdZ#g+ zC|s7of&JOl!x||=Qj5;h7L10Cog8*n%HTCCyW{!udQ+7NYC(J_&~Gq8+4EUZH!NzY zoxFNQqz-G5>C-ODJ>42+O2i<)4=wr$&LHJ%cSwxH@_KWqiFyJ+`hf}WHYXc^aph{S zQuJeU(NPY;H=7U#dm-{gnY+Fq3w6hv!vY{WA#0Wcmil#bsQC>_3`$lhW)KTR1a+Mw zUUznfyUlXamh}m)gD1MPA_K3&teq`*bl*BTS*}pyYMnJ4j%ixvTVz_C*(bs+swo;t z&xwL224M5Q?3>rp^am4j^J-O0Qtj)i>t5KTY_nVo%I}3fvIw$P$9TUI;@K&FUoipB^`4L%( zR#uY57C&mmZ?to5OjEdQ?Fg48O(U!7l!*|^~!Rk4RlqLm|L+Q><6A@?0XnhQScFYvb~{v!T5KXrv^BfTwePl zQIU9Nx*M2BXwW^5u3gyk@PXOw`;ST``;M$_msAzsAJc30!H6O|bkTE9jpsP2rD#NKuv4RkmN)U&R(%TNu9jAxA!W zt?}rN%dul+e)j{zmAf=Qy@UGA+$PQkicgKpjfF&iFRstU)<~GOJl)<8uq~`+mv&H@ zEW)7mhMi5Bx^Pxg8-b3q(ch-6%uee#2RM_szK(oyVeh~>rcX(yZb z{gwLS=J-$o53sf0m=%^;wJKnKmFOy01VXf#zBl+Cy{bJAQ{8)G>5sgLO8lfwyCIu zNc++;-2$X!2O%v|xDXc~G`i+NW#5R)S)Zadl ze!v#h<=tfCK8hrw)D+Yw72w&i(|em+$AyhE#Kp_?+^#Mj7P%0()-U$8zLXX zaM_vhvHNheaaSI(EQt`BK4hFuYe{7k^kX8U-%pn=`kCEIYea{FLtsE2d8|AtV&~uCOY%Y$TrTV zy|os#hkFW-#34IW7BQ!$QWO!q9wVbyxV1U&pkM9;G>1va&?9|Q4C$A;G57=-cksQQ zq>Rs~o}!{;_vkexlj$vko=v?E^adYStSu01x;;rD4Qd;>THy6uBT-Q^=@k{ww)oAN zdgOD&7X|?qQ8L;XjuMya?9FAV$a~z3v0d%+%k9g*7PSQ!THmg8ekQJZ4;jqFKAVGA z$hr}M6g)Coy6{9{r>OZzHnL}-K}yiwYZN;q4iET}cg{RnE`RYeV6;%RMvT{bFjlJNi;2#p!itU$Zy#uueSbZ3QteoL2RBr{ z4kjF^^lB>=37zf@9I_-(vk}T~$OG|7&{tgl{0dM20E~ctw=oKQD2x}+4dVosQsd=e zB3%C%Fc1L1@oy9`Pm5O+cmU*O#)k?(VgIka008>`a2;R(z~5Ee%R9jJFZ>9Mjq9Hm z|BtU@{STUR9sdaiyY3h?)?r z5-p;I=t~^m`M#6)d(X_Dnd`Z)nQP{{pJ(p58x6M&s=krdwophCqSnifnED6-0CiFT zfDQlvJaZTGM|!*2A(3vP&pg}!+Ec8!8vM%5@N&%4%*i(ld`{1Mk!bbwr2{~9|G=RAcbF;==-7zm5PfBDMg_Y z4;6};iUPy$=gHr{H`F{LIZqn_+<jRZWCnZI$;z6uOf~RvQfBsicvHZSl-VX;nnjsmb;Kk1GTo2NFn?N_zb?#`#{&ar4 zp|=x`4@mMuWl{Px9yMDMXUh$WOs85X8%{)!G^Q%MHc|$q3W+zKWL*hFts5BI!jdUq zj`Uft^<0gyQ|5_3lL&ASww$ua2Jh`s`UhC-&tF)TQ5BTU5~uUpqgq~T@&sO+*AB1F z(`rGraKY}74kx8wlD8(|$e&b_lifpSWQxY?3{g;&aXlvRLdK0#S1ZX;tm4>K>GmaM z|5FW)C197(U_)Q=?n{M})Xms=720#$zAZ5O%wvKBzfz^RA9I`G6s_7hc~k!bVsCYu zqUXD~U3{7h?z~&I{~eW+9J$q)A0t#19`EpA<<^XH$JV0M{p~@Dr?SfxVN!cpt3?av z`UC2y3L%X*PV-cE7E3AT<9dp2{qX&8*(&x(#K?AzwlvBB_LoVbb+vrO*Uavf)^#xJ zMTEZJB4I`8iGvCE!(CcF&+66=UGXXP)#I_rNI2QdMdEm3GbXIkLXJl@$gINoH$W3b z003NF5djSJh=@S|QULii%b|dQumP@90stX^72U+jj@m;`+=28jzByHq3fYUtyu0Ob z@}VdFTr*_xy*y@2*xPa3e}?j;?19vhFDB*7Ww# zlYsN~jsC&8y`;=4DoSnHJg$XB-8jN97s>o?c8%c6A7}0SZ^J}roa!lt zlX(IKBV2W${bhSY0kumjdL>JacM=mOUyZ7bdp}XnrBAUkH1g}E3F!%gzV&X09V;m) zy&V}!NPqJZj;iswvgApe8m$Ux(cPZnQWciz(nl%ksABx|*|LJ)PGYOQu0A$|qWf}2 zoM+`9XWZ)#onB+*OOknAKk!@LOE?9!Xv^l-wVxS$2H8r`*G#Boa4|_$hpsQaxqzgM z231okRHD6Kyu>{tn~pEI*pgx!$H3NUI!(VF@*O@)pj9N=mYeYsY}5(eaxnLB=R0YY zu0hEjwZ;tV`=BfO(-&pkgJw2s<*Cn$eS<&b?7y$Q?7CI*866YiCGSv^3;%0-0Bn1A z&3`-gFncd}JHfYNVbjV_Ol6%InZ8ocbH-VrD&E8bb0s#x^M@ z>EnS%d746zve3abc(Km}0aVWj@M~&ke!A=0RJ;cu8tSPrFQ0t&-)C zsuu-s*7n4Z?mm7&QsNx6v%8MNjo5tOT_2s>>O^9%nnUo%$LDlG{f(3s(m_*Qd549S zHq(KFV}gMM>fVR>QhI55uUDJf&6DHz{mM!*V*!(~<#&#BVDkb*mzcB15&6VjFkyjp7O2%q4jF z3tGo5eXY^k?}wt`@^CxZ(4BGL4=xD6!)kAr9L>sdCKqalE#Fj0BVE;|q%qUC!W3ZY zUW{$*^O4k1o-pJqcV9NalYFN4N)J_3z_DlksewITJ` zPr7EJ?$)T3ulcjL7S+U8!OD1qlnUwrHxlwO+PYKA9tj#QmqZUtitJ?*5MEkO~j-ebz2>Cq&4bJ^n&MD zLc0`g{#mYy;)}_q?%ScOiHxU+8GXI9U?rLIx0!JspoWgU>+9d!?3 zZC$j)ap#@`-u-T_Hmt(WFL)8XtL*>j;P<14g9%cmn@$?e7__=f;lewoMy}3KWouk& zkHWaSdLe5w7j_~Q-}-_hjo%}C$67Z%OwInG!`?h1#j#<2*kT6G;eaB_aj!3ldX5?q zttI2`E%GZZOI!;``K%^gU~HBFq-n>M8ijsYt4>SWQco<8e119Cu3!c)8wNI8WNfS~ zmrflK@O&vX+N}rk>R5?pKTVRcv+8Od_2nB{bze&F;^-IOxlGWm7fNaf+%huw)N<3rYhaS@@ zcU8={Ix%;=faNUSt6?$?o%qaA?-c|LQ=S>9kTZSKCeN`OGL0%0Guk<(&CU#1HhNga z+Qe6X5JG$!>(ltcI=QeeV~wQs`10^aN<_?1zF$jUM!Nw&!5Na*_Vy8jYy|pu)bOk^|=^&`-*&&{)vg7&E+jFg) z5f43Xb#;VtQ?^W7`y)=Zm+0J#YAr-R>{CV4 zuWujXgN&%(Dg#l3CL9#uo71ZrtCEf+gV(GS1-q65FLU9uHo z#S4peZXfOmPKzhb+Hdx2y*KZnViOG1;qjD*FCh46A-(mXc+HCENb%&}jH;-F*8*{v zsF&j}&F*G;ef28*nMe9fe7iu5((Py8n-~`M!C|TP)Fysk`E}+IX93cF4ZSNjOwig7O~5ADdNw0Y%t-OIM}ftVCeZ zfJo8Y_;;&rYB(<6Ez9RLhGl6?FqQ*o+%cKhPa~d1PCK%+IHm{^E$W$i8dYo=pV3(H z%H-xL{_xZ{@Zxja$^+hJFM(t4^AY&mN#KHPl^k-LniRz;nwkFuW&-JCaw9*aJ2-pU z_88JcmU%x;yZfV{4aztBFy@4kZCl(E0oSvUU82oo`OLi4(ckK{g$(=YIJu!yF9@~$ zlrFi@lVQ-e@eLch=LV0JT7QWlb>dQ!}Z_e0~=Mw~uBm zL%I5s_b4JSH2RMF%+rBms*-ynD8+z}Bij#2VGlS>imp!Sm z6RzfpRKj0W9mqZ}#1tMBdJ}YzY(R6vGm=x23J-*zhJQ!teadeM)9fR;B@(_ND#cJj z&AMCI@{)BaAT4B-CU=T~caOwaMX;u#z!Y83NqNMX3yxu7se&|{k^dgjAip2%V|(Xm zMpD(_BrJjzzoVXf1TAdTRNY9ur`uE3A5TB=Jl!ZykEnH3BcCnQ5qS_~5 z)|VF~l>NsjI53w`+ZRDx6k*p9S?Q;$rRD@4agG&&yf}QeGGDH`ZK0`DG_53?tK$E; z8@JexY8;##$%(<^Rd-bgzuq)r!G-BN?|I+bB$0=81Y2>`l%iUs<{oHNGra``yk2{J zSy_9g98*2+Zq-(n!R*2}p;j(wxPBvxy_Y%M^)!%{0kNVc>-2X0^R}hwC;&ann~ZLu zpaot(zkk})wM~E?qF_NU@&VcY+dKG!0+3Olqxqn0|M$rPu#x}(pueNnqjM_s2tObH z-*OuOp!o-YhxXrIgpY54yQ2>p$`4}u^WZZ80FZxR*Xhwz{OW|4OlU)XUbLqG3u7KT z0N{YMH}FP!`iR;4`S>C|{=LSZ8gVW0|8XwBcMi0^02kXIMqXPY^#9mohzm_800xm< SUjP6=b=|wJA+LD Date: Tue, 25 Jul 2023 17:22:54 +0900 Subject: [PATCH 530/962] =?UTF-8?q?feat:=20=E3=82=B9=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=B3=E3=82=B0=E7=92=B0=E5=A2=83=E3=81=A7=E3=83=A1?= =?UTF-8?q?=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=B8=E3=81=AE=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E3=81=8C=E5=8B=95=E3=81=8B=E3=81=AA=E3=81=84=E5=AF=BE?= =?UTF-8?q?=E5=87=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/function/businessLogicScript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index d68e4d86..9983067d 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -223,7 +223,7 @@ function checkNumberOnlyForm($this) // 機能概要:マスターメンテメニュー画面に遷移する function backToMainteMenu(){ sessionStorage.clear(); - location.href = "/masterMainte/masterMainteMenu/"; + location.href = "/masterMainte/masterMainteMenu"; } // 確認ダイアログ From 7d62962106abec775ff5c0d45812befa10c843f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 26 Jul 2023 10:05:57 +0900 Subject: [PATCH 531/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C=EF=BC=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/bioStyle.css | 18 ++++++++- ecs/jskult-webapp/src/system_var/constants.py | 40 ------------------- .../src/templates/bioSearchList.html | 8 ++-- 3 files changed, 22 insertions(+), 44 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 7ecde3c5..0eadc543 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -81,9 +81,25 @@ table{ .bioScroll_div { overflow: auto; + white-space: nowrap; margin-top: 1%; + margin-bottom: 1%; + width: 100%; height: 250px; - width: 1132px; +} +.bioScroll_div::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.bioScroll_div::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.bioScroll_div::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; } .noLine{ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index d5d4eaea..ecccfb2c 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -10,46 +10,6 @@ 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') -BIO_EXTRACT_COLUMNS = [ - 'data_kind', - 'slip_mgt_num', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_name', - 'rec_whs_org_cd', - 'rec_urag_num', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_name', - 'mkr_cd', - 'rec_comm_cd', - 'product_name', - 'whs_rep_comm_name', - 'nonyu_fcl_cd', - 'rec_nonyu_fcl_name', - 'whs_rep_nonyu_fcl_name', - 'rec_nonyu_fcl_addr', - 'whs_rep_nonyu_fcl_addr', - 'rec_lot_num', - 'qty', - 'expr_dt', - 'data_kbn', - 'err_dtl_kind', - 'bef_slip_mgt_num', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_num', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_name', - 'v_tran_cd', - 'iko_flg' -] - BIO_CSV_HEADER = [ 'データ種別', '伝票管理NO', diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 01f171a5..2da95017 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -7,9 +7,11 @@ @@ -288,7 +286,6 @@ $(val).attr('tabindex', '0') // Enterキー押下時に要素をクリックできるようにイベントを付加する $(val).on('keypress', function(e) { - console.log(e.code) if (e.code === 'Enter') { $(e.target).click() $(val).off('keypress') From e007b3ee87c476dd0e885ee5b8a1c8f025a24427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 26 Jul 2023 13:47:17 +0900 Subject: [PATCH 534/962] =?UTF-8?q?feat:=20staging=E7=92=B0=E5=A2=83?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C=E3=80=81=E5=8D=98?= =?UTF-8?q?=E4=BD=93=E8=A9=A6=E9=A8=93=E7=B5=90=E6=9E=9C=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_csv.py | 23 +++++++++++++------ .../src/services/master_mainte_service.py | 3 ++- .../src/static/css/masterMainte.css | 2 ++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index 16591161..e288ce3a 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -136,9 +136,12 @@ class MasterMainteCSVItem(metaclass=ABCMeta): return (error_list, start_date_time, end_date_time) def get_csv_value(self, column_no: int): - if len(self.csv_row) <= column_no: - return '' - return self.csv_row[column_no] + try: + column_value = self.csv_row[column_no] + except IndexError: + column_value = '' + + return column_value @abstractmethod def csv_row_data(self) -> dict: @@ -278,12 +281,15 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem): def check_existing_date(self) -> list[str]: error_list = [] + if not self.start_date or not self.end_date: + return error_list + (error_list, start_date_time, end_date_time) = super().check_term_date( self.start_date, self.end_date, constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_START_DATE], constants.NEW_INST_EMP_CSV_LOGICAL_NAMES[constants.CSV_NEW_END_DATE]) - if len(error_list) > 0 or not self.start_date or not self.end_date: + if len(error_list) > 0: return error_list if start_date_time > end_date_time: @@ -430,10 +436,10 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): return error_list def check_bu_cd_exists(self) -> list[str]: - """BuCd存在チェック""" error_list = [] - if is_not_empty(self.bu_cd) and super().is_exist_bu_cd() is False: + if is_not_empty(self.bu_cd) and self.comment == '追加'\ + and super().is_exist_bu_cd() is False: error_list.append(f'{self.line_num}行目の{constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_BU_CD_COL_NO]}\ はビジネスユニットマスタに存在しないコードです。') return error_list @@ -456,12 +462,15 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): {constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO]}が\ {end_date_col_name}よりも後の日付になっています。' + if not start_date or not end_date: + return error_list + (error_list, start_date_time, end_date_time) = super().check_term_date( start_date, end_date, constants.CHANGE_INST_CSV_LOGICAL_NAMES[constants.CSV_CHANGE_INST_EMP_START_DATE_COL_NO], end_date_col_name) - if len(error_list) > 0 or not start_date or not end_date: + if len(error_list) > 0: return error_list if start_date_time > end_date_time: diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 04fdd69c..e9620eda 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -1,6 +1,7 @@ import os import json import html +import csv import pandas as pd @@ -193,7 +194,7 @@ class MasterMainteService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, encoding="utf-8_sig", index=False, header=False) + output_df.to_csv(output_file_path, encoding="utf-8_sig", quoting=csv.QUOTE_ALL, index=False, header=False) return output_file_path diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index 4126f298..c6d7be7d 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -56,6 +56,7 @@ h1{ padding-bottom: 1%; border-bottom: solid 1px gray; width: 94%; + border-collapse: initial; } .searchLabelTd{ @@ -172,5 +173,6 @@ table.inputData tbody td { margin-bottom: 2%; border-bottom: solid 1px gray; width: 94%; + border-collapse: initial; } From 359b8a4085b38da5b13e4e1278ac9740f06ec3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 26 Jul 2023 18:52:38 +0900 Subject: [PATCH 535/962] =?UTF-8?q?feat:=20=E5=8D=B8=E8=B2=A9=E5=A3=B2?= =?UTF-8?q?=E5=AE=9F=E7=B8=BE=E5=85=A8=E4=BB=B6=E6=B4=97=E6=9B=BF(?= =?UTF-8?q?=E4=BB=AE=E4=BD=9C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-laundering/.dockerignore | 12 + ecs/jskult-batch-laundering/.env.example | 20 ++ ecs/jskult-batch-laundering/.gitignore | 10 + .../.vscode/launch.json | 16 ++ .../.vscode/recommended_settings.json | 31 +++ ecs/jskult-batch-laundering/Dockerfile | 20 ++ ecs/jskult-batch-laundering/Pipfile | 20 ++ ecs/jskult-batch-laundering/Pipfile.lock | 262 ++++++++++++++++++ ecs/jskult-batch-laundering/README.md | 48 ++++ ecs/jskult-batch-laundering/entrypoint.py | 10 + ecs/jskult-batch-laundering/src/__init__.py | 0 .../src/aws/__init__.py | 0 ecs/jskult-batch-laundering/src/aws/s3.py | 95 +++++++ .../src/batch/batch_functions.py | 51 ++++ .../src/batch/common/__init__.py | 0 .../src/batch/common/batch_context.py | 29 ++ .../src/batch/common/calendar_file.py | 32 +++ .../src/batch/laundering/__init__.py | 0 .../create_inst_merge_for_laundering.py | 31 +++ .../laundering/sales_results_laundering.py | 153 ++++++++++ .../src/db/__init__.py | 0 .../src/db/database.py | 179 ++++++++++++ .../src/error/__init__.py | 0 .../src/error/exceptions.py | 10 + .../src/jobctrl_laundering.py | 23 ++ .../src/logging/get_logger.py | 37 +++ .../src/system_var/__init__.py | 0 .../src/system_var/constants.py | 8 + .../src/system_var/environment.py | 25 ++ .../src/time/elapsed_time.py | 22 ++ 30 files changed, 1144 insertions(+) create mode 100644 ecs/jskult-batch-laundering/.dockerignore create mode 100644 ecs/jskult-batch-laundering/.env.example create mode 100644 ecs/jskult-batch-laundering/.gitignore create mode 100644 ecs/jskult-batch-laundering/.vscode/launch.json create mode 100644 ecs/jskult-batch-laundering/.vscode/recommended_settings.json create mode 100644 ecs/jskult-batch-laundering/Dockerfile create mode 100644 ecs/jskult-batch-laundering/Pipfile create mode 100644 ecs/jskult-batch-laundering/Pipfile.lock create mode 100644 ecs/jskult-batch-laundering/README.md create mode 100644 ecs/jskult-batch-laundering/entrypoint.py create mode 100644 ecs/jskult-batch-laundering/src/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/aws/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/aws/s3.py create mode 100644 ecs/jskult-batch-laundering/src/batch/batch_functions.py create mode 100644 ecs/jskult-batch-laundering/src/batch/common/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/batch/common/batch_context.py create mode 100644 ecs/jskult-batch-laundering/src/batch/common/calendar_file.py create mode 100644 ecs/jskult-batch-laundering/src/batch/laundering/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py create mode 100644 ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py create mode 100644 ecs/jskult-batch-laundering/src/db/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/db/database.py create mode 100644 ecs/jskult-batch-laundering/src/error/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/error/exceptions.py create mode 100644 ecs/jskult-batch-laundering/src/jobctrl_laundering.py create mode 100644 ecs/jskult-batch-laundering/src/logging/get_logger.py create mode 100644 ecs/jskult-batch-laundering/src/system_var/__init__.py create mode 100644 ecs/jskult-batch-laundering/src/system_var/constants.py create mode 100644 ecs/jskult-batch-laundering/src/system_var/environment.py create mode 100644 ecs/jskult-batch-laundering/src/time/elapsed_time.py diff --git a/ecs/jskult-batch-laundering/.dockerignore b/ecs/jskult-batch-laundering/.dockerignore new file mode 100644 index 00000000..8b9da402 --- /dev/null +++ b/ecs/jskult-batch-laundering/.dockerignore @@ -0,0 +1,12 @@ +tests/* +.coverage +.env +.env.example +.report/* +.vscode/* +.pytest_cache/* +*/__pychache__/* +Dockerfile +pytest.ini +README.md +*.sql diff --git a/ecs/jskult-batch-laundering/.env.example b/ecs/jskult-batch-laundering/.env.example new file mode 100644 index 00000000..56ae6677 --- /dev/null +++ b/ecs/jskult-batch-laundering/.env.example @@ -0,0 +1,20 @@ +DB_HOST=************ +DB_PORT=3306 +DB_USERNAME=************ +DB_PASSWORD=************ +DB_SCHEMA=src05 + +JSKULT_BACKUP_BUCKET=mbj-newdwh2021-staging-backup-jskult +JSKULT_CONFIG_BUCKET=mbj-newdwh2021-staging-config + +LOG_LEVEL=INFO +JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar +DB_CONNECTION_MAX_RETRY_ATTEMPT=************ +DB_CONNECTION_RETRY_INTERVAL_INIT=************ +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=************ +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=************ + +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD=7 +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME=sales_lau_all diff --git a/ecs/jskult-batch-laundering/.gitignore b/ecs/jskult-batch-laundering/.gitignore new file mode 100644 index 00000000..bd0b37f8 --- /dev/null +++ b/ecs/jskult-batch-laundering/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +.env + +# python +__pycache__ + +# python test +.pytest_cache +.coverage +.report/ \ No newline at end of file diff --git a/ecs/jskult-batch-laundering/.vscode/launch.json b/ecs/jskult-batch-laundering/.vscode/launch.json new file mode 100644 index 00000000..ac80ce4f --- /dev/null +++ b/ecs/jskult-batch-laundering/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // IntelliSense を使用して利用可能な属性を学べます。 + // 既存の属性の説明をホバーして表示します。 + // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(DEBUG)jskult batch laundering", + "type": "python", + "request": "launch", + "program": "entrypoint.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/ecs/jskult-batch-laundering/.vscode/recommended_settings.json b/ecs/jskult-batch-laundering/.vscode/recommended_settings.json new file mode 100644 index 00000000..b5e79d73 --- /dev/null +++ b/ecs/jskult-batch-laundering/.vscode/recommended_settings.json @@ -0,0 +1,31 @@ +{ + "[python]": { + "editor.defaultFormatter": null, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + }, + // 自身の環境に合わせて変えてください + "python.defaultInterpreterPath": "", + "python.linting.lintOnSave": true, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.flake8Args": [ + "--max-line-length=200", + "--ignore=F541" + ], + "python.formatting.provider": "autopep8", + "python.formatting.autopep8Path": "autopep8", + "python.formatting.autopep8Args": [ + "--max-line-length", "200", + "--ignore=F541" + ], + "python.testing.pytestArgs": [ + "tests/batch/ultmarc" + ], + + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/ecs/jskult-batch-laundering/Dockerfile b/ecs/jskult-batch-laundering/Dockerfile new file mode 100644 index 00000000..dd891d48 --- /dev/null +++ b/ecs/jskult-batch-laundering/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /usr/src/app +COPY Pipfile Pipfile.lock ./ +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv + +COPY src ./src +COPY entrypoint.py entrypoint.py + +CMD ["python", "entrypoint.py"] diff --git a/ecs/jskult-batch-laundering/Pipfile b/ecs/jskult-batch-laundering/Pipfile new file mode 100644 index 00000000..fe0fdc38 --- /dev/null +++ b/ecs/jskult-batch-laundering/Pipfile @@ -0,0 +1,20 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +boto3 = "*" +sqlalchemy = "*" +tenacity = "*" +pymysql = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" + +[pipenv] +allow_prereleases = true diff --git a/ecs/jskult-batch-laundering/Pipfile.lock b/ecs/jskult-batch-laundering/Pipfile.lock new file mode 100644 index 00000000..10d05022 --- /dev/null +++ b/ecs/jskult-batch-laundering/Pipfile.lock @@ -0,0 +1,262 @@ +{ + "_meta": { + "hash": { + "sha256": "a2be870e254760b62220c10400b05fa66d24b2cc1bcd6f21044735e320a62e53" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "boto3": { + "hashes": [ + "sha256:908f9c277325d68963dfcfce963a05336f0eb19505fc239c0ab9d01f4cba0296", + "sha256:e1e535e9fb23977252f13652ed2fa9b4f2d59a53b04a5f2fad3ee415b6a3b2b0" + ], + "index": "pypi", + "version": "==1.27.0" + }, + "botocore": { + "hashes": [ + "sha256:b9cb5b78a289f0615a48d85066f01869029aa41b95993f2c0c55003df037c23f", + "sha256:cac1333f41ec98e6f75bbba3f2c74b9e76aa3847469ecea6e7773a0af0049bee" + ], + "markers": "python_version >= '3.7'", + "version": "==1.30.0" + }, + "greenlet": { + "hashes": [ + "sha256:0a9dfcadc1d79696e90ccb1275c30ad4ec5fd3d1ab3ae6671286fac78ef33435", + "sha256:0f313771cb8ee0a04dfdf586b7d4076180d80c94be09049daeea018089b5b957", + "sha256:17503397bf6cbb5e364217143b6150c540020c51a3f6b08f9a20cd67c25e2ca8", + "sha256:180ec55cb127bc745669eddc9793ffab6e0cf7311e67e1592f183d6ca00d88c1", + "sha256:1b3f3568478bc21b85968e8038c4f98f4bf0039a692791bc324b5e0d1522f4b1", + "sha256:1bd4ea36f0aeb14ca335e0c9594a5aaefa1ac4e2db7d86ba38f0be96166b3102", + "sha256:21ebcb570e0d8501457d6a2695a44c5af3b6c2143dc6644ec73574beba067c90", + "sha256:24071eee113d75fedebaeb86264d94f04b5a24e311c5ba3e8003c07d00112a7e", + "sha256:270432cfdd6a50016b8259b3bbf398a3f7c06a06f2c68c7b93e49f53bc193bcf", + "sha256:271ed380389d2f7e4c1545b6e0837986e62504ab561edbaff05da9c9f3f98f96", + "sha256:2840187a94e258445e62ff1545e34f0b1a14aef4d0078e5c88246688d2b6515e", + "sha256:2cda110faee67613fed221f90467003f477088ef1cc84c8fc88537785a5b4de9", + "sha256:2e160a65cc6023a237be870f2072513747d512a1d018efa083acce0b673cccc0", + "sha256:2fcf7af83516db35af3d0ed5d182dea8585eddd891977adff1b74212f4bfd2fd", + "sha256:36cebce1f30964d5672fd956860e7e7b69772da69658d5743cb676b442eeff36", + "sha256:42bfe67824a9b53e73f568f982f0d1d4c7ac0f587d2e702a23f8a7b505d7b7c2", + "sha256:450a7e52a515402fd110ba807f1a7d464424bfa703be4effbcb97e1dfbfcc621", + "sha256:463d63ca5d8c236788284a9a44b9715372a64d5318a6b5eee36815df1ea0ba3d", + "sha256:4d0c0ffd732466ff324ced144fad55ed5deca36f6036c1d8f04cec69b084c9d6", + "sha256:4ff2a765f4861fc018827eab4df1992f7508d06c62de5d2fe8a6ac2233d4f1d0", + "sha256:53abf19b7dc62795c67b8d0a3d8ef866db166b21017632fff2624cf8fbf3481c", + "sha256:5552d7be37d878e9b6359bbffa0512d857bb9703616a4c0656b49c10739d5971", + "sha256:585810056a8adacd3152945ebfcd25deb58335d41f16ae4e0f3d768918957f9a", + "sha256:5942b1d6ba447cff1ec23a21ec525dde2288f00464950bc647f4e0f03bd537d1", + "sha256:5c355c99be5bb23e85d899b059a4f22fdf8a0741c57e7029425ee63eb436f689", + "sha256:5f61df4fe07864561f49b45c8bd4d2c42e3f03d2872ed05c844902a58b875028", + "sha256:665942d3a954c3e4c976581715f57fb3b86f4cf6bae3ac30b133f8ff777ac6c7", + "sha256:68368e908f14887fb202a81960bfbe3a02d97e6d3fa62b821556463084ffb131", + "sha256:6aac94ff957b5dea0216af71ab59c602e1b947b394e4f5e878a5a65643090038", + "sha256:889934aa8d72b6bfc46babd1dc4b817a56c97ec0f4a10ae7551fb60ab1f96fae", + "sha256:a00550757fca1b9cbc479f8eb1cf3514dbc0103b3f76eae46341c26ddcca67a9", + "sha256:a4a2d6ed0515c05afd5cc435361ced0baabd9ba4536ddfe8ad9a95bcb702c8ce", + "sha256:a8dd92fd76a61af2abc8ccad0c6c6069b3c4ebd4727ecc9a7c33aae37651c8c7", + "sha256:ab81f9ff3e3c2ca65e824454214c10985a846cd9bee5f4d04e15cd875d9fe13b", + "sha256:ac10196b8cde7a082e4e371ff171407270d3337c8d57ed43030094eb01d9c95c", + "sha256:b767930af686551dc96a5eb70af3736709d547ffa275c11a5e820bfb3ae61d8d", + "sha256:b9a1f4d256b81f59ba87bb7a29b9b38b1c018e052dba60a543cb0ddb5062d159", + "sha256:ba94c08321b5d345100fc64eb1ab235f42faf9aabba805cface55ebe677f1c2c", + "sha256:bab71f73001cd15723c4e2ca398f2f48e0a3f584c619eefddb1525e8986e06eb", + "sha256:bce5cf2b0f0b29680396c5c98ab39a011bd70f2dfa8b8a6811a69ee6d920cf9f", + "sha256:c02e514c72e745e49a3ae7e672a1018ba9b68460c21e0361054e956e5d595bc6", + "sha256:c3fb459ced6c5e3b2a895f23f1400f93e9b24d85c30fbe2d637d4f7706a1116b", + "sha256:cd31ab223e43ac64fd23f8f5dad249addadac2a459f040546200acbf7e84e353", + "sha256:ce70aa089ec589b5d5fab388af9f8c9f9dfe8fe4ad844820a92eb240d8628ddf", + "sha256:d47b2e1ad1429da9aa459ef189fbcd8a74ec28a16bc4c3f5f3cf3f88e36535eb", + "sha256:d61bad421c1f496f9fb6114dbd7c30a1dac0e9ff90e9be06f4472cbd8f7a1704", + "sha256:d7ba2e5cb119eddbc10874b41047ad99525e39e397f7aef500e6da0d6f46ab91", + "sha256:dde0ab052c7a1deee8d13d72c37f2afecee30ebdf6eb139790157eaddf04dd61", + "sha256:df34b52aa50a38d7a79f3abc9fda7e400791447aa0400ed895f275f6d8b0bb1f", + "sha256:e0fc20e6e6b298861035a5fc5dcf9fbaa0546318e8bda81112591861a7dcc28f", + "sha256:e20d5e8dc76b73db9280464d6e81bea05e51a99f4d4dd29c5f78dc79f294a5d3", + "sha256:e31d1a33dc9006b278f72cb0aacfe397606c2693aa2fdc0c2f2dcddbad9e0b53", + "sha256:e3a99f890f2cc5535e1b3a90049c6ca9ff9da9ec251cc130c8d269997f9d32ee", + "sha256:e7b192c3df761d0fdd17c2d42d41c28460f124f5922e8bd524018f1d35610682", + "sha256:ed0f4fad4c3656e34d20323a789b6a2d210a6bb82647d9c86dded372f55c58a1", + "sha256:f34ec09702be907727fd479046193725441aaaf7ed4636ca042734f469bb7451", + "sha256:f3530c0ec1fc98c43d5b7061781a8c55bd0db44f789f8152e19d9526cbed6021", + "sha256:f5672082576d0e9f52fa0fa732ff57254d65faeb4a471bc339fe54b58b3e79d2", + "sha256:ffb9f8969789771e95d3c982a36be81f0adfaa7302a1d56e29f168ca15e284b8" + ], + "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.0.0a1" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "pymysql": { + "hashes": [ + "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96", + "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7" + ], + "index": "pypi", + "version": "==1.1.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" + }, + "s3transfer": { + "hashes": [ + "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", + "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.1" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:04383f1e3452f6739084184e427e9d5cb4e68ddc765d52157bf5ef30d5eca14f", + "sha256:125f9f7e62ddf8b590c069729080ffe18b68a20d9882eb0947f72e06274601d7", + "sha256:1822620c89779b85f7c23d535c8e04b79c517739ae07aaed48c81e591ed5498e", + "sha256:21583808d37f126a647652c90332ac1d3a102edf3c94bcc3319edcc0ea2300cc", + "sha256:218fb20c01e95004f50a3062bf4c447dcb360cab8274232f31947e254f118298", + "sha256:2269b1f9b8be47e52b70936069a25a3771eff53367aa5cc59bb94f28a6412e13", + "sha256:234678ed6576531b8e4be255b980f20368bf07241a2e67b84e6b0fe679edb9c4", + "sha256:28da17059ecde53e2d10ba813d38db942b9f6344360b2958b25872d5cb729d35", + "sha256:2c6ff5767d954f6091113fedcaaf49cdec2197ae4c5301fe83d5ae4393c82f33", + "sha256:36a87e26fe8fa8c466fae461a8fcb780d0a1cbf8206900759fc6fe874475a3ce", + "sha256:394ac3adf3676fad76d4b8fcecddf747627f17f0738dc94bac15f303d05b03d4", + "sha256:40a3dc52b2b16f08b5c16b9ee7646329e4b3411e9280e5e8d57b19eaa51cbef4", + "sha256:48111d56afea5699bab72c38ec95561796b81befff9e13d1dd5ce251ab25f51d", + "sha256:48b40dc2895841ea89d89df9eb3ac69e2950a659db20a369acf4259f68e6dc1f", + "sha256:513411d73503a6fc5804f01fae3b3d44f267c1b3a06cfeac02e9286a7330e857", + "sha256:51736cfb607cf4e8fafb693906f9bc4e5ee55be0b096d44bd7f20cd8489b8571", + "sha256:5f40e3a7d0a464f1c8593f2991e5520b2f5b26da24e88000bbd4423f86103d4f", + "sha256:6150560fcffc6aee5ec9a97419ac768c7a9f56baf7a7eb59cb4b1b6a4d463ad9", + "sha256:724355973297bbe547f3eb98b46ade65a67a3d5a6303f17ab59a2dc6fb938943", + "sha256:74ddcafb6488f382854a7da851c404c394be3729bb3d91b02ad86c5458140eff", + "sha256:7830e01b02d440c27f2a5be68296e74ccb55e6a5b5962ffafd360b98930b2e5e", + "sha256:7f31d4e7ca1dd8ca5a27fd5eaa0f9e2732fe769ff7dd35bf7bba179597e4df07", + "sha256:8741d3d401383e54b2aada37cbd10f55c5d444b360eae3a82f74a2be568a7710", + "sha256:910d45bf3673f0e4ef13858674bd23cfdafdc8368b45b948bf511797dbbb401d", + "sha256:aa995b21f853864996e4056d9fde479bcecf8b7bff4beb3555eebbbba815f35d", + "sha256:af7e2ba75bf84b64adb331918188dda634689a2abb151bc1a583e488363fd2f8", + "sha256:b0eaf82cc844f6b46defe15ad243ea00d1e39ed3859df61130c263dc7204da6e", + "sha256:b114a16bc03dfe20b625062e456affd7b9938286e05a3f904a025b9aacc29dd4", + "sha256:b47be4c6281a86670ea5cfbbbe6c3a65366a8742f5bc8b986f790533c60b5ddb", + "sha256:ba03518e64d86f000dc24ab3d3a1aa876bcbaa8aa15662ac2df5e81537fa3394", + "sha256:cc9c2630c423ac4973492821b2969f5fe99d9736f3025da670095668fbfcd4d5", + "sha256:cf07ff9920cb3ca9d73525dfd4f36ddf9e1a83734ea8b4f724edfd9a2c6e82d9", + "sha256:cf175d26f6787cce30fe6c04303ca0aeeb0ad40eeb22e3391f24b32ec432a1e1", + "sha256:d0aeb3afaa19f187a70fa592fbe3c20a056b57662691fd3abf60f016aa5c1848", + "sha256:e186e9e95fb5d993b075c33fe4f38a22105f7ce11cecb5c17b5618181e356702", + "sha256:e2d5c3596254cf1a96474b98e7ce20041c74c008b0f101c1cb4f8261cb77c6d3", + "sha256:e3189432db2f5753b4fde1aa90a61c69976f4e7e31d1cf4611bfe3514ed07478", + "sha256:e3a6b2788f193756076061626679c5c5a6d600ddf8324f986bc72004c3e9d92e", + "sha256:ead58cae2a089eee1b0569060999cb5f2b2462109498a0937cc230a7556945a1", + "sha256:f2f389f77c68dc22cb51f026619291c4a38aeb4b7ecb5f998fd145b2d81ca513", + "sha256:f593170fc09c5abb1205a738290b39532f7380094dc151805009a07ae0e85330" + ], + "index": "pypi", + "version": "==2.0.17" + }, + "tenacity": { + "hashes": [ + "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", + "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" + ], + "index": "pypi", + "version": "==8.2.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + ], + "markers": "python_version >= '3.7'", + "version": "==4.7.1" + }, + "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" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1", + "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c" + ], + "index": "pypi", + "version": "==2.0.2" + }, + "flake8": { + "hashes": [ + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + ], + "index": "pypi", + "version": "==6.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + ], + "markers": "python_version >= '3.6'", + "version": "==2.10.0" + }, + "pyflakes": { + "hashes": [ + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/ecs/jskult-batch-laundering/README.md b/ecs/jskult-batch-laundering/README.md new file mode 100644 index 00000000..f6e7c2da --- /dev/null +++ b/ecs/jskult-batch-laundering/README.md @@ -0,0 +1,48 @@ +# 実消化&アルトマーク 月次バッチ + +## 概要 + +実消化&アルトマークの月次バッチ処理。 + +## 環境情報 + +- Python 3.9 +- MySQL 8.23 +- VSCode + +## 環境構築 + +- Python の構築 + + - Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照 + - 「Pipenv の導入」までを行っておくこと + - 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する + - `pipenv install --dev --python ` + - この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく + +- MySQL の環境構築 + - Windows の場合、以下のリンクからダウンロードする + - + - Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利 + - 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると + - `docker-compose up -d` + - Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと + - データを投入する + - 立ち上げたデータベースに「src05」スキーマを作成する + - [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する + - `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql` +- 環境変数の設定 + - 「.env.example」ファイルをコピーし、「.env」ファイルを作成する + - 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください +- VSCode の設定 + - 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する + - 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する + +## 実行 + +- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。 +- 「entrypoint.py」が、バッチ処理のエントリーポイント。 +- 実際の処理は、「src/jobctrl_monthly.py」で行っている。 + + +## フォルダ構成(工事中) diff --git a/ecs/jskult-batch-laundering/entrypoint.py b/ecs/jskult-batch-laundering/entrypoint.py new file mode 100644 index 00000000..624e61da --- /dev/null +++ b/ecs/jskult-batch-laundering/entrypoint.py @@ -0,0 +1,10 @@ +"""実消化&アルトマーク実績洗替処理のエントリーポイント""" +from src import jobctrl_laundering + +if __name__ == '__main__': + try: + exit(jobctrl_laundering.exec()) + except Exception: + # エラーが起きても、正常系のコードで返す。 + # エラーが起きた事実はbatch_process内でログを出す。 + exit(0) diff --git a/ecs/jskult-batch-laundering/src/__init__.py b/ecs/jskult-batch-laundering/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/aws/__init__.py b/ecs/jskult-batch-laundering/src/aws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/aws/s3.py b/ecs/jskult-batch-laundering/src/aws/s3.py new file mode 100644 index 00000000..17ed0fe9 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/aws/s3.py @@ -0,0 +1,95 @@ +import os.path as path +import tempfile + +import boto3 + +from src.system_var import environment + + +class S3Client: + __s3_client = boto3.client('s3') + _bucket_name: str + + def list_objects(self, bucket_name: str, folder_name: str): + response = self.__s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_name) + if response['KeyCount'] == 0: + return [] + contents = response['Contents'] + # 末尾がスラッシュで終わるものはフォルダとみなしてスキップする + objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')] + return objects + + def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None: + copy_source = {'Bucket': src_bucket, 'Key': src_key} + self.__s3_client.copy(copy_source, dest_bucket, dest_key) + return + + def download_file(self, bucket_name: str, file_key: str, file): + self.__s3_client.download_fileobj( + Bucket=bucket_name, + Key=file_key, + Fileobj=file + ) + return + + def upload_file(self, local_file_path: str, bucket_name: str, file_key: str): + self.__s3_client.upload_file( + local_file_path, + Bucket=bucket_name, + Key=file_key + ) + + def delete_file(self, bucket_name: str, file_key: str): + self.__s3_client.delete_object( + Bucket=bucket_name, + Key=file_key + ) + + +class S3Bucket(): + _s3_client = S3Client() + _bucket_name: str = None + + +class ConfigBucket(S3Bucket): + _bucket_name = environment.JSKULT_CONFIG_BUCKET + + def download_arisj_output_day_list(self): + # 一時ファイルとして保存する + temporary_dir = tempfile.mkdtemp() + temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME) + arisj_output_day_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_ARISJ_OUTPUT_DAY_LIST_FILE_NAME}' + with open(temporary_file_path, mode='wb') as f: + self._s3_client.download_file(self._bucket_name, arisj_output_day_list_key, f) + f.seek(0) + return temporary_file_path + + +class ArisjBucket(S3Bucket): + _bucket_name = environment.ARISJ_DATA_BUCKET + _folder = environment.ARISJ_BACKUP_FOLDER + + def upload_arisj_csv_file(self, arisj_create_csv: str, csv_file_path: str): + # s3にCSVファイルをUPする + Bucket = environment.ARISJ_DATA_BUCKET + folder = environment.ARISJ_DATA_FOLDER + csv_file_name = f'{folder}/{arisj_create_csv}' + s3_client = S3Client() + s3_client.upload_file(csv_file_path, Bucket, csv_file_name) + return + + def backup_arisj_csv_file(self, dat_file_key: str, datetime_key: str): + # バックアップバケットにコピー + arisj_backup_bucket = ArisjBackupBucket() + folder = environment.ARISJ_DATA_FOLDER + dat_file_key = f'{folder}/{dat_file_key}' + backup_key = f'{arisj_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}' + self._s3_client.copy(self._bucket_name, dat_file_key, arisj_backup_bucket._bucket_name, backup_key) + + +class JskUltBackupBucket(S3Bucket): + _bucket_name = environment.JSKULT_BACKUP_BUCKET + + +class ArisjBackupBucket(JskUltBackupBucket): + _folder = environment.ARISJ_BACKUP_FOLDER diff --git a/ecs/jskult-batch-laundering/src/batch/batch_functions.py b/ecs/jskult-batch-laundering/src/batch/batch_functions.py new file mode 100644 index 00000000..40cf84f2 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/batch_functions.py @@ -0,0 +1,51 @@ +"""バッチ処理の共通関数""" +import logging +import textwrap +from datetime import datetime + +from src.db.database import Database +from src.error.exceptions import BatchOperationException, DBException + + +def get_batch_statuses() -> tuple[str, str]: + """日付テーブルから、以下を取得して返す。 + - バッチ処理中フラグ + - 処理日(YYYY/MM/DD) + + Raises: + BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき + + Returns: + tuple[str, str]: [0]バッチ処理中フラグ,[1]処理日 + """ + db = Database.get_instance() + sql = 'SELECT bch_actf, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' + try: + db.connect() + hdke_tbl_result = db.execute_select(sql) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + if len(hdke_tbl_result) == 0: + raise BatchOperationException('日付テーブルが取得できませんでした') + + # 必ず1件取れる + hdke_tbl_record = hdke_tbl_result[0] + batch_processing_flag = hdke_tbl_record['bch_actf'] + syor_date = hdke_tbl_record['syor_date'] + # 処理日を文字列に変換する + syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') + + return batch_processing_flag, syor_date_str + + +def logging_sql(logger: logging.Logger, sql: str) -> None: + """SQL文をデバッグログで出力する + + Args: + logger (logging.Logger): ロガー + sql (str): SQL文 + """ + logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}') diff --git a/ecs/jskult-batch-laundering/src/batch/common/__init__.py b/ecs/jskult-batch-laundering/src/batch/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/batch/common/batch_context.py b/ecs/jskult-batch-laundering/src/batch/common/batch_context.py new file mode 100644 index 00000000..8c8c12fb --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/common/batch_context.py @@ -0,0 +1,29 @@ +class BatchContext: + __instance = None + __syor_date: str # 処理日(yyyy/mm/dd形式) + __is_arisj_output_day: bool # 月次バッチ起動日フラグ + + def __init__(self) -> None: + self.__is_arisj_output_day = False + + @classmethod + def get_instance(cls): + if cls.__instance is None: + cls.__instance = cls() + return cls.__instance + + @property + def syor_date(self): + return self.__syor_date + + @syor_date.setter + def syor_date(self, syor_date_str: str): + self.__syor_date = syor_date_str + + @property + def is_arisj_output_day(self): + return self.__is_arisj_output_day + + @is_arisj_output_day.setter + def is_arisj_output_day(self, flag: bool): + self.__is_arisj_output_day = flag diff --git a/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py b/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py new file mode 100644 index 00000000..b456f03c --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py @@ -0,0 +1,32 @@ +from src.system_var import constants + + +class CalendarFile: + """カレンダーファイル""" + + __calendar_file_lines: list[str] + + def __init__(self, calendar_file_path): + with open(calendar_file_path) as f: + self.__calendar_file_lines: list[str] = f.readlines() + + def compare_date(self, date_str: str) -> bool: + """与えられた日付がカレンダーファイル内に含まれているかどうか + カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提 + コメント(#)が含まれている行は無視される + + Args: + date_str (str): yyyy/mm/dd文字列 + + Returns: + bool: 含まれていればTrue + """ + for calendar_date in self.__calendar_file_lines: + # コメント行が含まれている場合はスキップ + if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: + continue + + if date_str in calendar_date: + return True + + return False diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/__init__.py b/ecs/jskult-batch-laundering/src/batch/laundering/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py b/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py new file mode 100644 index 00000000..2c9d7353 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/laundering/create_inst_merge_for_laundering.py @@ -0,0 +1,31 @@ +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger + +logger = get_logger('洗替用マスタ作成') + + +def exec(): + db = Database.get_instance() + + try: + db.connect() + + logger.debug('処理開始') + call_v_inst_merge_t_create(db) + call_inst_merge_t_create(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def call_v_inst_merge_t_create(db: Database): + db.execute('CALL src05.v_inst_merge_t_create()') + return + + +def call_inst_merge_t_create(db: Database): + db.execute('CALL src05.inst_merge_t_create()') + return diff --git a/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py b/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py new file mode 100644 index 00000000..ac2c79f7 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/batch/laundering/sales_results_laundering.py @@ -0,0 +1,153 @@ +from src.batch.batch_functions import logging_sql +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import environment + + +logger = get_logger('卸販売実績全件洗替') + + +def exec(): + db = Database.get_instance() + try: + db.connect() + logger.debug('処理開始') + # 卸販売実績テーブル(洗替後)作成 + _call_sales_lau_upsert(db) + # 1:卸組織洗替 + _call_whs_org_laundering(db) + # 3:HCO施設コードの洗替 + _update_sales_lau_from_vop_hco_merge_v(db) + # 4:メルク施設コードの洗替 + _update_mst_inst_laundering(db) + logger.debug('処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _call_sales_lau_upsert(db: Database): + # 卸販売実績テーブル(洗替後)作成 + logger.info('sales_lau_upsert(プロシージャ―) 開始') + db.execute(f""" + CALL src05.sales_lau_upsert( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}', + (src05.get_syor_date() - interval {environment.SALES_LAUNDERING_EXTRACT_DATE_PERIOD} day), + src05.get_syor_date() + ) + """) + logger.info('sales_lau_upsert(プロシージャ―) 終了') + return + + +def _call_whs_org_laundering(db: Database): + # 卸組織洗替 + logger.info('whs_org_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.whs_org_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('whs_org_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_vop_hco_merge_v(db: Database): + # HCO施設コードの洗替 + if _count_v_inst_merge_t(db) == 0: + logger.info('V施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + + _call_v_inst_merge_laundering(db) + return + + +def _count_v_inst_merge_t(db: Database) -> int: + # V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(v_inst_cd) AS cnt + FROM + internal05.v_inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_v_inst_merge_laundering(db: Database): + # HCO施設コードの洗替(プロシージャ―の呼び出し) + logger.info('v_inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.v_inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('v_inst_merge_laundering(プロシージャ―) 終了') + return + + +def _update_mst_inst_laundering(db: Database): + # メルク施設コードの洗替 + _call_hco_to_mdb_laundering(db) + _update_sales_lau_from_dcf_inst_merge(db) + + +def _call_hco_to_mdb_laundering(db: Database): + # A:医療機関のデータはMDB変換表からHCO⇒DCFへ変換 + logger.info('hco_to_mdb_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.hco_to_mdb_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('hco_to_mdb_laundering(プロシージャ―) 終了') + return + + +def _update_sales_lau_from_dcf_inst_merge(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする + if _count_inst_merge_t(db) == 0: + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)にデータは存在しません') + return + _call_inst_merge_laundering(db) + return + + +def _count_inst_merge_t(db: Database) -> int: + # アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 + try: + sql = """ + SELECT + COUNT(dcf_dsf_inst_cd) AS cnt + FROM + internal05.inst_merge_t + """ + result = db.execute_select(sql) + logging_sql(logger, sql) + logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功') + except Exception as e: + logger.debug('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗') + raise e + + return result[0]['cnt'] + + +def _call_inst_merge_laundering(db: Database): + # B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(プロシージャ―の呼び出し) + logger.info('inst_merge_laundering(プロシージャ―) 開始') + db.execute(f""" + CALL src05.inst_merge_laundering( + '{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}' + ) + """) + logger.info('inst_merge_laundering(プロシージャ―) 終了') + return diff --git a/ecs/jskult-batch-laundering/src/db/__init__.py b/ecs/jskult-batch-laundering/src/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/db/database.py b/ecs/jskult-batch-laundering/src/db/database.py new file mode 100644 index 00000000..d2171fb5 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/db/database.py @@ -0,0 +1,179 @@ +from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, + create_engine, text) +from sqlalchemy.engine.url import URL +from src.error.exceptions import DBException +from src.logging.get_logger import get_logger +from src.system_var import environment +from tenacity import retry, stop_after_attempt, wait_exponential + +logger = get_logger(__name__) + + +class Database: + """データベース操作クラス""" + __connection: Connection = None + __engine: Engine = None + __host: str = None + __port: str = None + __username: str = None + __password: str = None + __schema: str = None + __connection_string: str = None + + def __init__(self, username: str, password: str, host: str, port: int, schema: str) -> None: + """このクラスの新たなインスタンスを初期化します + + Args: + username (str): DBユーザー名 + password (str): DBパスワード + host (str): DBホスト名 + port (int): DBポート + schema (str): DBスキーマ名 + """ + self.__username = username + self.__password = password + self.__host = host + self.__port = int(port) + self.__schema = schema + + self.__connection_string = URL.create( + drivername='mysql+pymysql', + username=self.__username, + password=self.__password, + host=self.__host, + port=self.__port, + database=self.__schema, + query={"charset": "utf8mb4"} + ) + + self.__engine = create_engine( + self.__connection_string, + pool_timeout=5, + poolclass=QueuePool + ) + + @classmethod + def get_instance(cls): + """インスタンスを取得します + + Returns: + Database: DB操作クラスインスタンス + """ + return cls( + username=environment.DB_USERNAME, + password=environment.DB_PASSWORD, + host=environment.DB_HOST, + port=environment.DB_PORT, + schema=environment.DB_SCHEMA + ) + + @retry( + wait=wait_exponential( + multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT, + min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS, + max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS + ), + stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT), + retry_error_cls=DBException + ) + def connect(self): + """ + DBに接続します。接続に失敗した場合、リトライします。 + Raises: + DBException: 接続失敗 + """ + try: + self.__connection = self.__engine.connect() + except Exception as e: + raise DBException(e) + + def execute_select(self, select_query: str, parameters=None) -> list[dict]: + """SELECTクエリを実行します。 + + Args: + select_query (str): SELECT文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + list[dict]: カラム名: 値の辞書リスト + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(select_query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(select_query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + result_rows = result.mappings().all() + return result_rows + + def execute(self, query: str, parameters=None) -> CursorResult: + """SQLクエリを実行します。 + + Args: + query (str): SQL文 + parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None. + + Raises: + DBException: DBエラー + + Returns: + CursorResult: 取得結果 + """ + if self.__connection is None: + raise DBException('DBに接続していません') + + result = None + try: + # トランザクションが開始している場合は、トランザクションを引き継ぐ + if self.__connection.in_transaction(): + result = self.__connection.execute(text(query), parameters) + else: + # トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。 + result = self.__execute_with_transaction(query, parameters) + except Exception as e: + raise DBException(f'SQL Error: {e}') + + return result + + def begin(self): + """トランザクションを開始します。""" + if not self.__connection.in_transaction(): + self.__connection.begin() + + def commit(self): + """トランザクションをコミットします""" + if self.__connection.in_transaction(): + self.__connection.commit() + + def rollback(self): + """トランザクションをロールバックします""" + if self.__connection.in_transaction(): + self.__connection.rollback() + + def disconnect(self): + """DB接続を切断します。""" + if self.__connection is not None: + self.__connection.close() + self.__connection = None + + def __execute_with_transaction(self, query: str, parameters: dict): + # トランザクションを開始してクエリを実行する + with self.__connection.begin(): + try: + result = self.__connection.execute(text(query), parameters=parameters) + except Exception as e: + self.__connection.rollback() + raise e + # ここでコミットされる + return result diff --git a/ecs/jskult-batch-laundering/src/error/__init__.py b/ecs/jskult-batch-laundering/src/error/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/error/exceptions.py b/ecs/jskult-batch-laundering/src/error/exceptions.py new file mode 100644 index 00000000..055c24f6 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/error/exceptions.py @@ -0,0 +1,10 @@ +class MeDaCaException(Exception): + pass + + +class DBException(MeDaCaException): + pass + + +class BatchOperationException(MeDaCaException): + pass diff --git a/ecs/jskult-batch-laundering/src/jobctrl_laundering.py b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py new file mode 100644 index 00000000..699ff6e5 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py @@ -0,0 +1,23 @@ +"""実消化&アルトマーク実績洗替処理""" +from src.batch.batch_functions import get_batch_statuses +from src.batch.common.batch_context import BatchContext +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.system_var import constants +from src.batch.laundering import (sales_results_laundering, + create_inst_merge_for_laundering) + +logger = get_logger('実消化&アルトマーク実績洗替処理') + + +def exec(): + try: + logger.debug('処理開始') + # 洗替用マスタ作成 + create_inst_merge_for_laundering.exec() + # 卸販売実績全件洗替 + sales_results_laundering.exec() + logger.debug('処理終了') + except BatchOperationException as e: + logger.exception(f'(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-batch-laundering/src/logging/get_logger.py b/ecs/jskult-batch-laundering/src/logging/get_logger.py new file mode 100644 index 00000000..f36f1199 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/logging/get_logger.py @@ -0,0 +1,37 @@ +import logging + +from src.system_var.environment import LOG_LEVEL + +# boto3関連モジュールのログレベルを事前に個別指定し、モジュール内のDEBUGログの表示を抑止する +for name in ["boto3", "botocore", "s3transfer", "urllib3"]: + logging.getLogger(name).setLevel(logging.WARNING) + + +def get_logger(log_name: str) -> logging.Logger: + """一意のログ出力モジュールを取得します。 + + Args: + log_name (str): ロガー名 + + Returns: + _type_: _description_ + """ + logger = logging.getLogger(log_name) + level = logging.getLevelName(LOG_LEVEL) + if not isinstance(level, int): + level = logging.INFO + logger.setLevel(level) + + if not logger.hasHandlers(): + handler = logging.StreamHandler() + logger.addHandler(handler) + + formatter = logging.Formatter( + '%(name)s\t[%(levelname)s]\t%(asctime)s\t%(message)s', + '%Y-%m-%d %H:%M:%S' + ) + + for handler in logger.handlers: + handler.setFormatter(formatter) + + return logger diff --git a/ecs/jskult-batch-laundering/src/system_var/__init__.py b/ecs/jskult-batch-laundering/src/system_var/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch-laundering/src/system_var/constants.py b/ecs/jskult-batch-laundering/src/system_var/constants.py new file mode 100644 index 00000000..aaa8a3c0 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/system_var/constants.py @@ -0,0 +1,8 @@ +# バッチ正常終了コード +BATCH_EXIT_CODE_SUCCESS = 0 + +# バッチ処理中フラグ:処理中 +BATCH_ACTF_BATCH_IN_PROCESSING = '1' + +# カレンダーファイルのコメントシンボル +CALENDAR_COMMENT_SYMBOL = '#' diff --git a/ecs/jskult-batch-laundering/src/system_var/environment.py b/ecs/jskult-batch-laundering/src/system_var/environment.py new file mode 100644 index 00000000..6755de11 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/system_var/environment.py @@ -0,0 +1,25 @@ +import os + +# Database +DB_HOST = os.environ['DB_HOST'] +DB_PORT = int(os.environ['DB_PORT']) +DB_USERNAME = os.environ['DB_USERNAME'] +DB_PASSWORD = os.environ['DB_PASSWORD'] +DB_SCHEMA = os.environ['DB_SCHEMA'] + +# AWS +JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] +JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] +JSKULT_CONFIG_CALENDAR_FOLDER = os.environ['JSKULT_CONFIG_CALENDAR_FOLDER'] + +# 初期値がある環境変数 +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') +DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4)) +DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5)) +DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5)) +DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MAX_SECONDS', 50)) + +# 連携データ抽出期間 +SALES_LAUNDERING_EXTRACT_DATE_PERIOD = int(os.environ['SALES_LAUNDERING_EXTRACT_DATE_PERIOD']) +# 洗替対象テーブル名 +SALES_LAUNDERING_TARGET_TABLE_NAME = os.environ['SALES_LAUNDERING_TARGET_TABLE_NAME'] diff --git a/ecs/jskult-batch-laundering/src/time/elapsed_time.py b/ecs/jskult-batch-laundering/src/time/elapsed_time.py new file mode 100644 index 00000000..c1432e91 --- /dev/null +++ b/ecs/jskult-batch-laundering/src/time/elapsed_time.py @@ -0,0 +1,22 @@ +import time + + +class ElapsedTime: + """処理実行時間計測クラス""" + def __init__(self) -> None: + """このクラスの新たなインスタンスを初期化します。""" + self.__start = time.perf_counter() + + @property + def of(self): + """インスタンス化してからの経過時間をhh:mm:ssの形式にフォーマットして返す + Returns: + str: 時分秒形式の経過時間 + """ + elapsed_time = time.perf_counter() - self.__start + h, rem = divmod(elapsed_time, 3600) + m, s = divmod(rem, 60) + h_str = f'{h:02.0f} hour ' if h > 0.0 else '' + m_str = f'{m:02.0f} min ' if m > 0.0 else '' + s_str = f'{s:06.02f} sec' if s > 0.0 else '' + return f"{h_str}{m_str}{s_str}" From 6768b72567b4b5ec27d89ace65488dce4c1f5f5a Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 27 Jul 2023 09:57:11 +0900 Subject: [PATCH 536/962] =?UTF-8?q?=E8=B3=87=E6=9D=90=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=80V=E5=AE=9F=E6=B6=88=E5=8C=96=E5=8D=B8=E5=9C=A8?= =?UTF-8?q?=E5=BA=AB=E3=83=87=E3=83=BC=E3=82=BF=E9=80=A3=E6=90=BA=E6=97=A5?= =?UTF-8?q?=EF=BC=88=E7=AC=AC10=E5=96=B6=E6=A5=AD=E6=97=A5=EF=BC=89?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jskult_wholesaler_stock_input_day_list.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt diff --git a/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt b/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt new file mode 100644 index 00000000..28271407 --- /dev/null +++ b/s3/config/jskult/calendar/jskult_wholesaler_stock_input_day_list.txt @@ -0,0 +1,13 @@ +2022/12/14 +2023/01/18 +2023/02/14 +2023/03/14 +2023/04/14 +2023/05/17 +2023/06/14 +2023/07/14 +2023/08/15 +2023/09/14 +2023/10/16 +2023/11/15 +2023/12/14 From ea78a31ec5ed4d2460e92da0acfe3422f452f6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 27 Jul 2023 10:31:59 +0900 Subject: [PATCH 537/962] =?UTF-8?q?feat:=20=E5=85=A8=E4=BB=B6=E5=8D=B8?= =?UTF-8?q?=E8=B2=A9=E5=A3=B2=E5=AE=9F=E7=B8=BE=E6=B4=97=E6=9B=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/batch_functions.py | 83 +++++++++++++++++-- .../src/batch/common/calendar_file.py | 32 ------- .../src/jobctrl_laundering.py | 26 ++++-- .../src/system_var/constants.py | 4 +- 4 files changed, 98 insertions(+), 47 deletions(-) delete mode 100644 ecs/jskult-batch-laundering/src/batch/common/calendar_file.py diff --git a/ecs/jskult-batch-laundering/src/batch/batch_functions.py b/ecs/jskult-batch-laundering/src/batch/batch_functions.py index 40cf84f2..87231e17 100644 --- a/ecs/jskult-batch-laundering/src/batch/batch_functions.py +++ b/ecs/jskult-batch-laundering/src/batch/batch_functions.py @@ -1,25 +1,25 @@ """バッチ処理の共通関数""" import logging import textwrap -from datetime import datetime from src.db.database import Database from src.error.exceptions import BatchOperationException, DBException +from src.system_var import constants def get_batch_statuses() -> tuple[str, str]: """日付テーブルから、以下を取得して返す。 - バッチ処理中フラグ - - 処理日(YYYY/MM/DD) + - dump取得状況区分 Raises: BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき Returns: - tuple[str, str]: [0]バッチ処理中フラグ,[1]処理日 + tuple[str, str]: [0]バッチ処理中フラグ,[1]dump取得状況区分 """ db = Database.get_instance() - sql = 'SELECT bch_actf, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl' + sql = 'SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl' try: db.connect() hdke_tbl_result = db.execute_select(sql) @@ -34,11 +34,78 @@ def get_batch_statuses() -> tuple[str, str]: # 必ず1件取れる hdke_tbl_record = hdke_tbl_result[0] batch_processing_flag = hdke_tbl_record['bch_actf'] - syor_date = hdke_tbl_record['syor_date'] - # 処理日を文字列に変換する - syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d') + dump_status_kbn = hdke_tbl_record['dump_sts_kbn'] - return batch_processing_flag, syor_date_str + return batch_processing_flag, dump_status_kbn + + +def update_dump_status_kbn_in_processing() -> None: + """dump取得状況区分を処理中に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = 'UPDATE src05.hdke_tbl SET dump_sts_kbn = :in_processing' + try: + db.connect() + db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING}) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_error() -> None: + """dump取得状況区分をエラーに更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed + """ + try: + db.connect() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_ERROR + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return + + +def update_dump_status_kbn_complete() -> None: + """dump取得状況区分を正常終了に更新する + + Raises: + BatchOperationException: DB操作の何らかのエラー + """ + db = Database.get_instance() + sql = """\ + UPDATE src05.hdke_tbl + SET + dump_sts_kbn = :dump_unprocessed + """ + try: + db.connect() + db.execute(sql, { + 'dump_unprocessed': constants.DUMP_STATUS_KBN_COMPLETE + }) + except DBException as e: + raise BatchOperationException(e) + finally: + db.disconnect() + + return def logging_sql(logger: logging.Logger, sql: str) -> None: diff --git a/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py b/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py deleted file mode 100644 index b456f03c..00000000 --- a/ecs/jskult-batch-laundering/src/batch/common/calendar_file.py +++ /dev/null @@ -1,32 +0,0 @@ -from src.system_var import constants - - -class CalendarFile: - """カレンダーファイル""" - - __calendar_file_lines: list[str] - - def __init__(self, calendar_file_path): - with open(calendar_file_path) as f: - self.__calendar_file_lines: list[str] = f.readlines() - - def compare_date(self, date_str: str) -> bool: - """与えられた日付がカレンダーファイル内に含まれているかどうか - カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提 - コメント(#)が含まれている行は無視される - - Args: - date_str (str): yyyy/mm/dd文字列 - - Returns: - bool: 含まれていればTrue - """ - for calendar_date in self.__calendar_file_lines: - # コメント行が含まれている場合はスキップ - if constants.CALENDAR_COMMENT_SYMBOL in calendar_date: - continue - - if date_str in calendar_date: - return True - - return False diff --git a/ecs/jskult-batch-laundering/src/jobctrl_laundering.py b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py index 699ff6e5..c0735162 100644 --- a/ecs/jskult-batch-laundering/src/jobctrl_laundering.py +++ b/ecs/jskult-batch-laundering/src/jobctrl_laundering.py @@ -1,6 +1,5 @@ """実消化&アルトマーク実績洗替処理""" from src.batch.batch_functions import get_batch_statuses -from src.batch.common.batch_context import BatchContext from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.system_var import constants @@ -12,12 +11,29 @@ logger = get_logger('実消化&アルトマーク実績洗替処理') def exec(): try: - logger.debug('処理開始') + logger.info('週次バッチ:開始') + try: + # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得 + batch_processing_flag, dump_status_kbn = get_batch_statuses() + except BatchOperationException as e: + logger.exception(f'日付テーブル取得(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + + # 日次バッチ処理中の場合、後続の処理は行わない + if batch_processing_flag == constants.BATCH_ACTF_BATCH_IN_PROCESSING: + logger.warning('日次バッチ処理中のため、実消化&アルトマーク実績洗替処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + + # dump取得が正常終了していない場合、後続の処理は行わない + if dump_status_kbn != constants.DUMP_STATUS_KBN_UNPROCESSED: + logger.warning('dump取得が正常終了していないため、実消化&アルトマーク実績洗替処理を終了します。') + return constants.BATCH_EXIT_CODE_SUCCESS + # 洗替用マスタ作成 create_inst_merge_for_laundering.exec() # 卸販売実績全件洗替 sales_results_laundering.exec() - logger.debug('処理終了') - except BatchOperationException as e: - logger.exception(f'(異常終了){e}') + logger.info('週次バッチ:終了') + except Exception as e: + logger.exception(f'実消化&アルトマーク実績洗替処理中に想定外のエラーが発生しました {e}') return constants.BATCH_EXIT_CODE_SUCCESS diff --git a/ecs/jskult-batch-laundering/src/system_var/constants.py b/ecs/jskult-batch-laundering/src/system_var/constants.py index aaa8a3c0..ed3ea806 100644 --- a/ecs/jskult-batch-laundering/src/system_var/constants.py +++ b/ecs/jskult-batch-laundering/src/system_var/constants.py @@ -4,5 +4,5 @@ BATCH_EXIT_CODE_SUCCESS = 0 # バッチ処理中フラグ:処理中 BATCH_ACTF_BATCH_IN_PROCESSING = '1' -# カレンダーファイルのコメントシンボル -CALENDAR_COMMENT_SYMBOL = '#' +# dump取得状態区分:未処理 +DUMP_STATUS_KBN_UNPROCESSED = '0' From 707f7f6839a1d533c5cb1c162a482fe3b9370359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 13:12:37 +0900 Subject: [PATCH 538/962] Revert "Merge branch 'feature-NEWDWH2021-1070' into feature-NEWDWH2021-1069" This reverts commit bde2e56cf49566d39e715661b9c012e498483ff5, reversing changes made to e007b3ee87c476dd0e885ee5b8a1c8f025a24427. --- .../src/controller/bio_download.py | 27 +++- .../src/data/BioData_template.xlsx | Bin 10423 -> 10348 bytes .../{bio_sales_lot.py => bio_sales_view.py} | 41 +++++-- .../src/model/db/pharmacy_product_master.py | 1 - .../src/model/view/bio_disp_model.py | 17 ++- .../src/model/view/bio_view_model.py | 29 +---- ...sitory.py => bio_sales_view_repository.py} | 74 ++++------- .../pharmacy_product_master_repository.py | 1 - .../src/services/bio_view_service.py | 29 ++--- ecs/jskult-webapp/src/static/css/bioStyle.css | 18 +-- ecs/jskult-webapp/src/system_var/constants.py | 44 ++++++- .../src/templates/bioSearchList.html | 115 ++++++++---------- 12 files changed, 198 insertions(+), 198 deletions(-) rename ecs/jskult-webapp/src/model/db/{bio_sales_lot.py => bio_sales_view.py} (61%) rename ecs/jskult-webapp/src/repositories/{bio_sales_lot_repository.py => bio_sales_view_repository.py} (75%) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 454ff857..8ff711c8 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -60,8 +60,12 @@ async def download_bio_data( logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} + # ファイルに打ち出すカラムを抽出 + # TODO: SQLクエリを修正するため、この処理は不要になる + extract_df = _extract_output_df(search_result_df) + # ファイルを書き出し(Excel or CSV) - local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) + local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: @@ -112,6 +116,27 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i return search_result_df, query +def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: + extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] + + # 値を変換 + # データ種別の正式名を設定 + extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( + lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) + # データ区分の区分の日本語名を設定 + extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) + # ロット番号エラーフラグの日本語名を設定 + extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( + lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') + extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( + lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') + + return extract_df + + def _write_bio_data_to_file( bio_service: BioViewService, download_param: BioDownloadModel, diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx index ec1575a2932f20bd823620b1001e6192ca7f420b..4a6292ff20b0ab793c282b122e8254d682f6ee53 100644 GIT binary patch delta 4433 zcmZ8lXE+?p+Frf0*kz-H)!QO^3n98hlqE`()uLwAh`NYg-e41CqehFmdM^>3h?)?r z5-p;I=t~^m`M#6)d(X_Dnd`Z)nQP{{pJ(p58x6M&s=krdwophCqSnifnED6-0CiFT zfDQlvJaZTGM|!*2A(3vP&pg}!+Ec8!8vM%5@N&%4%*i(ld`{1Mk!bbwr2{~9|G=RAcbF;==-7zm5PfBDMg_Y z4;6};iUPy$=gHr{H`F{LIZqn_+<jRZWCnZI$;z6uOf~RvQfBsicvHZSl-VX;nnjsmb;Kk1GTo2NFn?N_zb?#`#{&ar4 zp|=x`4@mMuWl{Px9yMDMXUh$WOs85X8%{)!G^Q%MHc|$q3W+zKWL*hFts5BI!jdUq zj`Uft^<0gyQ|5_3lL&ASww$ua2Jh`s`UhC-&tF)TQ5BTU5~uUpqgq~T@&sO+*AB1F z(`rGraKY}74kx8wlD8(|$e&b_lifpSWQxY?3{g;&aXlvRLdK0#S1ZX;tm4>K>GmaM z|5FW)C197(U_)Q=?n{M})Xms=720#$zAZ5O%wvKBzfz^RA9I`G6s_7hc~k!bVsCYu zqUXD~U3{7h?z~&I{~eW+9J$q)A0t#19`EpA<<^XH$JV0M{p~@Dr?SfxVN!cpt3?av z`UC2y3L%X*PV-cE7E3AT<9dp2{qX&8*(&x(#K?AzwlvBB_LoVbb+vrO*Uavf)^#xJ zMTEZJB4I`8iGvCE!(CcF&+66=UGXXP)#I_rNI2QdMdEm3GbXIkLXJl@$gINoH$W3b z003NF5djSJh=@S|QULii%b|dQumP@90stX^72U+jj@m;`+=28jzByHq3fYUtyu0Ob z@}VdFTr*_xy*y@2*xPa3e}?j;?19vhFDB*7Ww# zlYsN~jsC&8y`;=4DoSnHJg$XB-8jN97s>o?c8%c6A7}0SZ^J}roa!lt zlX(IKBV2W${bhSY0kumjdL>JacM=mOUyZ7bdp}XnrBAUkH1g}E3F!%gzV&X09V;m) zy&V}!NPqJZj;iswvgApe8m$Ux(cPZnQWciz(nl%ksABx|*|LJ)PGYOQu0A$|qWf}2 zoM+`9XWZ)#onB+*OOknAKk!@LOE?9!Xv^l-wVxS$2H8r`*G#Boa4|_$hpsQaxqzgM z231okRHD6Kyu>{tn~pEI*pgx!$H3NUI!(VF@*O@)pj9N=mYeYsY}5(eaxnLB=R0YY zu0hEjwZ;tV`=BfO(-&pkgJw2s<*Cn$eS<&b?7y$Q?7CI*866YiCGSv^3;%0-0Bn1A z&3`-gFncd}JHfYNVbjV_Ol6%InZ8ocbH-VrD&E8bb0s#x^M@ z>EnS%d746zve3abc(Km}0aVWj@M~&ke!A=0RJ;cu8tSPrFQ0t&-)C zsuu-s*7n4Z?mm7&QsNx6v%8MNjo5tOT_2s>>O^9%nnUo%$LDlG{f(3s(m_*Qd549S zHq(KFV}gMM>fVR>QhI55uUDJf&6DHz{mM!*V*!(~<#&#BVDkb*mzcB15&6VjFkyjp7O2%q4jF z3tGo5eXY^k?}wt`@^CxZ(4BGL4=xD6!)kAr9L>sdCKqalE#Fj0BVE;|q%qUC!W3ZY zUW{$*^O4k1o-pJqcV9NalYFN4N)J_3z_DlksewITJ` zPr7EJ?$)T3ulcjL7S+U8!OD1qlnUwrHxlwO+PYKA9tj#QmqZUtitJ?*5MEkO~j-ebz2>Cq&4bJ^n&MD zLc0`g{#mYy;)}_q?%ScOiHxU+8GXI9U?rLIx0!JspoWgU>+9d!?3 zZC$j)ap#@`-u-T_Hmt(WFL)8XtL*>j;P<14g9%cmn@$?e7__=f;lewoMy}3KWouk& zkHWaSdLe5w7j_~Q-}-_hjo%}C$67Z%OwInG!`?h1#j#<2*kT6G;eaB_aj!3ldX5?q zttI2`E%GZZOI!;``K%^gU~HBFq-n>M8ijsYt4>SWQco<8e119Cu3!c)8wNI8WNfS~ zmrflK@O&vX+N}rk>R5?pKTVRcv+8Od_2nB{bze&F;^-IOxlGWm7fNaf+%huw)N<3rYhaS@@ zcU8={Ix%;=faNUSt6?$?o%qaA?-c|LQ=S>9kTZSKCeN`OGL0%0Guk<(&CU#1HhNga z+Qe6X5JG$!>(ltcI=QeeV~wQs`10^aN<_?1zF$jUM!Nw&!5Na*_Vy8jYy|pu)bOk^|=^&`-*&&{)vg7&E+jFg) z5f43Xb#;VtQ?^W7`y)=Zm+0J#YAr-R>{CV4 zuWujXgN&%(Dg#l3CL9#uo71ZrtCEf+gV(GS1-q65FLU9uHo z#S4peZXfOmPKzhb+Hdx2y*KZnViOG1;qjD*FCh46A-(mXc+HCENb%&}jH;-F*8*{v zsF&j}&F*G;ef28*nMe9fe7iu5((Py8n-~`M!C|TP)Fysk`E}+IX93cF4ZSNjOwig7O~5ADdNw0Y%t-OIM}ftVCeZ zfJo8Y_;;&rYB(<6Ez9RLhGl6?FqQ*o+%cKhPa~d1PCK%+IHm{^E$W$i8dYo=pV3(H z%H-xL{_xZ{@Zxja$^+hJFM(t4^AY&mN#KHPl^k-LniRz;nwkFuW&-JCaw9*aJ2-pU z_88JcmU%x;yZfV{4aztBFy@4kZCl(E0oSvUU82oo`OLi4(ckK{g$(=YIJu!yF9@~$ zlrFi@lVQ-e@eLch=LV0JT7QWlb>dQ!}Z_e0~=Mw~uBm zL%I5s_b4JSH2RMF%+rBms*-ynD8+z}Bij#2VGlS>imp!Sm z6RzfpRKj0W9mqZ}#1tMBdJ}YzY(R6vGm=x23J-*zhJQ!teadeM)9fR;B@(_ND#cJj z&AMCI@{)BaAT4B-CU=T~caOwaMX;u#z!Y83NqNMX3yxu7se&|{k^dgjAip2%V|(Xm zMpD(_BrJjzzoVXf1TAdTRNY9ur`uE3A5TB=Jl!ZykEnH3BcCnQ5qS_~5 z)|VF~l>NsjI53w`+ZRDx6k*p9S?Q;$rRD@4agG&&yf}QeGGDH`ZK0`DG_53?tK$E; z8@JexY8;##$%(<^Rd-bgzuq)r!G-BN?|I+bB$0=81Y2>`l%iUs<{oHNGra``yk2{J zSy_9g98*2+Zq-(n!R*2}p;j(wxPBvxy_Y%M^)!%{0kNVc>-2X0^R}hwC;&ann~ZLu zpaot(zkk})wM~E?qF_NU@&VcY+dKG!0+3Olqxqn0|M$rPu#x}(pueNnqjM_s2tObH z-*OuOp!o-YhxXrIgpY54yQ2>p$`4}u^WZZ80FZxR*Xhwz{OW|4OlU)XUbLqG3u7KT z0N{YMH}FP!`iR;4`S>C|{=LSZ8gVW0|8XwBcMi0^02kXIMqXPY^#9mohzm_800xm< SUjP6=b=|wJA+LDeT60EKyKv-4(1Z0RjL*_?y&VjDfE9 zj0Ds3tm-T4Q$>i@R|LNvndrE%8w)3$r7-WL$My2p8Q&O0@Bco|z!#98wedJ_Ppt=C z?(8(mE6%(jf3`491=ZJ#0Y-ha7iRHHS(=Bl?2_@@74k>2dg>Fv14GL6leG6Pb6&w4kN*WpgB*9@7vGjs!P>lkOBIyk9!V&IZ zM6F#Mr%Y{4)tL6l`>CN&vXPo7kr{C=x=DJazQD34OqSNp(ZndUcL#%E5(}3%lDp(7 z@egO){fzwSBn=#Ou1-MwRC+Zr??LR{aEBZ-3WVF_iR5^Bsk+5DTjcq_=|`1)bB3Kx+ixk*-M_uu-+!5G zXkmgLSZ9h$8F5Y2)o>86MlsSZE03X4B10Lmjy<)z=ulv~H|uQS>1*I$0!y?26N zaA84JZq(Ym)Omj5DO%kZ`W%e8x(X@&%Yq*da&`R|GalycstRBf?=LO)jW~i7LZ#%i zl5=YY>Nfp`g<^OnDGRv0znUWB#`tEw`qR|LuCKvW90GkA8rA%6@k|8fe1uNVQl}L8 zL^S`jX9_Wo{Z6r2zuF)<|GIxIyXGF#_EC#RWj|Kx?oMN<4k*Sv!peiQE* zzo?f22VD!*?`*g3PFW*RY>P&sO3)KUnO(0KLX-Ts;X&J5_9`K!7=6}X1#etNTxk#X zyOzi4BdTo%QVpvX$)Bxqe*gabcZCA#u+%R-jf$1iB0EF!Ts2|Cv&*Hxu6~^!6I2yn z{Dk7taOS}-n}Z9ys0@@)5TGYDl5J#@Q{dP=p!ViBUWD-uTJu(}e+ONu)$SL|z?z11 zK4YoFped`jRdb~;{h^ddt|z#Hi4 zi^rc|Z9{K}T@o-GzV+-272gf>P6`mm{vKE4?^b*_0cX$?-Pon>ig7>7U!zZvA-eXb zkJV3Ixr0K?g^X^dP}89>je`xq{YWjN<^DsFOlz zdcp2OxHZgm8aTi5OA0)bf$bPhHW|?~$_7lnXRn}5xn$_Lk7S(1o&(n#EtCvU_H>3?Q|v#BYwbp>SR-%UwX+=5sWA&*OvE8M#m653@U zL$|pS6nCYq4>Vk_3{Z)FpbvVs1H@}!Whhm2jA6@U% z(z}y&jxjt`xF)k<{vf;L$llRd!kt}zhJXgye=%eyIx|kZ*Pnf9$Z<&DPB9mwpwlje zqEr*Q+qJb9ud4V?=4aVTj{nHz2`5h&1&9Aj9mXPh+#It%=~yi8^r27ZW$EdM*0h~XO|=|U|0Z9DS8T}GNs93~#C9m5eW;%Y{-{vNg+AHao1v+=e} zhnX0r_h$$y``}sT&E_UxgBCTmLVG1Pn<&K_cNE6tc#fj_63kEbqa_fOv(ptr_soKC zEF<0u+u(ISdq;p*=Qxt-eTn@`<~`vQo0l!UI4bO0P09NoaF^_<*Cixq%FF*x9Nu|&ElQBhqP-3V!~3D0d~E* zMjWE2Fn>BIKC}{G;pwgV_K6-uR)Ja~mk)oJrH|~&JLQ>5R5dT3z+;-!1^V%m(}Ni_ zY}!?}*+kcw2|<;y@K$oGa(ByBRRfc&y^>0EqK7mDk!sW&9GdASxZE=ERHg~RT7h6s zLnXurDhO1rrJ;*Bel?Y&);c{Uy1ngvf2Vljec`GFL=D3^M8!u|hq-uM>-Ee9QoH9i zv__<#df}`}&_qqSKz{F`QjZw~p~N5*b-^=DXf}GtcNnZ%o=nf3sYN3cg;7f>eX0Hw z-6)x{F}V@(lnVXoViSUYES#4ZNml5z@Z8rtEGi@s(R)Oo?PhKymacbn4t(kdZ#g+ zC|s7of&JOl!x||=Qj5;h7L10Cog8*n%HTCCyW{!udQ+7NYC(J_&~Gq8+4EUZH!NzY zoxFNQqz-G5>C-ODJ>42+O2i<)4=wr$&LHJ%cSwxH@_KWqiFyJ+`hf}WHYXc^aph{S zQuJeU(NPY;H=7U#dm-{gnY+Fq3w6hv!vY{WA#0Wcmil#bsQC>_3`$lhW)KTR1a+Mw zUUznfyUlXamh}m)gD1MPA_K3&teq`*bl*BTS*}pyYMnJ4j%ixvTVz_C*(bs+swo;t z&xwL224M5Q?3>rp^am4j^J-O0Qtj)i>t5KTY_nVo%I}3fvIw$P$9TUI;@K&FUoipB^`4L%( zR#uY57C&mmZ?to5OjEdQ?Fg48O(U!7l!*|^~!Rk4RlqLm|L+Q><6A@?0XnhQScFYvb~{v!T5KXrv^BfTwePl zQIU9Nx*M2BXwW^5u3gyk@PXOw`;ST``;M$_msAzsAJc30!H6O|bkTE9jpsP2rD#NKuv4RkmN)U&R(%TNu9jAxA!W zt?}rN%dul+e)j{zmAf=Qy@UGA+$PQkicgKpjfF&iFRstU)<~GOJl)<8uq~`+mv&H@ zEW)7mhMi5Bx^Pxg8-b3q(ch-6%uee#2RM_szK(oyVeh~>rcX(yZb z{gwLS=J-$o53sf0m=%^;wJKnKmFOy01VXf#zBl+Cy{bJAQ{8)G>5sgLO8lfwyCIu zNc++;-2$X!2O%v|xDXc~G`i+NW#5R)S)Zadl ze!v#h<=tfCK8hrw)D+Yw72w&i(|em+$AyhE#Kp_?+^#Mj7P%0()-U$8zLXX zaM_vhvHNheaaSI(EQt`BK4hFuYe{7k^kX8U-%pn=`kCEIYea{FLtsE2d8|AtV&~uCOY%Y$TrTV zy|os#hkFW-#34IW7BQ!$QWO!q9wVbyxV1U&pkM9;G>1va&?9|Q4C$A;G57=-cksQQ zq>Rs~o}!{;_vkexlj$vko=v?E^adYStSu01x;;rD4Qd;>THy6uBT-Q^=@k{ww)oAN zdgOD&7X|?qQ8L;XjuMya?9FAV$a~z3v0d%+%k9g*7PSQ!THmg8ekQJZ4;jqFKAVGA z$hr}M6g)Coy6{9{r>OZzHnL}-K}yiwYZN;q4iET}cg{RnE`RYeV6;%RMvT{bFjlJNi;2#p!itU$Zy#uueSbZ3QteoL2RBr{ z4kjF^^lB>=37zf@9I_-(vk}T~$OG|7&{tgl{0dM20E~ctw=oKQD2x}+4dVosQsd=e zB3%C%Fc1L1@oy9`Pm5O+cmU*O#)k?(VgIka008>`a2;R(z~5Ee%R9jJFZ>9Mjq9Hm z|BtU@{STUR9sdaiyY None: +class BisDisplayModel(BioSalesViewModel): + def __init__(self, param: BioSalesViewModel) -> None: super().__init__(**param.dict()) + + # 区分・フラグの正式名称を設定 + self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) + self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) + self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) + + # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット + if (self.bef_slip_mgt_num is None): + self.ins_dt = "" + self.ins_usr = "" 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 57d5f153..8f5e4875 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -23,7 +23,7 @@ class BioViewModel(BaseModel): def display_wholesaler_names(self): display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name or ""}' + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name}' for whs_model in self.whs_models ] return display_names @@ -45,38 +45,15 @@ class BioViewModel(BaseModel): '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', - '9': 'エラー(解消済み)', + '9': 'エラー(解消済)', '2': '除外' } ) def bio_data_json_str(self): - """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): - """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj - - search_data_list = [model.dict() for model in self.bio_data] - search_data_len = len(search_data_list) - # 呼び出し一回あたりの分割数 - part_size = 500 - for i in range(0, search_data_len, part_size): - json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) - # JavaScriptに埋め込むため、クォートをエスケープ - json_str = json_str.replace("'", "\\'") - json_str = json_str.replace('\\"', '\\\\"') - yield json_str - - def make_whs_name(self): - if not self.is_form_submitted(): - return '' - if self.form_data.rec_whs_cd is None: - return '' - - form_wholesaler_full_name = \ - f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' - - return form_wholesaler_full_name + return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) def is_selected_whs_name(self, selected_wholesaler): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py similarity index 75% rename from ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py rename to ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 28a59ea5..46eb2b91 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_lot import BioSalesLotDBModel +from src.model.db.bio_sales_view import BioSalesViewModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -9,59 +9,37 @@ from src.util.string_util import is_not_empty logger = get_logger('生物由来参照') -class BioSalesLotRepository(BaseRepository): +class BioSalesViewRepository(BaseRepository): FETCH_SQL = """\ SELECT - data_kind, - slip_mgt_num, - rec_ymd, - rec_whs_cd, - rec_whs_sub_cd, - whs_name, - rec_whs_org_cd, - rec_urag_num, - rev_hsdnymd_srk, - rec_tran_kbn, - tran_kbn_name, - mkr_cd, - rec_comm_cd, - product_name, - whs_rep_comm_name, - nonyu_fcl_cd, - rec_nonyu_fcl_name, - whs_rep_nonyu_fcl_name, - rec_nonyu_fcl_addr, - whs_rep_nonyu_fcl_addr, - rec_lot_num, - qty, - expr_dt, - data_kbn, - err_dtl_kind, - bef_slip_mgt_num, - ins_usr, - ins_dt, - inst_cd, - inst_name_form, - address, - tel_num, - v_whs_cd, - v_whsorg_cd, - whs_org_name, - v_tran_cd, - iko_flg + ( + CASE + WHEN LEFT(bs.v_tran_cd, 1) = 2 + AND bs.qty >= 1 THEN CONCAT('-', bs.qty) + ELSE bs.qty + END + ) AS amt_fugo, + bs.*, + ln.ser_num, + ln.lot_num, + ln.expr_dt FROM - src05.bio_sales_lot + src05.bio_sales_view bs + LEFT OUTER JOIN + src05.lot_num_mst ln + ON bs.mkr_cd = ln.ser_num + AND bs.rec_lot_num = ln.lot_num WHERE {where_clause} ORDER BY - rec_whs_cd, - rec_whs_sub_cd, - rev_hsdnymd_srk, - slip_mgt_num + bs.rec_whs_cd, + bs.rec_whs_sub_cd, + bs.rev_hsdnymd_srk, + bs.slip_mgt_num ASC\ """ - def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]: + def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: try: self._database.connect() logger.debug('DB参照実行') @@ -70,7 +48,7 @@ class BioSalesLotRepository(BaseRepository): logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.dict()) logger.debug(f'count= {len(result)}') - models = [BioSalesLotDBModel(**r) for r in result] + models = [BioSalesViewModel(**r) for r in result] return models except Exception as e: logger.exception(f"DB Error : Exception={e.args}") @@ -115,8 +93,8 @@ class BioSalesLotRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ - where_clauses.append(SQLCondition('TRIM(rec_lot_num)', rec_lot_num_comparator, 'rec_lot_num')) + rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ + where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn')) diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index c2bd95ed..a430ee67 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -9,7 +9,6 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT - t1.mkr_cd, CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index f77a6a5b..d1102598 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_lot_repository import BioSalesLotRepository +from src.repositories.bio_sales_view_repository import BioSalesViewRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ @@ -27,7 +27,7 @@ class BioViewService(BaseService): REPOSITORIES = { 'whs_repository': WholesalerMasterRepository, 'phm_repository': PharmacyProductMasterRepository, - 'bio_sales_repository': BioSalesLotRepository + 'bio_sales_repository': BioSalesViewRepository } CLIENTS = { @@ -36,7 +36,7 @@ class BioViewService(BaseService): whs_repository: WholesalerMasterRepository phm_repository: PharmacyProductMasterRepository - bio_sales_repository: BioSalesLotRepository + bio_sales_repository: BioSalesViewRepository s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: @@ -119,9 +119,6 @@ class BioViewService(BaseService): logger.info(parameter_message) access_logger.info(parameter_message) - # ログファイルクローズ - access_log_handler.close() - # S3にアップロード self.upload_bio_access_log_file(access_log_file_path) @@ -156,16 +153,14 @@ class BioViewService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False, encoding="utf-8_sig") + output_df.to_csv(output_file_path, index=False, header=False) return output_file_path def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - - dt_now = datetime.now() - ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' - file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' + # TODO: ファイルパスにYYYY/MM/DDを加える + file_key = f'data/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -173,10 +168,8 @@ class BioViewService(BaseService): def upload_bio_access_log_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - - dt_now = datetime.now() - ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' - file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' + # TODO: ファイルパスにYYYY/MM/DDを加える + file_key = f'log/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -184,10 +177,8 @@ class BioViewService(BaseService): def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - - dt_now = datetime.now() - ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' - file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' + # TODO: ファイルパスにYYYY/MM/DDを加える + file_key = f'data/{os.path.basename(local_file_path)}' download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 0eadc543..7ecde3c5 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -81,25 +81,9 @@ table{ .bioScroll_div { overflow: auto; - white-space: nowrap; margin-top: 1%; - margin-bottom: 1%; - width: 100%; height: 250px; -} -.bioScroll_div::-webkit-scrollbar { - height: 5px; - width: 10px; -} - -.bioScroll_div::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; -} - -.bioScroll_div::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + width: 1132px; } .noLine{ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 7be637b9..a50d498e 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -5,11 +5,49 @@ 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') +BIO_EXTRACT_COLUMNS = [ + 'slip_org_kbn', + 'slip_mgt_num', + 'rec_ymd', + 'rec_whs_cd', + 'rec_whs_sub_cd', + 'whs_name', + 'rec_whs_org_cd', + 'rec_urag_num', + 'rev_hsdnymd_srk', + 'rec_tran_kbn', + 'tran_kbn_name', + 'mkr_cd', + 'rec_comm_cd', + 'product_name', + 'whs_rep_comm_name', + 'nonyu_fcl_cd', + 'rec_nonyu_fcl_name', + 'whs_rep_nonyu_fcl_name', + 'rec_nonyu_fcl_addr', + 'whs_rep_nonyu_fcl_addr', + 'rec_lot_num', + 'amt_fugo', + 'expr_dt', + 'data_kbn', + 'lot_num_err_flg', + 'bef_slip_mgt_num', + 'ins_usr', + 'ins_dt', + 'inst_cd', + 'inst_name_form', + 'address', + 'tel_num', + 'v_whs_cd', + 'v_whsorg_cd', + 'whs_org_name', + 'v_tran_cd', + 'iko_flg' +] + BIO_CSV_HEADER = [ 'データ種別', '伝票管理NO', @@ -47,7 +85,7 @@ BIO_CSV_HEADER = [ 'Veeva卸組織コード', '卸組織名', 'Veeva取引区分コード', - '2017年11月以前データ' + '移行' ] SLIP_ORG_KBN_FULL_NAME = { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 4dafce34..ae7a3d7c 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -5,16 +5,16 @@ {% include '_header.html' %} {% endwith %} - - @@ -52,14 +52,16 @@ @@ -74,7 +76,7 @@ @@ -84,7 +86,7 @@ {% for phm in bio.phm_models %} {% endfor %} @@ -94,14 +96,16 @@ ` }); return ` From 7d30331cdabdcea5c6d61f796d2eaee470b398cc Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 17:41:55 +0900 Subject: [PATCH 636/962] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=A9=E3=83=BC=E9=96=A2=E6=95=B0=E3=82=92?= =?UTF-8?q?=E3=81=99=E3=81=B9=E3=81=A6async(=E3=82=B7=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=83=AB=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89)=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/bio.py | 4 ++-- ecs/jskult-webapp/src/controller/healthcheck.py | 2 +- ecs/jskult-webapp/src/controller/login.py | 8 ++++---- ecs/jskult-webapp/src/controller/logout.py | 2 +- .../src/controller/master_mainte.py | 12 ++++++------ ecs/jskult-webapp/src/controller/menu.py | 2 +- ecs/jskult-webapp/src/controller/root.py | 2 +- ecs/jskult-webapp/src/controller/ultmarc.py | 16 ++++++++-------- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index 108fc747..a11be3d0 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -25,7 +25,7 @@ logger = get_logger('生物由来参照') @router.get('/BioSearchList') -def bio_view( +async def bio_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), bio_service: BioViewService = Depends(get_service(BioViewService)) @@ -57,7 +57,7 @@ def bio_view( @router.post('/BioSearchList') -def search_bio( +async def search_bio( request: Request, bio_form: Optional[BioModel] = Depends(BioModel.as_form), bio_service: BioViewService = Depends(get_service(BioViewService)), diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py index cdb8f00e..a9b819e7 100644 --- a/ecs/jskult-webapp/src/controller/healthcheck.py +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -8,5 +8,5 @@ router = APIRouter() @router.get('/') -def healthcheck(): +async def healthcheck(): return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index c8a5663c..991457f8 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -30,7 +30,7 @@ logger = get_logger('ログイン') @router.get('/userlogin') -def login_user_redirect_view(): +async def login_user_redirect_view(): auth_query_string = parse.urlencode( { 'response_type': 'code', @@ -45,7 +45,7 @@ def login_user_redirect_view(): @router.get('/maintlogin') -def login_maintenance_view(request: Request): +async def login_maintenance_view(request: Request): mainte_login = MainteLoginViewModel() return templates.TemplateResponse( 'maintlogin.html', @@ -61,7 +61,7 @@ def login_maintenance_view(request: Request): @router.post('/maintlogin') -def login( +async def login( response: Response, request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) @@ -117,7 +117,7 @@ def login( @router.get('/authorize') -def sso_authorize( +async def sso_authorize( code: Union[str, None] = Depends(code_security), login_service: LoginService = Depends(get_service(LoginService)) ) -> Response: diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 36ab6229..2d8c60c8 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -17,7 +17,7 @@ router = APIRouter() @router.get('/', response_class=HTMLResponse) -def logout_view( +async def logout_view( request: Request, reason: Optional[str] = None, session: Union[UserSession, None] = Depends(verify_session) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index 460e256a..aa27ecb2 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -35,7 +35,7 @@ router.route_class = AuthenticatedRoute @router.get('/masterMainteMenu', response_class=HTMLResponse) -def menu_view( +async def menu_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -75,7 +75,7 @@ def menu_view( @router.get('/instEmpCsvUL', response_class=HTMLResponse) -def inst_emp_csv_upload_view( +async def inst_emp_csv_upload_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -177,7 +177,7 @@ async def inst_emp_csv_upload( @router.post('/newInst', response_class=HTMLResponse) -def new_inst_result_view( +async def new_inst_result_view( request: Request, csv_upload_form: Optional[MasterMainteCsvUpModel] = Depends(MasterMainteCsvUpModel.as_form), master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), @@ -219,7 +219,7 @@ def new_inst_result_view( @ router.get('/instEmpCsvDL', response_class=HTMLResponse) -def inst_emp_csv_download_view( +async def inst_emp_csv_download_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -331,7 +331,7 @@ async def inst_emp_csv_download( @router.get('/tableOverride', response_class=HTMLResponse) -def table_override_view( +async def table_override_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -371,7 +371,7 @@ def table_override_view( @router.post('/tableOverride', response_class=HTMLResponse) -def table_override_result_view( +async def table_override_result_view( request: Request, master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py index 96826fce..0f801a9e 100644 --- a/ecs/jskult-webapp/src/controller/menu.py +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -22,7 +22,7 @@ router.route_class = AuthenticatedRoute @router.get('/', response_class=HTMLResponse) -def menu_view( +async def menu_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): diff --git a/ecs/jskult-webapp/src/controller/root.py b/ecs/jskult-webapp/src/controller/root.py index c02471ca..3c47aa7a 100644 --- a/ecs/jskult-webapp/src/controller/root.py +++ b/ecs/jskult-webapp/src/controller/root.py @@ -6,6 +6,6 @@ router = APIRouter() @router.get('/') -def redirect_to_user_login(): +async def redirect_to_user_login(): # ルートパスへのアクセスは、顧客ユーザーログイン画面にリダイレクトさせる return RedirectResponse(url='/login/userlogin', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 825c8b50..a0161b0a 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -27,7 +27,7 @@ router.route_class = AuthenticatedRoute @router.get('/instSearch') -def ultmarc_inst_view( +async def ultmarc_inst_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) @@ -59,7 +59,7 @@ def ultmarc_inst_view( @router.post('/instSearch') -def search_inst( +async def search_inst( request: Request, ultmarc_inst_form: Optional[UltmarcInstSearchModel] = Depends(UltmarcInstSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -103,7 +103,7 @@ def search_inst( @router.get('/instInfo') -def ultmarc_inst_info_view( +async def ultmarc_inst_info_view( request: Request, id: str, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), @@ -143,7 +143,7 @@ def ultmarc_inst_info_view( @router.post('/instInfo') -def ultmarc_inst_info_search( +async def ultmarc_inst_info_search( request: Request, ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -190,7 +190,7 @@ def ultmarc_inst_info_search( @router.get('/docSearch') -def ultmarc_doctor_view( +async def ultmarc_doctor_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) @@ -222,7 +222,7 @@ def ultmarc_doctor_view( @router.post('/docSearch') -def search_doc( +async def search_doc( request: Request, ultmarc_doctor_form: Optional[UltmarcDoctorSearchModel] = Depends(UltmarcDoctorSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -266,7 +266,7 @@ def search_doc( @router.get('/docInfo') -def ultmarc_doctor_info_view( +async def ultmarc_doctor_info_view( request: Request, id: str, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), @@ -306,7 +306,7 @@ def ultmarc_doctor_info_view( @router.post('/docInfo') -def ultmarc_doctor_info_search( +async def ultmarc_doctor_info_search( request: Request, ultmarc_doctor_form: Optional[UltmarcDoctorInfoModel] = Depends(UltmarcDoctorInfoModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), From b7e9682be6116bf418e057d73d4a404e19c931c2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 17:43:49 +0900 Subject: [PATCH 637/962] =?UTF-8?q?feat:=20=E3=82=B5=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=83=AB=E3=83=BC=E3=83=86=E3=82=A3=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/sample_send_file.py | 44 ------------------- ecs/jskult-webapp/src/main.py | 4 -- 2 files changed, 48 deletions(-) delete mode 100644 ecs/jskult-webapp/src/controller/sample_send_file.py diff --git a/ecs/jskult-webapp/src/controller/sample_send_file.py b/ecs/jskult-webapp/src/controller/sample_send_file.py deleted file mode 100644 index b866763c..00000000 --- a/ecs/jskult-webapp/src/controller/sample_send_file.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import Annotated - -from fastapi import APIRouter, File, Form, Request, UploadFile - -from src.templates import templates - -router = APIRouter() - - -@router.get('/') -def get_view(request: Request): - return templates.TemplateResponse( - 'sample_send_file.html', - { - 'request': request - } - ) - - -@router.post('/') -# file.readがCoroutineが返ってくるため、必ずasync関数にする -async def post_view( - # formからファイルを受け取る。(formタグにenctype="multipart/form-data"を指定すること) - file: Annotated[UploadFile, File()], - message: str = Form() -): - # ファイルを読み込む(Coroutineが取れるため、必ずawaitする) - file_bytes = await file.read() - # 閉じとく - await file.close() - # 読み込んだファイルはbytesで返ってくるので、デコードする - file_content = file_bytes.decode() - print(file_content) - try: - return { - # ファイル名 - "file_name": file.filename, - # ファイルのバイト数 - "file_size": file.size, - # Content-Type - "file_content_type": file.content_type - } - except Exception: - return {'code': 'fail'} diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index 8717c7cb..c63fcb58 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -7,7 +7,6 @@ from starlette import status import src.static as static from src.controller import (bio, bio_download, healthcheck, login, logout, 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 from src.error.exceptions import UnexpectedException @@ -36,9 +35,6 @@ app.include_router(master_mainte.router, prefix='/masterMainte') # ヘルスチェック用のルーター app.include_router(healthcheck.router, prefix='/healthcheck') -# サンプル実装、ファイル送信ルーター -app.include_router(sample_router, prefix='/sample') - # エラー発生時にログアウト画面に遷移させるハンドラー app.add_exception_handler(status.HTTP_401_UNAUTHORIZED, http_exception_handler) app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) From 4df7515d09cc829dcbbd611d4b8d295b42c014f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 21 Aug 2023 11:35:12 +0900 Subject: [PATCH 638/962] =?UTF-8?q?=E5=8C=BA=E5=88=86=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/system_var/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index ed3d3add..3756facb 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -204,6 +204,6 @@ DISPLAY_USER_STOP_DIV = { DISPLAY_USER_STOP_DIV_SHORT = { '01': '全面停止', - '03': '特定項目利用停止', + '03': '特定項目停止', '04': '全DM停止' } From a5e1d141bf834da058089b1fd49ce33e93c3c02f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 21 Aug 2023 15:16:54 +0900 Subject: [PATCH 639/962] =?UTF-8?q?Revert=20"feat:=20=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=83=AD=E3=83=BC=E3=83=A9=E3=83=BC=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E3=81=99=E3=81=B9=E3=81=A6async(=E3=82=B7=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=83=AB=E3=82=B9=E3=83=AC=E3=83=83=E3=83=89)?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7d30331cdabdcea5c6d61f796d2eaee470b398cc. --- ecs/jskult-webapp/src/controller/bio.py | 4 ++-- ecs/jskult-webapp/src/controller/healthcheck.py | 2 +- ecs/jskult-webapp/src/controller/login.py | 8 ++++---- ecs/jskult-webapp/src/controller/logout.py | 2 +- .../src/controller/master_mainte.py | 12 ++++++------ ecs/jskult-webapp/src/controller/menu.py | 2 +- ecs/jskult-webapp/src/controller/root.py | 2 +- ecs/jskult-webapp/src/controller/ultmarc.py | 16 ++++++++-------- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index a11be3d0..108fc747 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -25,7 +25,7 @@ logger = get_logger('生物由来参照') @router.get('/BioSearchList') -async def bio_view( +def bio_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), bio_service: BioViewService = Depends(get_service(BioViewService)) @@ -57,7 +57,7 @@ async def bio_view( @router.post('/BioSearchList') -async def search_bio( +def search_bio( request: Request, bio_form: Optional[BioModel] = Depends(BioModel.as_form), bio_service: BioViewService = Depends(get_service(BioViewService)), diff --git a/ecs/jskult-webapp/src/controller/healthcheck.py b/ecs/jskult-webapp/src/controller/healthcheck.py index a9b819e7..cdb8f00e 100644 --- a/ecs/jskult-webapp/src/controller/healthcheck.py +++ b/ecs/jskult-webapp/src/controller/healthcheck.py @@ -8,5 +8,5 @@ router = APIRouter() @router.get('/') -async def healthcheck(): +def healthcheck(): return {'status': 'OK'} diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 991457f8..c8a5663c 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -30,7 +30,7 @@ logger = get_logger('ログイン') @router.get('/userlogin') -async def login_user_redirect_view(): +def login_user_redirect_view(): auth_query_string = parse.urlencode( { 'response_type': 'code', @@ -45,7 +45,7 @@ async def login_user_redirect_view(): @router.get('/maintlogin') -async def login_maintenance_view(request: Request): +def login_maintenance_view(request: Request): mainte_login = MainteLoginViewModel() return templates.TemplateResponse( 'maintlogin.html', @@ -61,7 +61,7 @@ async def login_maintenance_view(request: Request): @router.post('/maintlogin') -async def login( +def login( response: Response, request: LoginModel = Depends(LoginModel.as_form), login_service: LoginService = Depends(get_service(LoginService)) @@ -117,7 +117,7 @@ async def login( @router.get('/authorize') -async def sso_authorize( +def sso_authorize( code: Union[str, None] = Depends(code_security), login_service: LoginService = Depends(get_service(LoginService)) ) -> Response: diff --git a/ecs/jskult-webapp/src/controller/logout.py b/ecs/jskult-webapp/src/controller/logout.py index 2d8c60c8..36ab6229 100644 --- a/ecs/jskult-webapp/src/controller/logout.py +++ b/ecs/jskult-webapp/src/controller/logout.py @@ -17,7 +17,7 @@ router = APIRouter() @router.get('/', response_class=HTMLResponse) -async def logout_view( +def logout_view( request: Request, reason: Optional[str] = None, session: Union[UserSession, None] = Depends(verify_session) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index aa27ecb2..460e256a 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -35,7 +35,7 @@ router.route_class = AuthenticatedRoute @router.get('/masterMainteMenu', response_class=HTMLResponse) -async def menu_view( +def menu_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -75,7 +75,7 @@ async def menu_view( @router.get('/instEmpCsvUL', response_class=HTMLResponse) -async def inst_emp_csv_upload_view( +def inst_emp_csv_upload_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -177,7 +177,7 @@ async def inst_emp_csv_upload( @router.post('/newInst', response_class=HTMLResponse) -async def new_inst_result_view( +def new_inst_result_view( request: Request, csv_upload_form: Optional[MasterMainteCsvUpModel] = Depends(MasterMainteCsvUpModel.as_form), master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), @@ -219,7 +219,7 @@ async def new_inst_result_view( @ router.get('/instEmpCsvDL', response_class=HTMLResponse) -async def inst_emp_csv_download_view( +def inst_emp_csv_download_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -331,7 +331,7 @@ async def inst_emp_csv_download( @router.get('/tableOverride', response_class=HTMLResponse) -async def table_override_view( +def table_override_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -371,7 +371,7 @@ async def table_override_view( @router.post('/tableOverride', response_class=HTMLResponse) -async def table_override_result_view( +def table_override_result_view( request: Request, master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py index 0f801a9e..96826fce 100644 --- a/ecs/jskult-webapp/src/controller/menu.py +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -22,7 +22,7 @@ router.route_class = AuthenticatedRoute @router.get('/', response_class=HTMLResponse) -async def menu_view( +def menu_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): diff --git a/ecs/jskult-webapp/src/controller/root.py b/ecs/jskult-webapp/src/controller/root.py index 3c47aa7a..c02471ca 100644 --- a/ecs/jskult-webapp/src/controller/root.py +++ b/ecs/jskult-webapp/src/controller/root.py @@ -6,6 +6,6 @@ router = APIRouter() @router.get('/') -async def redirect_to_user_login(): +def redirect_to_user_login(): # ルートパスへのアクセスは、顧客ユーザーログイン画面にリダイレクトさせる return RedirectResponse(url='/login/userlogin', status_code=status.HTTP_303_SEE_OTHER) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index a0161b0a..825c8b50 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -27,7 +27,7 @@ router.route_class = AuthenticatedRoute @router.get('/instSearch') -async def ultmarc_inst_view( +def ultmarc_inst_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) @@ -59,7 +59,7 @@ async def ultmarc_inst_view( @router.post('/instSearch') -async def search_inst( +def search_inst( request: Request, ultmarc_inst_form: Optional[UltmarcInstSearchModel] = Depends(UltmarcInstSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -103,7 +103,7 @@ async def search_inst( @router.get('/instInfo') -async def ultmarc_inst_info_view( +def ultmarc_inst_info_view( request: Request, id: str, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), @@ -143,7 +143,7 @@ async def ultmarc_inst_info_view( @router.post('/instInfo') -async def ultmarc_inst_info_search( +def ultmarc_inst_info_search( request: Request, ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -190,7 +190,7 @@ async def ultmarc_inst_info_search( @router.get('/docSearch') -async def ultmarc_doctor_view( +def ultmarc_doctor_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) @@ -222,7 +222,7 @@ async def ultmarc_doctor_view( @router.post('/docSearch') -async def search_doc( +def search_doc( request: Request, ultmarc_doctor_form: Optional[UltmarcDoctorSearchModel] = Depends(UltmarcDoctorSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), @@ -266,7 +266,7 @@ async def search_doc( @router.get('/docInfo') -async def ultmarc_doctor_info_view( +def ultmarc_doctor_info_view( request: Request, id: str, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)), @@ -306,7 +306,7 @@ async def ultmarc_doctor_info_view( @router.post('/docInfo') -async def ultmarc_doctor_info_search( +def ultmarc_doctor_info_search( request: Request, ultmarc_doctor_form: Optional[UltmarcDoctorInfoModel] = Depends(UltmarcDoctorInfoModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), From 8c6dd39c5977668d495f04db1622ad1a55c5ed2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 21 Aug 2023 17:15:52 +0900 Subject: [PATCH 640/962] =?UTF-8?q?feat:=20=E5=8B=A4=E5=8B=99=E5=85=88?= =?UTF-8?q?=E5=B1=A5=E6=AD=B4=E3=81=AE=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E9=AB=98=E3=81=95=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=A4=9C=E7=B4=A2=E3=81=AE=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=82=A2=E3=80=81=E6=A4=9C=E7=B4=A2=E3=81=AE=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E5=B9=85=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/bioSearchList.html | 4 ++-- ecs/jskult-webapp/src/templates/docInfo.html | 2 +- ecs/jskult-webapp/src/templates/docSearch.html | 4 ++-- ecs/jskult-webapp/src/templates/instSearch.html | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index e0950c20..17482d61 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -112,8 +112,8 @@ diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 17e62a20..07ab2d6a 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -176,7 +176,7 @@

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

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

{% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} From 6dea4faa654300132349f995fc8bffce6e343570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 21 Jul 2023 18:46:54 +0900 Subject: [PATCH 513/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/internal/master_mainte_csv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py index d8714f7a..a7997298 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_csv.py @@ -392,7 +392,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): if len(self.change_end_date) == 0: error_list.append(self.make_require_error_message(self.line_num, constants.CHANGE_INST_CSV_LOGICAL_NAMES[ - constants.CSV_CHANGE_INST_EMP_END_DATE_COL_NO])) + constants.CSV_CHANGE_CHANGE_END_DATE_COL_NO])) elif self.comment == '担当者修正': if len(self.inst_cd) == 0: error_list.append(self.make_require_error_message( @@ -421,7 +421,7 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem): def check_emp_cd_exists(self) -> list[str]: error_list = [] - if not self.start_date or not self.emp_cd: + if not self.inst_emp_start_date or not self.emp_cd: return error_list if self.comment != '追加' and self.comment != '担当者修正': From f20ec701d08f21934276b38469dad5217ac1206b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Jul 2023 09:45:58 +0900 Subject: [PATCH 514/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 21 ++++++++++++------- .../repositories/emp_chg_inst_repository.py | 8 +++---- .../src/services/master_mainte_service.py | 2 +- .../src/static/css/masterMainte.css | 2 +- .../src/templates/masterMainteMenu.html | 2 +- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index e6778b02..f67c0e7f 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -136,19 +136,26 @@ async def inst_emp_csv_upload( raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING) # 画面表示用のモデル - if csv_upload_form.csv_file.size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: - error_message_list = [] + error_message_list = [] + if csv_upload_form.csv_file.size == 0: + error_message_list.append('選択されたファイルが見つかりませんでした。') + elif csv_upload_form.csv_file.content_type != 'text/csv': + error_message_list.append('選択されたファイル形式が"csv"ではありません。') + elif csv_upload_form.csv_file.size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') - mainte_csv_up = InstEmpCsvUploadViewModel( - is_verified=True, - error_message_list=error_message_list, - select_function=csv_upload_form.select_function, - select_table=csv_upload_form.select_table) else: mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view( TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'), csv_upload_form.csv_file.filename, csv_upload_form) + + if len(error_message_list) > 0: + mainte_csv_up = InstEmpCsvUploadViewModel( + is_verified=True, + error_message_list=error_message_list, + select_function=csv_upload_form.select_function, + select_table=csv_upload_form.select_table) + # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 84de084f..91236118 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -76,7 +76,7 @@ class EmpChgInstRepository(BaseRepository): logger.exception(f"DB Error : Exception={e.args}") raise e - UPDATE_SQL = """\ + UPDATE_END_DATE_SQL = """\ UPDATE {table_name} SET @@ -92,7 +92,7 @@ class EmpChgInstRepository(BaseRepository): def end_emp_chg_inst(self, inst_cd, ta_cd, start_date, end_date, update_user_name, table_name): try: - query = self.UPDATE_SQL.format(table_name=table_name) + query = self.UPDATE_END_DATE_SQL.format(table_name=table_name) self._database.execute(query, { 'inst_cd': inst_cd, 'ta_cd': ta_cd, @@ -104,7 +104,7 @@ class EmpChgInstRepository(BaseRepository): logger.exception(f"DB Error : Exception={e.args}") raise e - UPDATE_SQL = """\ + UPDATE_EMP_CD_SQL = """\ UPDATE {table_name} SET @@ -119,7 +119,7 @@ class EmpChgInstRepository(BaseRepository): def modify_emp_chg_inst(self, inst_cd, ta_cd, start_date, emp_cd, update_user_name, table_name): try: - query = self.UPDATE_SQL.format(table_name=table_name) + query = self.UPDATE_EMP_CD_SQL.format(table_name=table_name) self._database.execute(query, { 'inst_cd': inst_cd, 'ta_cd': ta_cd, diff --git a/ecs/jskult-webapp/src/services/master_mainte_service.py b/ecs/jskult-webapp/src/services/master_mainte_service.py index 74da9b68..04fdd69c 100644 --- a/ecs/jskult-webapp/src/services/master_mainte_service.py +++ b/ecs/jskult-webapp/src/services/master_mainte_service.py @@ -82,7 +82,7 @@ class MasterMainteService(BaseService): error_message_list = [] # CSVファイル0件(ヘッダ行のみ)チェック if len(csv_items.lines) == 0: - error_message_list.append('選択されたExcelファイルの2行目以降に値が記入されておりません。') + error_message_list.append('選択されたCSVファイルの2行目以降に値が記入されておりません。') else: for row_item in csv_items: error_message_list.extend([data for data in row_item.validate()]) diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css index 95cdc6e5..4126f298 100644 --- a/ecs/jskult-webapp/src/static/css/masterMainte.css +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -99,7 +99,7 @@ h1{ } /*//////////////////////////*/ -/*施設担当者データExcelアップロード*/ +/*施設担当者データCSVアップロード*/ /*//////////////////////////*/ .inputTable{ margin-left: 3%; diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 957279fa..0abc4ec3 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -9,7 +9,7 @@

MeDaCA
マスターメンテメニュー



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

From 60976d41175076ad61aa6138dd9f430ab3b92686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Jul 2023 11:53:31 +0900 Subject: [PATCH 515/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/internal/master_mainte_emp_chg_inst_function.py | 4 ++-- ecs/jskult-webapp/src/templates/instEmpCsvUL.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py index f272e50c..4f4f6165 100644 --- a/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py +++ b/ecs/jskult-webapp/src/model/internal/master_mainte_emp_chg_inst_function.py @@ -87,7 +87,7 @@ class NewEmpChgInstFunction(MasterMainteEmpChgInstFunction): self.add_emp_chg_inst_table(data, data['適用開始日'], data['適用終了日']) add_count += 1 except Exception as e: - error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。CSVファイルを確認してください。') logger.info(f'新規施設登録時に{row_no}行目でエラーが発生しました: {e}') result_message_list = [] @@ -134,7 +134,7 @@ class ChangeEmpChgInstFunction(MasterMainteEmpChgInstFunction): self.__modify_emp_chg_inst(data) modify_count += 1 except Exception as e: - error_list.append(f'{str(row_no)}行目がSQL実行エラーです。Excelファイルを確認してください。') + error_list.append(f'{str(row_no)}行目がSQL実行エラーです。CSVファイルを確認してください。') logger.info(f'施設担当者変更時に{row_no}行目でエラーが発生しました: {e}') result_message_list = [] diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index 45744fcf..04b2f798 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -99,7 +99,7 @@
登録CSV: {% if mainte_csv_up.is_verified and mainte_csv_up.is_error_message_list_empty() %} From f4a5a653a6bcb26f2686e1a7b6d11a0faff6417d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Mon, 24 Jul 2023 14:21:49 +0900 Subject: [PATCH 516/962] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 3 ++- .../src/repositories/emp_chg_inst_repository.py | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index f67c0e7f..046fc4ab 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -137,9 +137,10 @@ async def inst_emp_csv_upload( # 画面表示用のモデル error_message_list = [] + content_type: str = csv_upload_form.csv_file.content_type.strip() if csv_upload_form.csv_file.size == 0: error_message_list.append('選択されたファイルが見つかりませんでした。') - elif csv_upload_form.csv_file.content_type != 'text/csv': + elif content_type != 'text/csv' and content_type != 'application/vnd.ms-excel' and content_type != 'application/octet-stream': error_message_list.append('選択されたファイル形式が"csv"ではありません。') elif csv_upload_form.csv_file.size >= constants.MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE: error_message_list.append('選択されたCSVファイルサイズが大きいです。100MB未満にしてください。') diff --git a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py index 91236118..404d7bca 100644 --- a/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/emp_chg_inst_repository.py @@ -73,7 +73,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': create_user_name }) except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e UPDATE_END_DATE_SQL = """\ @@ -101,7 +101,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': update_user_name }) except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e UPDATE_EMP_CD_SQL = """\ @@ -128,7 +128,7 @@ class EmpChgInstRepository(BaseRepository): 'update_user_name': update_user_name }) except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e FETCH_COUNT_SQL = """\ @@ -153,7 +153,7 @@ class EmpChgInstRepository(BaseRepository): return 0 return models[0].count except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e finally: self._database.disconnect() @@ -195,7 +195,7 @@ class EmpChgInstRepository(BaseRepository): logger.debug(f'count= {df.shape[0]}') return df except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e finally: self._database.disconnect() @@ -286,7 +286,7 @@ class EmpChgInstRepository(BaseRepository): query = self.DELETE_SQL self._database.execute(query) except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e COPY_TABLE_SQL = "INSERT INTO emp_chg_inst_wrk SELECT * FROM emp_chg_inst" @@ -296,5 +296,5 @@ class EmpChgInstRepository(BaseRepository): query = self.COPY_TABLE_SQL self._database.execute(query) except Exception as e: - logger.exception(f"DB Error : Exception={e.args}") + logger.exception(f'DB Error : Exception={e.args}') raise e From 4cf9b028337e2172585031befaba3ce3676f0551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Mon, 24 Jul 2023 16:56:12 +0900 Subject: [PATCH 517/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E8=A9=A6=E9=A8=93?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/bio_sales_view.py | 2 +- .../src/model/db/pharmacy_product_master.py | 1 + ecs/jskult-webapp/src/model/view/bio_view_model.py | 2 +- .../src/repositories/bio_sales_view_repository.py | 4 ++-- .../pharmacy_product_master_repository.py | 1 + ecs/jskult-webapp/src/services/bio_view_service.py | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 2 +- ecs/jskult-webapp/src/templates/bioSearchList.html | 14 +++++++------- 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 78297aa4..ff62af4b 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -44,7 +44,7 @@ class BioSalesLotDBModel(BaseDBModel): lot_no_err_flg: Optional[str] iko_flg: Optional[str] rec_sts_kbn: Optional[str] - ins_dt: Optional[str] + ins_dt: Optional[datetime] ins_usr: Optional[str] dwh_upd_dt: Optional[datetime] inst_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py index 2f498246..35181012 100644 --- a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -4,4 +4,5 @@ from src.model.db.base_db_model import BaseDBModel class PharmacyProductMasterModel(BaseDBModel): + mkr_cd: Optional[str] mkr_cd_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py index 27f1f851..57f49a15 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -45,7 +45,7 @@ class BioViewModel(BaseModel): '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', - '9': 'エラー(解消済)', + '9': 'エラー(解消済み)', '2': '除外' } ) diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 395fe2cb..4eead447 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -31,7 +31,6 @@ class BioSalesLotRepository(BaseRepository): v_whs_cd, whs_name, nonyu_fcl_cd, - v_inst_cd, product_name, whs_rep_comm_name, whs_rep_nonyu_fcl_name, @@ -42,6 +41,7 @@ class BioSalesLotRepository(BaseRepository): iko_flg, ins_dt, ins_usr, + inst_cd, inst_name_form, address, tel_num, @@ -115,7 +115,7 @@ class BioSalesLotRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ + rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index a430ee67..c2bd95ed 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -9,6 +9,7 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT + t1.mkr_cd, CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 97f7f22b..c0b3c43c 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -156,7 +156,7 @@ class BioViewService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + output_df.to_csv(output_file_path, index=False, header=False, encoding="utf-8_sig") return output_file_path diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 184a3eb9..495abe86 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -85,7 +85,7 @@ BIO_CSV_HEADER = [ 'Veeva卸組織コード', '卸組織名', 'Veeva取引区分コード', - '移行' + '2017年11月以前データ' ] SLIP_ORG_KBN_FULL_NAME = { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 3a1fa7ab..fa1e004a 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -52,12 +52,12 @@ 処理日: - ~ - @@ -74,7 +74,7 @@
発伝年月日: - ~ - @@ -165,7 +165,7 @@ Veeva卸組織コード 卸組織名 Veeva取引区分コード移行2017年11月以前データ
処理日: - ~ -
発伝年月日: - ~ - @@ -126,9 +130,9 @@
- +
- + @@ -165,7 +169,7 @@ - + @@ -182,18 +186,6 @@ {% endif %} - - - - - - - - - - - - From aa8dd9fc597659053c22cf65451a61da255ea3d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 13:14:13 +0900 Subject: [PATCH 539/962] Revert "Revert "Merge branch 'feature-NEWDWH2021-1070' into feature-NEWDWH2021-1069"" This reverts commit 707f7f6839a1d533c5cb1c162a482fe3b9370359. --- .../src/controller/bio_download.py | 27 +--- .../src/data/BioData_template.xlsx | Bin 10348 -> 10423 bytes .../{bio_sales_view.py => bio_sales_lot.py} | 41 ++----- .../src/model/db/pharmacy_product_master.py | 1 + .../src/model/view/bio_disp_model.py | 17 +-- .../src/model/view/bio_view_model.py | 29 ++++- ...ository.py => bio_sales_lot_repository.py} | 74 +++++++---- .../pharmacy_product_master_repository.py | 1 + .../src/services/bio_view_service.py | 29 +++-- ecs/jskult-webapp/src/static/css/bioStyle.css | 18 ++- ecs/jskult-webapp/src/system_var/constants.py | 44 +------ .../src/templates/bioSearchList.html | 115 ++++++++++-------- 12 files changed, 198 insertions(+), 198 deletions(-) rename ecs/jskult-webapp/src/model/db/{bio_sales_view.py => bio_sales_lot.py} (61%) rename ecs/jskult-webapp/src/repositories/{bio_sales_view_repository.py => bio_sales_lot_repository.py} (75%) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 8ff711c8..454ff857 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -60,12 +60,8 @@ async def download_bio_data( logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} - # ファイルに打ち出すカラムを抽出 - # TODO: SQLクエリを修正するため、この処理は不要になる - extract_df = _extract_output_df(search_result_df) - # ファイルを書き出し(Excel or CSV) - local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) + local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: @@ -116,27 +112,6 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i return search_result_df, query -def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - - # 値を変換 - # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( - lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) - # データ区分の区分の日本語名を設定 - extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) - # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( - lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') - - return extract_df - - def _write_bio_data_to_file( bio_service: BioViewService, download_param: BioDownloadModel, diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx index 4a6292ff20b0ab793c282b122e8254d682f6ee53..ec1575a2932f20bd823620b1001e6192ca7f420b 100644 GIT binary patch delta 4416 zcmY+IcTf{b*TzHW9YP5rN=rhKDoBtTMKA=UccgQr6X_se3`kHqMCo0M6ltMISCHP3 zCLp~^0Hqg!*E{pg{qEiUXLshevomMU?s=Xi>eT60EKyKv-4(1Z0RjL*_?y&VjDfE9 zj0Ds3tm-T4Q$>i@R|LNvndrE%8w)3$r7-WL$My2p8Q&O0@Bco|z!#98wedJ_Ppt=C z?(8(mE6%(jf3`491=ZJ#0Y-ha7iRHHS(=Bl?2_@@74k>2dg>Fv14GL6leG6Pb6&w4kN*WpgB*9@7vGjs!P>lkOBIyk9!V&IZ zM6F#Mr%Y{4)tL6l`>CN&vXPo7kr{C=x=DJazQD34OqSNp(ZndUcL#%E5(}3%lDp(7 z@egO){fzwSBn=#Ou1-MwRC+Zr??LR{aEBZ-3WVF_iR5^Bsk+5DTjcq_=|`1)bB3Kx+ixk*-M_uu-+!5G zXkmgLSZ9h$8F5Y2)o>86MlsSZE03X4B10Lmjy<)z=ulv~H|uQS>1*I$0!y?26N zaA84JZq(Ym)Omj5DO%kZ`W%e8x(X@&%Yq*da&`R|GalycstRBf?=LO)jW~i7LZ#%i zl5=YY>Nfp`g<^OnDGRv0znUWB#`tEw`qR|LuCKvW90GkA8rA%6@k|8fe1uNVQl}L8 zL^S`jX9_Wo{Z6r2zuF)<|GIxIyXGF#_EC#RWj|Kx?oMN<4k*Sv!peiQE* zzo?f22VD!*?`*g3PFW*RY>P&sO3)KUnO(0KLX-Ts;X&J5_9`K!7=6}X1#etNTxk#X zyOzi4BdTo%QVpvX$)Bxqe*gabcZCA#u+%R-jf$1iB0EF!Ts2|Cv&*Hxu6~^!6I2yn z{Dk7taOS}-n}Z9ys0@@)5TGYDl5J#@Q{dP=p!ViBUWD-uTJu(}e+ONu)$SL|z?z11 zK4YoFped`jRdb~;{h^ddt|z#Hi4 zi^rc|Z9{K}T@o-GzV+-272gf>P6`mm{vKE4?^b*_0cX$?-Pon>ig7>7U!zZvA-eXb zkJV3Ixr0K?g^X^dP}89>je`xq{YWjN<^DsFOlz zdcp2OxHZgm8aTi5OA0)bf$bPhHW|?~$_7lnXRn}5xn$_Lk7S(1o&(n#EtCvU_H>3?Q|v#BYwbp>SR-%UwX+=5sWA&*OvE8M#m653@U zL$|pS6nCYq4>Vk_3{Z)FpbvVs1H@}!Whhm2jA6@U% z(z}y&jxjt`xF)k<{vf;L$llRd!kt}zhJXgye=%eyIx|kZ*Pnf9$Z<&DPB9mwpwlje zqEr*Q+qJb9ud4V?=4aVTj{nHz2`5h&1&9Aj9mXPh+#It%=~yi8^r27ZW$EdM*0h~XO|=|U|0Z9DS8T}GNs93~#C9m5eW;%Y{-{vNg+AHao1v+=e} zhnX0r_h$$y``}sT&E_UxgBCTmLVG1Pn<&K_cNE6tc#fj_63kEbqa_fOv(ptr_soKC zEF<0u+u(ISdq;p*=Qxt-eTn@`<~`vQo0l!UI4bO0P09NoaF^_<*Cixq%FF*x9Nu|&ElQBhqP-3V!~3D0d~E* zMjWE2Fn>BIKC}{G;pwgV_K6-uR)Ja~mk)oJrH|~&JLQ>5R5dT3z+;-!1^V%m(}Ni_ zY}!?}*+kcw2|<;y@K$oGa(ByBRRfc&y^>0EqK7mDk!sW&9GdASxZE=ERHg~RT7h6s zLnXurDhO1rrJ;*Bel?Y&);c{Uy1ngvf2Vljec`GFL=D3^M8!u|hq-uM>-Ee9QoH9i zv__<#df}`}&_qqSKz{F`QjZw~p~N5*b-^=DXf}GtcNnZ%o=nf3sYN3cg;7f>eX0Hw z-6)x{F}V@(lnVXoViSUYES#4ZNml5z@Z8rtEGi@s(R)Oo?PhKymacbn4t(kdZ#g+ zC|s7of&JOl!x||=Qj5;h7L10Cog8*n%HTCCyW{!udQ+7NYC(J_&~Gq8+4EUZH!NzY zoxFNQqz-G5>C-ODJ>42+O2i<)4=wr$&LHJ%cSwxH@_KWqiFyJ+`hf}WHYXc^aph{S zQuJeU(NPY;H=7U#dm-{gnY+Fq3w6hv!vY{WA#0Wcmil#bsQC>_3`$lhW)KTR1a+Mw zUUznfyUlXamh}m)gD1MPA_K3&teq`*bl*BTS*}pyYMnJ4j%ixvTVz_C*(bs+swo;t z&xwL224M5Q?3>rp^am4j^J-O0Qtj)i>t5KTY_nVo%I}3fvIw$P$9TUI;@K&FUoipB^`4L%( zR#uY57C&mmZ?to5OjEdQ?Fg48O(U!7l!*|^~!Rk4RlqLm|L+Q><6A@?0XnhQScFYvb~{v!T5KXrv^BfTwePl zQIU9Nx*M2BXwW^5u3gyk@PXOw`;ST``;M$_msAzsAJc30!H6O|bkTE9jpsP2rD#NKuv4RkmN)U&R(%TNu9jAxA!W zt?}rN%dul+e)j{zmAf=Qy@UGA+$PQkicgKpjfF&iFRstU)<~GOJl)<8uq~`+mv&H@ zEW)7mhMi5Bx^Pxg8-b3q(ch-6%uee#2RM_szK(oyVeh~>rcX(yZb z{gwLS=J-$o53sf0m=%^;wJKnKmFOy01VXf#zBl+Cy{bJAQ{8)G>5sgLO8lfwyCIu zNc++;-2$X!2O%v|xDXc~G`i+NW#5R)S)Zadl ze!v#h<=tfCK8hrw)D+Yw72w&i(|em+$AyhE#Kp_?+^#Mj7P%0()-U$8zLXX zaM_vhvHNheaaSI(EQt`BK4hFuYe{7k^kX8U-%pn=`kCEIYea{FLtsE2d8|AtV&~uCOY%Y$TrTV zy|os#hkFW-#34IW7BQ!$QWO!q9wVbyxV1U&pkM9;G>1va&?9|Q4C$A;G57=-cksQQ zq>Rs~o}!{;_vkexlj$vko=v?E^adYStSu01x;;rD4Qd;>THy6uBT-Q^=@k{ww)oAN zdgOD&7X|?qQ8L;XjuMya?9FAV$a~z3v0d%+%k9g*7PSQ!THmg8ekQJZ4;jqFKAVGA z$hr}M6g)Coy6{9{r>OZzHnL}-K}yiwYZN;q4iET}cg{RnE`RYeV6;%RMvT{bFjlJNi;2#p!itU$Zy#uueSbZ3QteoL2RBr{ z4kjF^^lB>=37zf@9I_-(vk}T~$OG|7&{tgl{0dM20E~ctw=oKQD2x}+4dVosQsd=e zB3%C%Fc1L1@oy9`Pm5O+cmU*O#)k?(VgIka008>`a2;R(z~5Ee%R9jJFZ>9Mjq9Hm z|BtU@{STUR9sdaiyY3h?)?r z5-p;I=t~^m`M#6)d(X_Dnd`Z)nQP{{pJ(p58x6M&s=krdwophCqSnifnED6-0CiFT zfDQlvJaZTGM|!*2A(3vP&pg}!+Ec8!8vM%5@N&%4%*i(ld`{1Mk!bbwr2{~9|G=RAcbF;==-7zm5PfBDMg_Y z4;6};iUPy$=gHr{H`F{LIZqn_+<jRZWCnZI$;z6uOf~RvQfBsicvHZSl-VX;nnjsmb;Kk1GTo2NFn?N_zb?#`#{&ar4 zp|=x`4@mMuWl{Px9yMDMXUh$WOs85X8%{)!G^Q%MHc|$q3W+zKWL*hFts5BI!jdUq zj`Uft^<0gyQ|5_3lL&ASww$ua2Jh`s`UhC-&tF)TQ5BTU5~uUpqgq~T@&sO+*AB1F z(`rGraKY}74kx8wlD8(|$e&b_lifpSWQxY?3{g;&aXlvRLdK0#S1ZX;tm4>K>GmaM z|5FW)C197(U_)Q=?n{M})Xms=720#$zAZ5O%wvKBzfz^RA9I`G6s_7hc~k!bVsCYu zqUXD~U3{7h?z~&I{~eW+9J$q)A0t#19`EpA<<^XH$JV0M{p~@Dr?SfxVN!cpt3?av z`UC2y3L%X*PV-cE7E3AT<9dp2{qX&8*(&x(#K?AzwlvBB_LoVbb+vrO*Uavf)^#xJ zMTEZJB4I`8iGvCE!(CcF&+66=UGXXP)#I_rNI2QdMdEm3GbXIkLXJl@$gINoH$W3b z003NF5djSJh=@S|QULii%b|dQumP@90stX^72U+jj@m;`+=28jzByHq3fYUtyu0Ob z@}VdFTr*_xy*y@2*xPa3e}?j;?19vhFDB*7Ww# zlYsN~jsC&8y`;=4DoSnHJg$XB-8jN97s>o?c8%c6A7}0SZ^J}roa!lt zlX(IKBV2W${bhSY0kumjdL>JacM=mOUyZ7bdp}XnrBAUkH1g}E3F!%gzV&X09V;m) zy&V}!NPqJZj;iswvgApe8m$Ux(cPZnQWciz(nl%ksABx|*|LJ)PGYOQu0A$|qWf}2 zoM+`9XWZ)#onB+*OOknAKk!@LOE?9!Xv^l-wVxS$2H8r`*G#Boa4|_$hpsQaxqzgM z231okRHD6Kyu>{tn~pEI*pgx!$H3NUI!(VF@*O@)pj9N=mYeYsY}5(eaxnLB=R0YY zu0hEjwZ;tV`=BfO(-&pkgJw2s<*Cn$eS<&b?7y$Q?7CI*866YiCGSv^3;%0-0Bn1A z&3`-gFncd}JHfYNVbjV_Ol6%InZ8ocbH-VrD&E8bb0s#x^M@ z>EnS%d746zve3abc(Km}0aVWj@M~&ke!A=0RJ;cu8tSPrFQ0t&-)C zsuu-s*7n4Z?mm7&QsNx6v%8MNjo5tOT_2s>>O^9%nnUo%$LDlG{f(3s(m_*Qd549S zHq(KFV}gMM>fVR>QhI55uUDJf&6DHz{mM!*V*!(~<#&#BVDkb*mzcB15&6VjFkyjp7O2%q4jF z3tGo5eXY^k?}wt`@^CxZ(4BGL4=xD6!)kAr9L>sdCKqalE#Fj0BVE;|q%qUC!W3ZY zUW{$*^O4k1o-pJqcV9NalYFN4N)J_3z_DlksewITJ` zPr7EJ?$)T3ulcjL7S+U8!OD1qlnUwrHxlwO+PYKA9tj#QmqZUtitJ?*5MEkO~j-ebz2>Cq&4bJ^n&MD zLc0`g{#mYy;)}_q?%ScOiHxU+8GXI9U?rLIx0!JspoWgU>+9d!?3 zZC$j)ap#@`-u-T_Hmt(WFL)8XtL*>j;P<14g9%cmn@$?e7__=f;lewoMy}3KWouk& zkHWaSdLe5w7j_~Q-}-_hjo%}C$67Z%OwInG!`?h1#j#<2*kT6G;eaB_aj!3ldX5?q zttI2`E%GZZOI!;``K%^gU~HBFq-n>M8ijsYt4>SWQco<8e119Cu3!c)8wNI8WNfS~ zmrflK@O&vX+N}rk>R5?pKTVRcv+8Od_2nB{bze&F;^-IOxlGWm7fNaf+%huw)N<3rYhaS@@ zcU8={Ix%;=faNUSt6?$?o%qaA?-c|LQ=S>9kTZSKCeN`OGL0%0Guk<(&CU#1HhNga z+Qe6X5JG$!>(ltcI=QeeV~wQs`10^aN<_?1zF$jUM!Nw&!5Na*_Vy8jYy|pu)bOk^|=^&`-*&&{)vg7&E+jFg) z5f43Xb#;VtQ?^W7`y)=Zm+0J#YAr-R>{CV4 zuWujXgN&%(Dg#l3CL9#uo71ZrtCEf+gV(GS1-q65FLU9uHo z#S4peZXfOmPKzhb+Hdx2y*KZnViOG1;qjD*FCh46A-(mXc+HCENb%&}jH;-F*8*{v zsF&j}&F*G;ef28*nMe9fe7iu5((Py8n-~`M!C|TP)Fysk`E}+IX93cF4ZSNjOwig7O~5ADdNw0Y%t-OIM}ftVCeZ zfJo8Y_;;&rYB(<6Ez9RLhGl6?FqQ*o+%cKhPa~d1PCK%+IHm{^E$W$i8dYo=pV3(H z%H-xL{_xZ{@Zxja$^+hJFM(t4^AY&mN#KHPl^k-LniRz;nwkFuW&-JCaw9*aJ2-pU z_88JcmU%x;yZfV{4aztBFy@4kZCl(E0oSvUU82oo`OLi4(ckK{g$(=YIJu!yF9@~$ zlrFi@lVQ-e@eLch=LV0JT7QWlb>dQ!}Z_e0~=Mw~uBm zL%I5s_b4JSH2RMF%+rBms*-ynD8+z}Bij#2VGlS>imp!Sm z6RzfpRKj0W9mqZ}#1tMBdJ}YzY(R6vGm=x23J-*zhJQ!teadeM)9fR;B@(_ND#cJj z&AMCI@{)BaAT4B-CU=T~caOwaMX;u#z!Y83NqNMX3yxu7se&|{k^dgjAip2%V|(Xm zMpD(_BrJjzzoVXf1TAdTRNY9ur`uE3A5TB=Jl!ZykEnH3BcCnQ5qS_~5 z)|VF~l>NsjI53w`+ZRDx6k*p9S?Q;$rRD@4agG&&yf}QeGGDH`ZK0`DG_53?tK$E; z8@JexY8;##$%(<^Rd-bgzuq)r!G-BN?|I+bB$0=81Y2>`l%iUs<{oHNGra``yk2{J zSy_9g98*2+Zq-(n!R*2}p;j(wxPBvxy_Y%M^)!%{0kNVc>-2X0^R}hwC;&ann~ZLu zpaot(zkk})wM~E?qF_NU@&VcY+dKG!0+3Olqxqn0|M$rPu#x}(pueNnqjM_s2tObH z-*OuOp!o-YhxXrIgpY54yQ2>p$`4}u^WZZ80FZxR*Xhwz{OW|4OlU)XUbLqG3u7KT z0N{YMH}FP!`iR;4`S>C|{=LSZ8gVW0|8XwBcMi0^02kXIMqXPY^#9mohzm_800xm< SUjP6=b=|wJA+LD None: +class BisDisplayModel(BioSalesLotDBModel): + def __init__(self, param: BioSalesLotDBModel) -> None: super().__init__(**param.dict()) - - # 区分・フラグの正式名称を設定 - self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) - self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) - self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) - - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - if (self.bef_slip_mgt_num is None): - self.ins_dt = "" - self.ins_usr = "" 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 8f5e4875..57d5f153 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -23,7 +23,7 @@ class BioViewModel(BaseModel): def display_wholesaler_names(self): display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name}' + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name or ""}' for whs_model in self.whs_models ] return display_names @@ -45,15 +45,38 @@ class BioViewModel(BaseModel): '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', - '9': 'エラー(解消済)', + '9': 'エラー(解消済み)', '2': '除外' } ) def bio_data_json_str(self): + """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj - return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) + + search_data_list = [model.dict() for model in self.bio_data] + search_data_len = len(search_data_list) + # 呼び出し一回あたりの分割数 + part_size = 500 + for i in range(0, search_data_len, part_size): + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # JavaScriptに埋め込むため、クォートをエスケープ + json_str = json_str.replace("'", "\\'") + json_str = json_str.replace('\\"', '\\\\"') + yield json_str + + def make_whs_name(self): + if not self.is_form_submitted(): + return '' + if self.form_data.rec_whs_cd is None: + return '' + + form_wholesaler_full_name = \ + f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' + + return form_wholesaler_full_name def is_selected_whs_name(self, selected_wholesaler): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py similarity index 75% rename from ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py rename to ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index 46eb2b91..28a59ea5 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_view import BioSalesViewModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -9,37 +9,59 @@ from src.util.string_util import is_not_empty logger = get_logger('生物由来参照') -class BioSalesViewRepository(BaseRepository): +class BioSalesLotRepository(BaseRepository): FETCH_SQL = """\ SELECT - ( - CASE - WHEN LEFT(bs.v_tran_cd, 1) = 2 - AND bs.qty >= 1 THEN CONCAT('-', bs.qty) - ELSE bs.qty - END - ) AS amt_fugo, - bs.*, - ln.ser_num, - ln.lot_num, - ln.expr_dt + data_kind, + slip_mgt_num, + rec_ymd, + rec_whs_cd, + rec_whs_sub_cd, + whs_name, + rec_whs_org_cd, + rec_urag_num, + rev_hsdnymd_srk, + rec_tran_kbn, + tran_kbn_name, + mkr_cd, + rec_comm_cd, + product_name, + whs_rep_comm_name, + nonyu_fcl_cd, + rec_nonyu_fcl_name, + whs_rep_nonyu_fcl_name, + rec_nonyu_fcl_addr, + whs_rep_nonyu_fcl_addr, + rec_lot_num, + qty, + expr_dt, + data_kbn, + err_dtl_kind, + bef_slip_mgt_num, + ins_usr, + ins_dt, + inst_cd, + inst_name_form, + address, + tel_num, + v_whs_cd, + v_whsorg_cd, + whs_org_name, + v_tran_cd, + iko_flg FROM - src05.bio_sales_view bs - LEFT OUTER JOIN - src05.lot_num_mst ln - ON bs.mkr_cd = ln.ser_num - AND bs.rec_lot_num = ln.lot_num + src05.bio_sales_lot WHERE {where_clause} ORDER BY - bs.rec_whs_cd, - bs.rec_whs_sub_cd, - bs.rev_hsdnymd_srk, - bs.slip_mgt_num + rec_whs_cd, + rec_whs_sub_cd, + rev_hsdnymd_srk, + slip_mgt_num ASC\ """ - def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: + def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]: try: self._database.connect() logger.debug('DB参照実行') @@ -48,7 +70,7 @@ class BioSalesViewRepository(BaseRepository): logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.dict()) logger.debug(f'count= {len(result)}') - models = [BioSalesViewModel(**r) for r in result] + models = [BioSalesLotDBModel(**r) for r in result] return models except Exception as e: logger.exception(f"DB Error : Exception={e.args}") @@ -93,8 +115,8 @@ class BioSalesViewRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ - where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) + rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ + where_clauses.append(SQLCondition('TRIM(rec_lot_num)', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn')) diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index a430ee67..c2bd95ed 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -9,6 +9,7 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT + t1.mkr_cd, CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index d1102598..f77a6a5b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.bio_sales_lot_repository import BioSalesLotRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ @@ -27,7 +27,7 @@ class BioViewService(BaseService): REPOSITORIES = { 'whs_repository': WholesalerMasterRepository, 'phm_repository': PharmacyProductMasterRepository, - 'bio_sales_repository': BioSalesViewRepository + 'bio_sales_repository': BioSalesLotRepository } CLIENTS = { @@ -36,7 +36,7 @@ class BioViewService(BaseService): whs_repository: WholesalerMasterRepository phm_repository: PharmacyProductMasterRepository - bio_sales_repository: BioSalesViewRepository + bio_sales_repository: BioSalesLotRepository s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: @@ -119,6 +119,9 @@ class BioViewService(BaseService): logger.info(parameter_message) access_logger.info(parameter_message) + # ログファイルクローズ + access_log_handler.close() + # S3にアップロード self.upload_bio_access_log_file(access_log_file_path) @@ -153,14 +156,16 @@ class BioViewService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + output_df.to_csv(output_file_path, index=False, header=False, encoding="utf-8_sig") return output_file_path def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -168,8 +173,10 @@ class BioViewService(BaseService): def upload_bio_access_log_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'log/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -177,8 +184,10 @@ class BioViewService(BaseService): def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 7ecde3c5..0eadc543 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -81,9 +81,25 @@ table{ .bioScroll_div { overflow: auto; + white-space: nowrap; margin-top: 1%; + margin-bottom: 1%; + width: 100%; height: 250px; - width: 1132px; +} +.bioScroll_div::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.bioScroll_div::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.bioScroll_div::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; } .noLine{ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index a50d498e..7be637b9 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -5,49 +5,11 @@ 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') -BIO_EXTRACT_COLUMNS = [ - 'slip_org_kbn', - 'slip_mgt_num', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_name', - 'rec_whs_org_cd', - 'rec_urag_num', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_name', - 'mkr_cd', - 'rec_comm_cd', - 'product_name', - 'whs_rep_comm_name', - 'nonyu_fcl_cd', - 'rec_nonyu_fcl_name', - 'whs_rep_nonyu_fcl_name', - 'rec_nonyu_fcl_addr', - 'whs_rep_nonyu_fcl_addr', - 'rec_lot_num', - 'amt_fugo', - 'expr_dt', - 'data_kbn', - 'lot_num_err_flg', - 'bef_slip_mgt_num', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_num', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_name', - 'v_tran_cd', - 'iko_flg' -] - BIO_CSV_HEADER = [ 'データ種別', '伝票管理NO', @@ -85,7 +47,7 @@ BIO_CSV_HEADER = [ 'Veeva卸組織コード', '卸組織名', 'Veeva取引区分コード', - '移行' + '2017年11月以前データ' ] SLIP_ORG_KBN_FULL_NAME = { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index ae7a3d7c..4dafce34 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -5,16 +5,16 @@ {% include '_header.html' %} {% endwith %} - - @@ -52,16 +52,14 @@ @@ -76,7 +74,7 @@ @@ -86,7 +84,7 @@ {% for phm in bio.phm_models %} {% endfor %} @@ -96,16 +94,14 @@ @@ -200,8 +200,14 @@ {% endif %}

+ + {% with progress_message = '処理中...しばらくお待ち下さい。'%} {% include '_loading.html' %} {% endwith %} + + {% with progress_message = '', id = '_loading_for_back' %} + {% include '_loading.html' %} + {% endwith %} diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 02e43784..b5fe6a58 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -25,7 +25,7 @@
データ種別 伝票管理NO 処理日Veeva卸組織コード 卸組織名 Veeva取引区分コード2017年11月以前データ移行
処理日: - ~ -
発伝年月日: - ~ - @@ -130,9 +126,9 @@
- +
- + @@ -169,7 +165,7 @@ - + @@ -186,6 +182,18 @@ {% endif %} + + + + + + + + + + + + From 0954f67f172cbd3eabeb2be0d44b5249e975fd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 13:56:26 +0900 Subject: [PATCH 540/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=EF=BC=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/repositories/wholesaler_master_repository.py | 2 +- ecs/jskult-webapp/src/static/function/businessLogicScript.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py index 8841f643..e9229d8e 100644 --- a/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/wholesaler_master_repository.py @@ -22,7 +22,7 @@ class WholesalerMasterRepository(BaseRepository): v_whs_cd, rec_sts_kbn FROM src05.whs_mst_v - WHERE (SELECT STR_TO_DATE(syor_date, '%Y%m%d') FROM src05.hdke_tbl) BETWEEN start_date AND end_date + WHERE src05.get_syor_date() BETWEEN start_date AND end_date ) v2 ON b.v_whs_cd = v2.v_whs_cd AND v2.rec_sts_kbn <> '9' diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 9983067d..c4a46ca6 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -16,6 +16,9 @@ function clr() { if (formInput.name.startsWith('ctrl_')) { formInput.value = ""; } + if(formInput.name == 'ikoFlg'){ + formInput.checked = false; + } } // 検索ボタンを再度非活性にする From 50e1767e8e3b29e236e38dd8546e753a9b86e6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 14:34:35 +0900 Subject: [PATCH 541/962] =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=83=9C=E3=83=83=E3=82=AF=E3=82=B9=E3=81=AE=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=82=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/function/businessLogicScript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index c4a46ca6..56d971e4 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -16,7 +16,7 @@ function clr() { if (formInput.name.startsWith('ctrl_')) { formInput.value = ""; } - if(formInput.name == 'ikoFlg'){ + if(formInput.name == 'ikoFlg' || formInput.name == 'delFlg_ctrl'){ formInput.checked = false; } } From 4ec64f6e4facdf0e134913456eefbda70c051b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 15:20:24 +0900 Subject: [PATCH 542/962] =?UTF-8?q?=E6=97=A5=E4=BB=98=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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 57d5f153..2c3c583c 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -54,7 +54,7 @@ class BioViewModel(BaseModel): """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): """json.dumpsの日付項目のフォーマットハンドラ""" - return obj.isoformat() if hasattr(obj, 'isoformat') else obj + return obj.isoformat().replace('T', ' ') if hasattr(obj, 'isoformat') else obj search_data_list = [model.dict() for model in self.bio_data] search_data_len = len(search_data_list) @@ -73,8 +73,7 @@ class BioViewModel(BaseModel): if self.form_data.rec_whs_cd is None: return '' - form_wholesaler_full_name = \ - f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' + form_wholesaler_full_name = f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' return form_wholesaler_full_name @@ -82,8 +81,7 @@ class BioViewModel(BaseModel): if not self.is_form_submitted(): return '' - form_wholesaler_full_name = \ - f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' + form_wholesaler_full_name = f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' return self._selected_value(form_wholesaler_full_name, selected_wholesaler) From af1ee8ed6aab17c8c1421516111acdd6be3c3932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 17:06:48 +0900 Subject: [PATCH 543/962] =?UTF-8?q?=E7=94=BB=E9=9D=A2=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/bioStyle.css | 2 +- ecs/jskult-webapp/src/templates/bioSearchList.html | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 0eadc543..14fe4ea6 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -1,7 +1,7 @@ /* Bootstrap 5.10以降、box-sizingのデフォルト値によってテーブルがずれるため、このページ限定的にリセット */ /* @see https://bootstrap-guide.com/content/reboot#page-defaults */ *, ::after, ::before { - box-sizing: initial; + box-sizing: revert; } body { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 4dafce34..6dc40888 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -294,6 +294,9 @@ $(val).off('keypress') }) }) + // ページ送りしたときにヘッダがずれるのを修正 + FixedMidashi.remove(); + FixedMidashi.create(); } }) }); From ca07205c5cd1e3ab1545f018a037df9ef511100a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:16:11 +0900 Subject: [PATCH 544/962] =?UTF-8?q?=E4=BB=AE=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 24 +--- .../src/model/db/bio_sales_view.py | 110 +++++++++++++----- .../src/model/view/bio_disp_model.py | 6 - .../src/model/view/bio_view_model.py | 11 ++ .../repositories/bio_sales_view_repository.py | 75 ++++++++---- .../src/services/bio_view_service.py | 3 + ecs/jskult-webapp/src/system_var/constants.py | 6 +- .../src/templates/bioSearchList.html | 57 ++++----- 8 files changed, 182 insertions(+), 110 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 8ff711c8..61d326b4 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -61,8 +61,7 @@ async def download_bio_data( return {'status': 'ok', 'download_url': None} # ファイルに打ち出すカラムを抽出 - # TODO: SQLクエリを修正するため、この処理は不要になる - extract_df = _extract_output_df(search_result_df) + extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] # ファイルを書き出し(Excel or CSV) local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) @@ -116,27 +115,6 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i return search_result_df, query -def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - - # 値を変換 - # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( - lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) - # データ区分の区分の日本語名を設定 - extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) - # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( - lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') - - return extract_df - - def _write_bio_data_to_file( bio_service: BioViewService, download_param: BioDownloadModel, diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 325ccbbc..8b28f225 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -5,70 +5,120 @@ from src.model.db.base_db_model import BaseDBModel class BioSalesViewModel(BaseDBModel): - conv_cd: Optional[int] - rec_data: Optional[str] + # conv_cd: Optional[int] + # rec_data: Optional[str] + # rec_whs_cd: Optional[str] + # rec_whs_sub_cd: Optional[str] + # rec_whs_org_cd: Optional[str] + # rec_cust_cd: Optional[str] + # rec_comm_cd: Optional[str] + # rec_tran_kbn: Optional[str] + # rev_hsdnymd_wrk: Optional[str] + # rev_hsdnymd_srk: Optional[str] + # rec_urag_num: Optional[str] + # rec_comm_name: Optional[str] + # rec_nonyu_fcl_name: Optional[str] + # rec_nonyu_fcl_addr: Optional[str] + # rec_lot_num: Optional[str] + # qty: Optional[str] + # rec_ymd: Optional[str] + # sale_data_cat: Optional[str] + # slip_file_name: Optional[str] + # slip_mgt_num: Optional[str] + # row_num: Optional[int] + # hsdn_ymd: Optional[str] + # exec_dt: Optional[str] + # v_tran_cd: Optional[int] + # tran_kbn_name: Optional[str] + # whs_org_cd: Optional[str] + # v_whsorg_cd: Optional[str] + # whs_org_name: Optional[str] + # whs_org_kn: Optional[str] + # v_whs_cd: Optional[int] + # whs_name: Optional[str] + # nonyu_fcl_cd: Optional[str] + # v_inst_cd: Optional[str] + # v_inst_kn: Optional[str] + # v_inst_nm: Optional[str] + # v_inst_addr: Optional[str] + # comm_cd: Optional[str] + # product_name: Optional[str] + # whs_rep_comm_name: Optional[str] + # whs_rep_nonyu_fcl_name: Optional[str] + # whs_rep_nonyu_fcl_addr: Optional[str] + # mkr_inf_1: Optional[str] + # mkr_cd: Optional[str] + # htdnymd_err_kbn: Optional[str] + # prd_exis_kbn: Optional[str] + # fcl_exis_kbn: Optional[str] + # amt: Optional[int] + # slip_org_kbn: Optional[str] + # bef_slip_mgt_num: Optional[str] + # lot_no_err_flg: Optional[str] + # iko_flg: Optional[str] + # kjyo_ym: Optional[str] + # tksnbk_kbn: Optional[str] + # fcl_exec_kbn: Optional[str] + # rec_sts_kbn: Optional[str] + # ins_dt: Optional[datetime] + # ins_usr: Optional[str] + # dcf_inst_cd: Optional[str] + # inst_cd: Optional[str] + # inst_name_form: Optional[str] + # address: Optional[str] + # tel_num: Optional[str] + # data_kbn: Optional[str] + # ser_no: Optional[str] + # lot_num: Optional[str] + # expr_dt: Optional[date] + # amt_fugo: Optional[str] + slip_mgt_num: Optional[str] + conv_cdR: Optional[int] rec_whs_cd: Optional[str] rec_whs_sub_cd: Optional[str] rec_whs_org_cd: Optional[str] - rec_cust_cd: Optional[str] rec_comm_cd: Optional[str] rec_tran_kbn: Optional[str] - rev_hsdnymd_wrk: Optional[str] rev_hsdnymd_srk: Optional[str] rec_urag_num: Optional[str] rec_comm_name: Optional[str] rec_nonyu_fcl_name: Optional[str] rec_nonyu_fcl_addr: Optional[str] rec_lot_num: Optional[str] - rec_qty: Optional[str] rec_ymd: Optional[str] - sale_data_cat: Optional[str] - slip_file_name: Optional[str] - slip_mgt_num: Optional[str] - row_num: Optional[int] - hsdn_ymd: Optional[str] - exec_dt: Optional[str] v_tran_cd: Optional[int] tran_kbn_name: Optional[str] whs_org_cd: Optional[str] - v_whsorg_cd: Optional[str] + v_whsorg_cd: Optional[int] whs_org_name: Optional[str] - whs_org_kn: Optional[str] v_whs_cd: Optional[int] whs_name: Optional[str] nonyu_fcl_cd: Optional[str] v_inst_cd: Optional[str] v_inst_kn: Optional[str] - v_inst_nm: Optional[str] + v_inst_name: Optional[str] v_inst_addr: Optional[str] comm_cd: Optional[str] product_name: Optional[str] - whs_rep_comm_nm: Optional[str] - whs_rep_nnskfcl_nm: Optional[str] - whs_rep_nnsk_fcl_addr: Optional[str] + whs_rep_comm_name: Optional[str] + whs_rep_nonyu_fcl_name: Optional[str] + whs_rep_nonyu_fcl_addr: Optional[str] mkr_inf_1: Optional[str] mkr_cd: Optional[str] - htdnymd_err_kbn: Optional[str] - prd_exis_kbn: Optional[str] - fcl_exis_kbn: Optional[str] - amt: Optional[int] + qty: Optional[int] slip_org_kbn: Optional[str] bef_slip_mgt_num: Optional[str] lot_no_err_flg: Optional[str] iko_flg: Optional[str] - kjyo_ym: Optional[str] - tksnbk_kbn: Optional[str] - fcl_exec_kbn: Optional[str] rec_sts_kbn: Optional[str] - ins_dt: Optional[datetime] + ins_dt: Optional[str] ins_usr: Optional[str] - dcf_inst_cd: Optional[str] + dwh_upd_dt: Optional[datetime] inst_cd: Optional[str] inst_name_form: Optional[str] address: Optional[str] - tel_no: Optional[str] + tel_num: Optional[str] data_kbn: Optional[str] - ser_no: Optional[str] - lot_num: Optional[str] + data_kind: Optional[str] + err_dtl_kind: Optional[str] expr_dt: Optional[date] - amt_fugo: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index e78d4f29..2ebf2c00 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -1,5 +1,4 @@ from src.model.db.bio_sales_view import BioSalesViewModel -from src.system_var import constants from src.util.sanitize import sanitize @@ -8,11 +7,6 @@ class BisDisplayModel(BioSalesViewModel): def __init__(self, param: BioSalesViewModel) -> None: super().__init__(**param.dict()) - # 区分・フラグの正式名称を設定 - self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) - self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) - self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット if (self.bef_slip_mgt_num is None): self.ins_dt = "" 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 8f5e4875..1cd4f4a1 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -55,6 +55,17 @@ class BioViewModel(BaseModel): return obj.isoformat() if hasattr(obj, 'isoformat') else obj return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) + def make_whs_name(self): + if not self.is_form_submitted(): + return '' + if self.form_data.rec_whs_cd is None: + return '' + + form_wholesaler_full_name = \ + f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}' + + return form_wholesaler_full_name + def is_selected_whs_name(self, selected_wholesaler): if not self.is_form_submitted(): return '' diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 46eb2b91..0b3a52a5 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -12,30 +12,65 @@ logger = get_logger('生物由来参照') class BioSalesViewRepository(BaseRepository): FETCH_SQL = """\ SELECT - ( - CASE - WHEN LEFT(bs.v_tran_cd, 1) = 2 - AND bs.qty >= 1 THEN CONCAT('-', bs.qty) - ELSE bs.qty - END - ) AS amt_fugo, - bs.*, - ln.ser_num, - ln.lot_num, - ln.expr_dt + slip_mgt_num, + conv_cd, + rec_whs_cd, + rec_whs_sub_cd, + rec_whs_org_cd, + rec_comm_cd, + rec_tran_kbn, + rev_hsdnymd_srk, + rec_urag_num, + rec_comm_name, + rec_nonyu_fcl_name, + rec_nonyu_fcl_addr, + rec_lot_num, + rec_ymd, + v_tran_cd, + tran_kbn_name, + whs_org_cd, + v_whsorg_cd, + whs_org_name, + v_whs_cd, + whs_name, + nonyu_fcl_cd, + v_inst_cd, + v_inst_kn, + v_inst_name, + v_inst_addr, + comm_cd, + product_name, + whs_rep_comm_name, + whs_rep_nonyu_fcl_name, + whs_rep_nonyu_fcl_addr, + mkr_inf_1, + mkr_cd, + qty, + slip_org_kbn, + bef_slip_mgt_num, + lot_no_err_flg, + iko_flg, + rec_sts_kbn, + ins_dt, + ins_usr, + dwh_upd_dt, + inst_cd, + inst_name_form, + address, + tel_num, + data_kbn, + data_kind, + err_dtl_kind, + expr_dt FROM - src05.bio_sales_view bs - LEFT OUTER JOIN - src05.lot_num_mst ln - ON bs.mkr_cd = ln.ser_num - AND bs.rec_lot_num = ln.lot_num + src05.bio_sales_lot WHERE {where_clause} ORDER BY - bs.rec_whs_cd, - bs.rec_whs_sub_cd, - bs.rev_hsdnymd_srk, - bs.slip_mgt_num + rec_whs_cd, + rec_whs_sub_cd, + rev_hsdnymd_srk, + slip_mgt_num ASC\ """ diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index d1102598..73cc06f5 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -119,6 +119,9 @@ class BioViewService(BaseService): logger.info(parameter_message) access_logger.info(parameter_message) + # ログファイルクローズ + access_log_handler.close() + # S3にアップロード self.upload_bio_access_log_file(access_log_file_path) diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index a50d498e..8ea7c38e 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -9,7 +9,7 @@ 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') BIO_EXTRACT_COLUMNS = [ - 'slip_org_kbn', + 'data_kind', 'slip_mgt_num', 'rec_ymd', 'rec_whs_cd', @@ -30,10 +30,10 @@ BIO_EXTRACT_COLUMNS = [ 'rec_nonyu_fcl_addr', 'whs_rep_nonyu_fcl_addr', 'rec_lot_num', - 'amt_fugo', + 'qty', 'expr_dt', 'data_kbn', - 'lot_num_err_flg', + 'err_dtl_kind', 'bef_slip_mgt_num', 'ins_usr', 'ins_dt', diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index ae7a3d7c..89436d67 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -6,15 +6,15 @@ {% endwith %} - @@ -55,13 +55,11 @@ @@ -96,16 +94,14 @@ @@ -97,11 +100,13 @@ @@ -100,13 +97,11 @@ @@ -84,7 +84,7 @@ {% for phm in bio.phm_models %} {% endfor %} @@ -94,12 +94,12 @@ - + From d1439047c8016700803328637b621c1ab1248305 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 549/962] =?UTF-8?q?fix:=20=E6=A4=9C=E7=B4=A2=E4=BB=B6?= =?UTF-8?q?=E6=95=B0=E3=81=8C=E5=A4=9A=E3=81=84=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/view/bio_view_model.py | 11 +++++-- ecs/jskult-webapp/src/system_var/constants.py | 3 ++ .../src/templates/bioSearchList.html | 32 +++++++++++-------- 3 files changed, 30 insertions(+), 16 deletions(-) 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 57f49a15..080149de 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -9,7 +9,7 @@ from src.model.db.pharmacy_product_master import PharmacyProductMasterModel from src.model.db.wholesaler_master import WholesalerMasterModel from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel -from src.system_var import environment +from src.system_var import constants, environment class BioViewModel(BaseModel): @@ -52,8 +52,15 @@ class BioViewModel(BaseModel): def bio_data_json_str(self): def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj - return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) + + search_data_list = [model.dict() for model in self.bio_data] + search_data_len = len(search_data_list) + # 1ページあたりの表示件数単位で、リストにPUSH + part_page_size = constants.BIO_SEARCH_LIST_PAGE_SIZE + for i in range(0, search_data_len, part_page_size): + yield json.dumps(search_data_list[i:i + part_page_size], ensure_ascii=False, default=date_handler) def make_whs_name(self): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index b40eab3d..0f8f1f1f 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -5,6 +5,9 @@ BATCH_STATUS_PROCESSING = '1' # 日付テーブル.dump取得状態区分:未処理 DUMP_STATUS_UNPROCESSED = '0' +# 生物由来照会 + +BIO_SEARCH_LIST_PAGE_SIZE = 100 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') diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index fa1e004a..5f25dc0f 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -5,7 +5,7 @@ {% include '_header.html' %} {% endwith %} - + From 5142e8266a8c4ef691c5cd046d29630f4e40b31a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 550/962] =?UTF-8?q?refactor:=20=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/db/{bio_sales_view.py => bio_sales_lot.py} | 0 ecs/jskult-webapp/src/model/view/bio_disp_model.py | 2 +- ...bio_sales_view_repository.py => bio_sales_lot_repository.py} | 2 +- ecs/jskult-webapp/src/services/bio_view_service.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename ecs/jskult-webapp/src/model/db/{bio_sales_view.py => bio_sales_lot.py} (100%) rename ecs/jskult-webapp/src/repositories/{bio_sales_view_repository.py => bio_sales_lot_repository.py} (98%) diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py similarity index 100% rename from ecs/jskult-webapp/src/model/db/bio_sales_view.py rename to ecs/jskult-webapp/src/model/db/bio_sales_lot.py diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index 851dc6a9..dd9c2bb0 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -1,4 +1,4 @@ -from src.model.db.bio_sales_view import BioSalesLotDBModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.util.sanitize import sanitize diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py similarity index 98% rename from ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py rename to ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index 4eead447..c7b5fe91 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_view import BioSalesLotDBModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index c0b3c43c..f77a6a5b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesLotRepository +from src.repositories.bio_sales_lot_repository import BioSalesLotRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ From aacbeb968773fb715bd35b7258dcedec33dafe3c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 551/962] =?UTF-8?q?feat:=201=E5=91=BC=E3=81=B3=E5=87=BA?= =?UTF-8?q?=E3=81=97=E8=BE=BA=E3=81=AE=E5=88=86=E5=89=B2=E6=95=B0=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 11 ++++++----- ecs/jskult-webapp/src/system_var/constants.py | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) 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 080149de..5c0cd4d7 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -9,7 +9,7 @@ from src.model.db.pharmacy_product_master import PharmacyProductMasterModel from src.model.db.wholesaler_master import WholesalerMasterModel from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel -from src.system_var import constants, environment +from src.system_var import environment class BioViewModel(BaseModel): @@ -51,16 +51,17 @@ class BioViewModel(BaseModel): ) def bio_data_json_str(self): + """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj search_data_list = [model.dict() for model in self.bio_data] search_data_len = len(search_data_list) - # 1ページあたりの表示件数単位で、リストにPUSH - part_page_size = constants.BIO_SEARCH_LIST_PAGE_SIZE - for i in range(0, search_data_len, part_page_size): - yield json.dumps(search_data_list[i:i + part_page_size], ensure_ascii=False, default=date_handler) + # 呼び出し一回あたりの分割数 + part_size = 500 + for i in range(0, search_data_len, part_size): + yield json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) def make_whs_name(self): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 0f8f1f1f..8fddda80 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -7,7 +7,6 @@ DUMP_STATUS_UNPROCESSED = '0' # 生物由来照会 -BIO_SEARCH_LIST_PAGE_SIZE = 100 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') From b6468a45dcde52703b96facee29798e9f2425266 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 552/962] =?UTF-8?q?fix:=20=E3=83=86=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=83=88=E3=81=B8=E3=81=AE=E5=9F=8B=E8=BE=BC?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=82=AF=E3=82=A9=E3=83=BC=E3=83=88=E3=81=8C?= =?UTF-8?q?=E3=81=8A=E3=81=8B=E3=81=97=E3=81=8F=E3=81=AA=E3=82=8B=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 5 ++++- ecs/jskult-webapp/src/templates/bioSearchList.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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 5c0cd4d7..ee36080b 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -61,7 +61,10 @@ class BioViewModel(BaseModel): # 呼び出し一回あたりの分割数 part_size = 500 for i in range(0, search_data_len, part_size): - yield json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # テンプレートに埋め込むため、ダブルクォートをエスケープして返す + json_str = json_str.replace('"', '\\"') + yield json_str def make_whs_name(self): if not self.is_form_submitted(): diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 5f25dc0f..bac1b4ab 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -340,7 +340,7 @@ // {% autoescape False%} // ジェネレータで100件ずつ取ってリストに詰める // {% for bio_data_json_str in bio.bio_data_json_str() %} - searchResultData.push(...JSON.parse('{{bio_data_json_str}}')) + searchResultData.push(...JSON.parse("{{bio_data_json_str}}")) // {% endfor %} // {% endautoescape%} // {% endif %} From 89440b8511064d142853356a83ea51c90722b086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 553/962] =?UTF-8?q?SQL=E5=8F=96=E5=BE=97=E9=A0=85=E7=9B=AE?= =?UTF-8?q?=E9=A0=86=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repositories/bio_sales_lot_repository.py | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index c7b5fe91..b061a79d 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -12,43 +12,43 @@ logger = get_logger('生物由来参照') class BioSalesLotRepository(BaseRepository): FETCH_SQL = """\ SELECT + data_kind, slip_mgt_num, + rec_ymd, rec_whs_cd, rec_whs_sub_cd, - rec_whs_org_cd, - rec_comm_cd, - rec_tran_kbn, - rev_hsdnymd_srk, - rec_urag_num, - rec_nonyu_fcl_name, - rec_nonyu_fcl_addr, - rec_lot_num, - rec_ymd, - v_tran_cd, - tran_kbn_name, - v_whsorg_cd, - whs_org_name, - v_whs_cd, whs_name, - nonyu_fcl_cd, + rec_whs_org_cd, + rec_urag_num, + rev_hsdnymd_srk, + rec_tran_kbn, + tran_kbn_name, + mkr_cd, + rec_comm_cd, product_name, whs_rep_comm_name, + nonyu_fcl_cd, + rec_nonyu_fcl_name, whs_rep_nonyu_fcl_name, + rec_nonyu_fcl_addr, whs_rep_nonyu_fcl_addr, - mkr_cd, + rec_lot_num, qty, + expr_dt, + data_kbn, + err_dtl_kind, bef_slip_mgt_num, - iko_flg, - ins_dt, ins_usr, + ins_dt, inst_cd, inst_name_form, address, tel_num, - data_kbn, - data_kind, - err_dtl_kind, - expr_dt + v_whsorg_cd, + whs_org_name, + v_tran_cd, + v_whs_cd, + iko_flg FROM src05.bio_sales_lot WHERE From 4d5a380db7fc6d6380f42f72d099a38ca2f81d2d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 554/962] =?UTF-8?q?fix:=20=E3=82=B7=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=83=AB=E3=83=BB=E3=83=80=E3=83=96=E3=83=AB=E3=82=AF=E3=82=A9?= =?UTF-8?q?=E3=83=BC=E3=83=88=E4=B8=A1=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/bio_view_model.py | 5 +++-- ecs/jskult-webapp/src/templates/bioSearchList.html | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) 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 ee36080b..57d5f153 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -62,8 +62,9 @@ class BioViewModel(BaseModel): part_size = 500 for i in range(0, search_data_len, part_size): json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) - # テンプレートに埋め込むため、ダブルクォートをエスケープして返す - json_str = json_str.replace('"', '\\"') + # JavaScriptに埋め込むため、クォートをエスケープ + json_str = json_str.replace("'", "\\'") + json_str = json_str.replace('\\"', '\\\\"') yield json_str def make_whs_name(self): diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index bac1b4ab..01f171a5 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -338,9 +338,9 @@ const searchResultData = [] // {% if bio.is_form_submitted() and not (bio.is_data_overflow_max_length() or bio.is_data_empty()) %} // {% autoescape False%} - // ジェネレータで100件ずつ取ってリストに詰める + // ジェネレータですこしずつ取得してリストに詰める // {% for bio_data_json_str in bio.bio_data_json_str() %} - searchResultData.push(...JSON.parse("{{bio_data_json_str}}")) + searchResultData.push(...JSON.parse('{{bio_data_json_str}}')) // {% endfor %} // {% endautoescape%} // {% endif %} From 8b86ffb1bb5b6e62d229640633730941ba0d628f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 555/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/data/BioData_template.xlsx | Bin 10348 -> 10423 bytes .../repositories/bio_sales_lot_repository.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx index 4a6292ff20b0ab793c282b122e8254d682f6ee53..ec1575a2932f20bd823620b1001e6192ca7f420b 100644 GIT binary patch delta 4416 zcmY+IcTf{b*TzHW9YP5rN=rhKDoBtTMKA=UccgQr6X_se3`kHqMCo0M6ltMISCHP3 zCLp~^0Hqg!*E{pg{qEiUXLshevomMU?s=Xi>eT60EKyKv-4(1Z0RjL*_?y&VjDfE9 zj0Ds3tm-T4Q$>i@R|LNvndrE%8w)3$r7-WL$My2p8Q&O0@Bco|z!#98wedJ_Ppt=C z?(8(mE6%(jf3`491=ZJ#0Y-ha7iRHHS(=Bl?2_@@74k>2dg>Fv14GL6leG6Pb6&w4kN*WpgB*9@7vGjs!P>lkOBIyk9!V&IZ zM6F#Mr%Y{4)tL6l`>CN&vXPo7kr{C=x=DJazQD34OqSNp(ZndUcL#%E5(}3%lDp(7 z@egO){fzwSBn=#Ou1-MwRC+Zr??LR{aEBZ-3WVF_iR5^Bsk+5DTjcq_=|`1)bB3Kx+ixk*-M_uu-+!5G zXkmgLSZ9h$8F5Y2)o>86MlsSZE03X4B10Lmjy<)z=ulv~H|uQS>1*I$0!y?26N zaA84JZq(Ym)Omj5DO%kZ`W%e8x(X@&%Yq*da&`R|GalycstRBf?=LO)jW~i7LZ#%i zl5=YY>Nfp`g<^OnDGRv0znUWB#`tEw`qR|LuCKvW90GkA8rA%6@k|8fe1uNVQl}L8 zL^S`jX9_Wo{Z6r2zuF)<|GIxIyXGF#_EC#RWj|Kx?oMN<4k*Sv!peiQE* zzo?f22VD!*?`*g3PFW*RY>P&sO3)KUnO(0KLX-Ts;X&J5_9`K!7=6}X1#etNTxk#X zyOzi4BdTo%QVpvX$)Bxqe*gabcZCA#u+%R-jf$1iB0EF!Ts2|Cv&*Hxu6~^!6I2yn z{Dk7taOS}-n}Z9ys0@@)5TGYDl5J#@Q{dP=p!ViBUWD-uTJu(}e+ONu)$SL|z?z11 zK4YoFped`jRdb~;{h^ddt|z#Hi4 zi^rc|Z9{K}T@o-GzV+-272gf>P6`mm{vKE4?^b*_0cX$?-Pon>ig7>7U!zZvA-eXb zkJV3Ixr0K?g^X^dP}89>je`xq{YWjN<^DsFOlz zdcp2OxHZgm8aTi5OA0)bf$bPhHW|?~$_7lnXRn}5xn$_Lk7S(1o&(n#EtCvU_H>3?Q|v#BYwbp>SR-%UwX+=5sWA&*OvE8M#m653@U zL$|pS6nCYq4>Vk_3{Z)FpbvVs1H@}!Whhm2jA6@U% z(z}y&jxjt`xF)k<{vf;L$llRd!kt}zhJXgye=%eyIx|kZ*Pnf9$Z<&DPB9mwpwlje zqEr*Q+qJb9ud4V?=4aVTj{nHz2`5h&1&9Aj9mXPh+#It%=~yi8^r27ZW$EdM*0h~XO|=|U|0Z9DS8T}GNs93~#C9m5eW;%Y{-{vNg+AHao1v+=e} zhnX0r_h$$y``}sT&E_UxgBCTmLVG1Pn<&K_cNE6tc#fj_63kEbqa_fOv(ptr_soKC zEF<0u+u(ISdq;p*=Qxt-eTn@`<~`vQo0l!UI4bO0P09NoaF^_<*Cixq%FF*x9Nu|&ElQBhqP-3V!~3D0d~E* zMjWE2Fn>BIKC}{G;pwgV_K6-uR)Ja~mk)oJrH|~&JLQ>5R5dT3z+;-!1^V%m(}Ni_ zY}!?}*+kcw2|<;y@K$oGa(ByBRRfc&y^>0EqK7mDk!sW&9GdASxZE=ERHg~RT7h6s zLnXurDhO1rrJ;*Bel?Y&);c{Uy1ngvf2Vljec`GFL=D3^M8!u|hq-uM>-Ee9QoH9i zv__<#df}`}&_qqSKz{F`QjZw~p~N5*b-^=DXf}GtcNnZ%o=nf3sYN3cg;7f>eX0Hw z-6)x{F}V@(lnVXoViSUYES#4ZNml5z@Z8rtEGi@s(R)Oo?PhKymacbn4t(kdZ#g+ zC|s7of&JOl!x||=Qj5;h7L10Cog8*n%HTCCyW{!udQ+7NYC(J_&~Gq8+4EUZH!NzY zoxFNQqz-G5>C-ODJ>42+O2i<)4=wr$&LHJ%cSwxH@_KWqiFyJ+`hf}WHYXc^aph{S zQuJeU(NPY;H=7U#dm-{gnY+Fq3w6hv!vY{WA#0Wcmil#bsQC>_3`$lhW)KTR1a+Mw zUUznfyUlXamh}m)gD1MPA_K3&teq`*bl*BTS*}pyYMnJ4j%ixvTVz_C*(bs+swo;t z&xwL224M5Q?3>rp^am4j^J-O0Qtj)i>t5KTY_nVo%I}3fvIw$P$9TUI;@K&FUoipB^`4L%( zR#uY57C&mmZ?to5OjEdQ?Fg48O(U!7l!*|^~!Rk4RlqLm|L+Q><6A@?0XnhQScFYvb~{v!T5KXrv^BfTwePl zQIU9Nx*M2BXwW^5u3gyk@PXOw`;ST``;M$_msAzsAJc30!H6O|bkTE9jpsP2rD#NKuv4RkmN)U&R(%TNu9jAxA!W zt?}rN%dul+e)j{zmAf=Qy@UGA+$PQkicgKpjfF&iFRstU)<~GOJl)<8uq~`+mv&H@ zEW)7mhMi5Bx^Pxg8-b3q(ch-6%uee#2RM_szK(oyVeh~>rcX(yZb z{gwLS=J-$o53sf0m=%^;wJKnKmFOy01VXf#zBl+Cy{bJAQ{8)G>5sgLO8lfwyCIu zNc++;-2$X!2O%v|xDXc~G`i+NW#5R)S)Zadl ze!v#h<=tfCK8hrw)D+Yw72w&i(|em+$AyhE#Kp_?+^#Mj7P%0()-U$8zLXX zaM_vhvHNheaaSI(EQt`BK4hFuYe{7k^kX8U-%pn=`kCEIYea{FLtsE2d8|AtV&~uCOY%Y$TrTV zy|os#hkFW-#34IW7BQ!$QWO!q9wVbyxV1U&pkM9;G>1va&?9|Q4C$A;G57=-cksQQ zq>Rs~o}!{;_vkexlj$vko=v?E^adYStSu01x;;rD4Qd;>THy6uBT-Q^=@k{ww)oAN zdgOD&7X|?qQ8L;XjuMya?9FAV$a~z3v0d%+%k9g*7PSQ!THmg8ekQJZ4;jqFKAVGA z$hr}M6g)Coy6{9{r>OZzHnL}-K}yiwYZN;q4iET}cg{RnE`RYeV6;%RMvT{bFjlJNi;2#p!itU$Zy#uueSbZ3QteoL2RBr{ z4kjF^^lB>=37zf@9I_-(vk}T~$OG|7&{tgl{0dM20E~ctw=oKQD2x}+4dVosQsd=e zB3%C%Fc1L1@oy9`Pm5O+cmU*O#)k?(VgIka008>`a2;R(z~5Ee%R9jJFZ>9Mjq9Hm z|BtU@{STUR9sdaiyY3h?)?r z5-p;I=t~^m`M#6)d(X_Dnd`Z)nQP{{pJ(p58x6M&s=krdwophCqSnifnED6-0CiFT zfDQlvJaZTGM|!*2A(3vP&pg}!+Ec8!8vM%5@N&%4%*i(ld`{1Mk!bbwr2{~9|G=RAcbF;==-7zm5PfBDMg_Y z4;6};iUPy$=gHr{H`F{LIZqn_+<jRZWCnZI$;z6uOf~RvQfBsicvHZSl-VX;nnjsmb;Kk1GTo2NFn?N_zb?#`#{&ar4 zp|=x`4@mMuWl{Px9yMDMXUh$WOs85X8%{)!G^Q%MHc|$q3W+zKWL*hFts5BI!jdUq zj`Uft^<0gyQ|5_3lL&ASww$ua2Jh`s`UhC-&tF)TQ5BTU5~uUpqgq~T@&sO+*AB1F z(`rGraKY}74kx8wlD8(|$e&b_lifpSWQxY?3{g;&aXlvRLdK0#S1ZX;tm4>K>GmaM z|5FW)C197(U_)Q=?n{M})Xms=720#$zAZ5O%wvKBzfz^RA9I`G6s_7hc~k!bVsCYu zqUXD~U3{7h?z~&I{~eW+9J$q)A0t#19`EpA<<^XH$JV0M{p~@Dr?SfxVN!cpt3?av z`UC2y3L%X*PV-cE7E3AT<9dp2{qX&8*(&x(#K?AzwlvBB_LoVbb+vrO*Uavf)^#xJ zMTEZJB4I`8iGvCE!(CcF&+66=UGXXP)#I_rNI2QdMdEm3GbXIkLXJl@$gINoH$W3b z003NF5djSJh=@S|QULii%b|dQumP@90stX^72U+jj@m;`+=28jzByHq3fYUtyu0Ob z@}VdFTr*_xy*y@2*xPa3e}?j;?19vhFDB*7Ww# zlYsN~jsC&8y`;=4DoSnHJg$XB-8jN97s>o?c8%c6A7}0SZ^J}roa!lt zlX(IKBV2W${bhSY0kumjdL>JacM=mOUyZ7bdp}XnrBAUkH1g}E3F!%gzV&X09V;m) zy&V}!NPqJZj;iswvgApe8m$Ux(cPZnQWciz(nl%ksABx|*|LJ)PGYOQu0A$|qWf}2 zoM+`9XWZ)#onB+*OOknAKk!@LOE?9!Xv^l-wVxS$2H8r`*G#Boa4|_$hpsQaxqzgM z231okRHD6Kyu>{tn~pEI*pgx!$H3NUI!(VF@*O@)pj9N=mYeYsY}5(eaxnLB=R0YY zu0hEjwZ;tV`=BfO(-&pkgJw2s<*Cn$eS<&b?7y$Q?7CI*866YiCGSv^3;%0-0Bn1A z&3`-gFncd}JHfYNVbjV_Ol6%InZ8ocbH-VrD&E8bb0s#x^M@ z>EnS%d746zve3abc(Km}0aVWj@M~&ke!A=0RJ;cu8tSPrFQ0t&-)C zsuu-s*7n4Z?mm7&QsNx6v%8MNjo5tOT_2s>>O^9%nnUo%$LDlG{f(3s(m_*Qd549S zHq(KFV}gMM>fVR>QhI55uUDJf&6DHz{mM!*V*!(~<#&#BVDkb*mzcB15&6VjFkyjp7O2%q4jF z3tGo5eXY^k?}wt`@^CxZ(4BGL4=xD6!)kAr9L>sdCKqalE#Fj0BVE;|q%qUC!W3ZY zUW{$*^O4k1o-pJqcV9NalYFN4N)J_3z_DlksewITJ` zPr7EJ?$)T3ulcjL7S+U8!OD1qlnUwrHxlwO+PYKA9tj#QmqZUtitJ?*5MEkO~j-ebz2>Cq&4bJ^n&MD zLc0`g{#mYy;)}_q?%ScOiHxU+8GXI9U?rLIx0!JspoWgU>+9d!?3 zZC$j)ap#@`-u-T_Hmt(WFL)8XtL*>j;P<14g9%cmn@$?e7__=f;lewoMy}3KWouk& zkHWaSdLe5w7j_~Q-}-_hjo%}C$67Z%OwInG!`?h1#j#<2*kT6G;eaB_aj!3ldX5?q zttI2`E%GZZOI!;``K%^gU~HBFq-n>M8ijsYt4>SWQco<8e119Cu3!c)8wNI8WNfS~ zmrflK@O&vX+N}rk>R5?pKTVRcv+8Od_2nB{bze&F;^-IOxlGWm7fNaf+%huw)N<3rYhaS@@ zcU8={Ix%;=faNUSt6?$?o%qaA?-c|LQ=S>9kTZSKCeN`OGL0%0Guk<(&CU#1HhNga z+Qe6X5JG$!>(ltcI=QeeV~wQs`10^aN<_?1zF$jUM!Nw&!5Na*_Vy8jYy|pu)bOk^|=^&`-*&&{)vg7&E+jFg) z5f43Xb#;VtQ?^W7`y)=Zm+0J#YAr-R>{CV4 zuWujXgN&%(Dg#l3CL9#uo71ZrtCEf+gV(GS1-q65FLU9uHo z#S4peZXfOmPKzhb+Hdx2y*KZnViOG1;qjD*FCh46A-(mXc+HCENb%&}jH;-F*8*{v zsF&j}&F*G;ef28*nMe9fe7iu5((Py8n-~`M!C|TP)Fysk`E}+IX93cF4ZSNjOwig7O~5ADdNw0Y%t-OIM}ftVCeZ zfJo8Y_;;&rYB(<6Ez9RLhGl6?FqQ*o+%cKhPa~d1PCK%+IHm{^E$W$i8dYo=pV3(H z%H-xL{_xZ{@Zxja$^+hJFM(t4^AY&mN#KHPl^k-LniRz;nwkFuW&-JCaw9*aJ2-pU z_88JcmU%x;yZfV{4aztBFy@4kZCl(E0oSvUU82oo`OLi4(ckK{g$(=YIJu!yF9@~$ zlrFi@lVQ-e@eLch=LV0JT7QWlb>dQ!}Z_e0~=Mw~uBm zL%I5s_b4JSH2RMF%+rBms*-ynD8+z}Bij#2VGlS>imp!Sm z6RzfpRKj0W9mqZ}#1tMBdJ}YzY(R6vGm=x23J-*zhJQ!teadeM)9fR;B@(_ND#cJj z&AMCI@{)BaAT4B-CU=T~caOwaMX;u#z!Y83NqNMX3yxu7se&|{k^dgjAip2%V|(Xm zMpD(_BrJjzzoVXf1TAdTRNY9ur`uE3A5TB=Jl!ZykEnH3BcCnQ5qS_~5 z)|VF~l>NsjI53w`+ZRDx6k*p9S?Q;$rRD@4agG&&yf}QeGGDH`ZK0`DG_53?tK$E; z8@JexY8;##$%(<^Rd-bgzuq)r!G-BN?|I+bB$0=81Y2>`l%iUs<{oHNGra``yk2{J zSy_9g98*2+Zq-(n!R*2}p;j(wxPBvxy_Y%M^)!%{0kNVc>-2X0^R}hwC;&ann~ZLu zpaot(zkk})wM~E?qF_NU@&VcY+dKG!0+3Olqxqn0|M$rPu#x}(pueNnqjM_s2tObH z-*OuOp!o-YhxXrIgpY54yQ2>p$`4}u^WZZ80FZxR*Xhwz{OW|4OlU)XUbLqG3u7KT z0N{YMH}FP!`iR;4`S>C|{=LSZ8gVW0|8XwBcMi0^02kXIMqXPY^#9mohzm_800xm< SUjP6=b=|wJA+LD Date: Fri, 28 Jul 2023 09:17:32 +0900 Subject: [PATCH 556/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C=EF=BC=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/bioStyle.css | 18 ++++++++- ecs/jskult-webapp/src/system_var/constants.py | 40 ------------------- .../src/templates/bioSearchList.html | 8 ++-- 3 files changed, 22 insertions(+), 44 deletions(-) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 7ecde3c5..0eadc543 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -81,9 +81,25 @@ table{ .bioScroll_div { overflow: auto; + white-space: nowrap; margin-top: 1%; + margin-bottom: 1%; + width: 100%; height: 250px; - width: 1132px; +} +.bioScroll_div::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.bioScroll_div::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.bioScroll_div::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; } .noLine{ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 8fddda80..7be637b9 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -10,46 +10,6 @@ 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') -BIO_EXTRACT_COLUMNS = [ - 'data_kind', - 'slip_mgt_num', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_name', - 'rec_whs_org_cd', - 'rec_urag_num', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_name', - 'mkr_cd', - 'rec_comm_cd', - 'product_name', - 'whs_rep_comm_name', - 'nonyu_fcl_cd', - 'rec_nonyu_fcl_name', - 'whs_rep_nonyu_fcl_name', - 'rec_nonyu_fcl_addr', - 'whs_rep_nonyu_fcl_addr', - 'rec_lot_num', - 'qty', - 'expr_dt', - 'data_kbn', - 'err_dtl_kind', - 'bef_slip_mgt_num', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_num', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_name', - 'v_tran_cd', - 'iko_flg' -] - BIO_CSV_HEADER = [ 'データ種別', '伝票管理NO', diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 01f171a5..2da95017 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -7,9 +7,11 @@ @@ -288,7 +286,6 @@ $(val).attr('tabindex', '0') // Enterキー押下時に要素をクリックできるようにイベントを付加する $(val).on('keypress', function(e) { - console.log(e.code) if (e.code === 'Enter') { $(e.target).click() $(val).off('keypress') From 6f8b480cd59a0b4fb0f0caf3b9df84f191c1c13f Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:32 +0900 Subject: [PATCH 559/962] =?UTF-8?q?=E8=A8=AD=E8=A8=88=E6=9B=B8=E9=80=9A?= =?UTF-8?q?=E3=82=8A=E3=81=AB=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/.env.example | 1 + ecs/jskult-batch-daily/src/system_var/environment.py | 1 + 2 files changed, 2 insertions(+) diff --git a/ecs/jskult-batch-daily/.env.example b/ecs/jskult-batch-daily/.env.example index 1e15cdb0..fc8b6a3b 100644 --- a/ecs/jskult-batch-daily/.env.example +++ b/ecs/jskult-batch-daily/.env.example @@ -15,6 +15,7 @@ JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt VJSK_DATA_SEND_FOLDER=send VJSK_DATA_BUCKET=************* JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt +VJSK_DATA_BUCKET=********************** VJSK_DATA_RECEIVE_FOLDER=********************** # 連携データ抽出期間 SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0 diff --git a/ecs/jskult-batch-daily/src/system_var/environment.py b/ecs/jskult-batch-daily/src/system_var/environment.py index 42ed6073..88e123c9 100644 --- a/ecs/jskult-batch-daily/src/system_var/environment.py +++ b/ecs/jskult-batch-daily/src/system_var/environment.py @@ -19,6 +19,7 @@ JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME = os.environ['JSKULT_CONFIG_CALEND VJSK_DATA_SEND_FOLDER = os.environ['VJSK_DATA_SEND_FOLDER'] VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME = os.environ['JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME'] +VJSK_DATA_BUCKET = os.environ['VJSK_DATA_BUCKET'] VJSK_DATA_RECEIVE_FOLDER = os.environ['VJSK_DATA_RECEIVE_FOLDER'] # 初期値がある環境変数 From 739384febdb76e676f1ab3841eac606e7a261f4f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:32 +0900 Subject: [PATCH 560/962] =?UTF-8?q?refactor:=20=E3=83=A2=E3=83=87=E3=83=AB?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E5=90=8D=E3=81=A8=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E5=90=8D=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...odel.py => ultmarc_doctor_search_view_model.py} | 2 +- ..._model.py => ultmarc_inst_search_view_model.py} | 2 +- .../src/services/ultmarc_view_service.py | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) rename ecs/jskult-webapp/src/model/view/{ultmarc_doctor_view_model.py => ultmarc_doctor_search_view_model.py} (98%) rename ecs/jskult-webapp/src/model/view/{ultmarc_inst_view_model.py => ultmarc_inst_search_view_model.py} (98%) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py similarity index 98% rename from ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py rename to ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py index b648cb2f..1bfb0289 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py @@ -9,7 +9,7 @@ from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel from src.system_var import environment -class UltmarcDoctorViewModel(BaseModel): +class UltmarcDoctorSearchViewModel(BaseModel): subtitle: str = '医師検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py similarity index 98% rename from ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py rename to ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py index 126371de..f7dec105 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py @@ -10,7 +10,7 @@ from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.system_var import environment -class UltmarcInstViewModel(BaseModel): +class UltmarcInstSearchViewModel(BaseModel): subtitle: str = '施設検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 24cf1d75..e210b7c8 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -3,10 +3,12 @@ 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_doctor_search_view_model import \ + UltmarcDoctorSearchViewModel from src.model.view.ultmarc_inst_info_view_model import \ UltmarcInstInfoViewModel -from src.model.view.ultmarc_inst_view_model import UltmarcInstViewModel +from src.model.view.ultmarc_inst_search_view_model import \ + UltmarcInstSearchViewModel from src.repositories.base_repository import BaseRepository from src.repositories.inst_master_repository import InstDivMasterRepository from src.repositories.prefc_master_repository import PrefcMasterRepository @@ -70,12 +72,12 @@ class UltmarcViewService(BaseService): ######################### def prepare_ultmarc_doctor_search_view( self - ) -> UltmarcDoctorViewModel: + ) -> UltmarcDoctorSearchViewModel: # 医師一覧画面の表示データ取得 # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() - ultmarc = UltmarcDoctorViewModel( + ultmarc = UltmarcDoctorSearchViewModel( prefc_models=prefcs ) return ultmarc @@ -118,14 +120,14 @@ class UltmarcViewService(BaseService): ######################### def prepare_ultmarc_inst_search_view( self - ) -> UltmarcInstViewModel: + ) -> UltmarcInstSearchViewModel: # 施設一覧画面の表示データ取得 # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() # 施設区分リストを取得 inst_div = self.inst_div_repository.fetch_all() - ultmarc = UltmarcInstViewModel( + ultmarc = UltmarcInstSearchViewModel( prefc_models=prefcs, inst_div_models=inst_div ) From e4674d69e559dd3798d6ee16368d0fd5b44d0264 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 28 Jul 2023 09:17:32 +0900 Subject: [PATCH 561/962] =?UTF-8?q?fix:=20=E7=94=9F=E7=89=A9=E7=94=B1?= =?UTF-8?q?=E6=9D=A5=E7=85=A7=E4=BC=9A=E7=94=BB=E9=9D=A2=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=81=AE=E3=83=95=E3=82=A3=E3=83=BC=E3=83=89=E3=83=90=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=80=82=E3=82=B7=E3=83=B3=E3=82=B0=E3=83=AB=E3=82=AF?= =?UTF-8?q?=E3=82=A9=E3=83=BC=E3=83=88=E3=80=81=E3=83=80=E3=83=96=E3=83=AB?= =?UTF-8?q?=E3=82=AF=E3=82=A9=E3=83=BC=E3=83=88=E3=81=AE=E3=82=A8=E3=82=B9?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=83=97=E5=87=A6=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/ultmarc_doctor_search_view_model.py | 14 ++++++- .../view/ultmarc_inst_search_view_model.py | 14 ++++++- .../src/templates/docSearch.html | 42 ++++++++++++++----- .../src/templates/instSearch.html | 42 +++++++++++++------ 4 files changed, 86 insertions(+), 26 deletions(-) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py index 1bfb0289..a623381e 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py @@ -17,9 +17,21 @@ class UltmarcDoctorSearchViewModel(BaseModel): form_data: Optional[UltmarcDoctorSearchModel] def ultmarc_data_json_str(self): + """アルトマーク医師データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" 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) + + search_data_list = [model.dict() for model in self.doctor_data] + search_data_len = len(search_data_list) + # 呼び出し一回あたりの分割数 + part_size = 50 + for i in range(0, search_data_len, part_size): + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # JavaScriptに埋め込むため、クォートをエスケープ + json_str = json_str.replace("'", "\\'") + json_str = json_str.replace('\\"', '\\\\"') + yield json_str # ページネーションのページ番号 # 検索時は最初のページを表示する diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py index f7dec105..b41c77cd 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_search_view_model.py @@ -19,9 +19,21 @@ class UltmarcInstSearchViewModel(BaseModel): form_data: Optional[UltmarcInstSearchModel] def ultmarc_data_json_str(self): + """アルトマーク施設データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" 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) + + search_data_list = [model.dict() for model in self.inst_data] + search_data_len = len(search_data_list) + # 呼び出し一回あたりの分割数 + part_size = 50 + for i in range(0, search_data_len, part_size): + json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler) + # JavaScriptに埋め込むため、クォートをエスケープ + json_str = json_str.replace("'", "\\'") + json_str = json_str.replace('\\"', '\\\\"') + yield json_str # ページネーションのページ番号 # 検索時は最初のページを表示する diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 7f6cc551..f6702fea 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -164,14 +164,8 @@ @@ -98,7 +98,7 @@ oninput="formBtDisabled()" > ~ - @@ -111,7 +111,7 @@ oninput="formBtDisabled()" > ~ - @@ -122,13 +122,13 @@
データ種別 伝票管理NO 処理日Veeva卸組織コード 卸組織名 Veeva取引区分コード移行2017年11月以前データ
発伝年月日: - ~ - @@ -186,6 +182,18 @@ {% endif %} +
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 89436d67..7d07a22b 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -13,7 +13,8 @@ // ボタン、テキストボックス初期化 formBtDisabled(); // DatePickerを有効化 - enableDatePicker(); + setDatePicker(); + }); @@ -55,11 +56,13 @@
@@ -342,6 +347,7 @@ ` }) } + From b29a73f0ed25968632e702ecc8beeb609859b274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 546/962] =?UTF-8?q?DatePicker=E3=81=A8=E6=88=A6=E3=81=84?= =?UTF-8?q?=E6=8A=9C=E3=81=84=E3=81=9F=E7=B5=90=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 4 ++-- .../src/model/db/bio_sales_view.py | 4 ++-- .../src/model/view/bio_disp_model.py | 11 +++------- .../src/model/view/bio_view_model.py | 2 +- .../repositories/bio_sales_view_repository.py | 21 ++++--------------- .../src/services/bio_view_service.py | 6 +++--- ecs/jskult-webapp/src/templates/_header.html | 2 -- .../src/templates/bioSearchList.html | 7 +------ 8 files changed, 16 insertions(+), 41 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 61d326b4..d02a709e 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -61,10 +61,10 @@ async def download_bio_data( return {'status': 'ok', 'download_url': None} # ファイルに打ち出すカラムを抽出 - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] + # extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] # ファイルを書き出し(Excel or CSV) - local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) + local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 59192b86..78297aa4 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -4,9 +4,9 @@ from typing import Optional from src.model.db.base_db_model import BaseDBModel -class BioSalesViewModel(BaseDBModel): +class BioSalesLotDBModel(BaseDBModel): slip_mgt_num: Optional[str] - conv_cdR: Optional[int] + conv_cd: Optional[int] rec_whs_cd: Optional[str] rec_whs_sub_cd: Optional[str] rec_whs_org_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_disp_model.py b/ecs/jskult-webapp/src/model/view/bio_disp_model.py index 2ebf2c00..851dc6a9 100644 --- a/ecs/jskult-webapp/src/model/view/bio_disp_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_disp_model.py @@ -1,13 +1,8 @@ -from src.model.db.bio_sales_view import BioSalesViewModel +from src.model.db.bio_sales_view import BioSalesLotDBModel from src.util.sanitize import sanitize @sanitize -class BisDisplayModel(BioSalesViewModel): - def __init__(self, param: BioSalesViewModel) -> None: +class BisDisplayModel(BioSalesLotDBModel): + def __init__(self, param: BioSalesLotDBModel) -> None: super().__init__(**param.dict()) - - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - if (self.bef_slip_mgt_num is None): - self.ins_dt = "" - self.ins_usr = "" 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 1cd4f4a1..27f1f851 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -23,7 +23,7 @@ class BioViewModel(BaseModel): def display_wholesaler_names(self): display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name}' + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name or ""}' for whs_model in self.whs_models ] return display_names diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 0b3a52a5..395fe2cb 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_view import BioSalesViewModel +from src.model.db.bio_sales_view import BioSalesLotDBModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -9,11 +9,10 @@ from src.util.string_util import is_not_empty logger = get_logger('生物由来参照') -class BioSalesViewRepository(BaseRepository): +class BioSalesLotRepository(BaseRepository): FETCH_SQL = """\ SELECT slip_mgt_num, - conv_cd, rec_whs_cd, rec_whs_sub_cd, rec_whs_org_cd, @@ -21,40 +20,28 @@ class BioSalesViewRepository(BaseRepository): rec_tran_kbn, rev_hsdnymd_srk, rec_urag_num, - rec_comm_name, rec_nonyu_fcl_name, rec_nonyu_fcl_addr, rec_lot_num, rec_ymd, v_tran_cd, tran_kbn_name, - whs_org_cd, v_whsorg_cd, whs_org_name, v_whs_cd, whs_name, nonyu_fcl_cd, v_inst_cd, - v_inst_kn, - v_inst_name, - v_inst_addr, - comm_cd, product_name, whs_rep_comm_name, whs_rep_nonyu_fcl_name, whs_rep_nonyu_fcl_addr, - mkr_inf_1, mkr_cd, qty, - slip_org_kbn, bef_slip_mgt_num, - lot_no_err_flg, iko_flg, - rec_sts_kbn, ins_dt, ins_usr, - dwh_upd_dt, - inst_cd, inst_name_form, address, tel_num, @@ -74,7 +61,7 @@ class BioSalesViewRepository(BaseRepository): ASC\ """ - def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: + def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]: try: self._database.connect() logger.debug('DB参照実行') @@ -83,7 +70,7 @@ class BioSalesViewRepository(BaseRepository): logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.dict()) logger.debug(f'count= {len(result)}') - models = [BioSalesViewModel(**r) for r in result] + models = [BioSalesLotDBModel(**r) for r in result] return models except Exception as e: logger.exception(f"DB Error : Exception={e.args}") diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 73cc06f5..42885c83 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.bio_sales_view_repository import BioSalesLotRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ @@ -27,7 +27,7 @@ class BioViewService(BaseService): REPOSITORIES = { 'whs_repository': WholesalerMasterRepository, 'phm_repository': PharmacyProductMasterRepository, - 'bio_sales_repository': BioSalesViewRepository + 'bio_sales_repository': BioSalesLotRepository } CLIENTS = { @@ -36,7 +36,7 @@ class BioViewService(BaseService): whs_repository: WholesalerMasterRepository phm_repository: PharmacyProductMasterRepository - bio_sales_repository: BioSalesViewRepository + bio_sales_repository: BioSalesLotRepository s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index adfa228d..01a1521a 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -15,5 +15,3 @@ - - \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 7d07a22b..3a1fa7ab 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -13,8 +13,7 @@ // ボタン、テキストボックス初期化 formBtDisabled(); // DatePickerを有効化 - setDatePicker(); - + enableDatePicker(); }); @@ -56,13 +55,11 @@
From 0b1457866c651b772c08ecc91416c3254cbe1cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 547/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/bio_download.py | 3 --- .../src/services/bio_view_service.py | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index d02a709e..454ff857 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -60,9 +60,6 @@ async def download_bio_data( logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} - # ファイルに打ち出すカラムを抽出 - # extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - # ファイルを書き出し(Excel or CSV) local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 42885c83..97f7f22b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -162,8 +162,10 @@ class BioViewService(BaseService): def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -171,8 +173,10 @@ class BioViewService(BaseService): def upload_bio_access_log_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'log/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -180,8 +184,10 @@ class BioViewService(BaseService): def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) From 0b346cfaa6d1d57ac37a495180c3082a1e7c05e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 28 Jul 2023 09:17:31 +0900 Subject: [PATCH 548/962] =?UTF-8?q?=E5=8D=98=E4=BD=93=E8=A9=A6=E9=A8=93?= =?UTF-8?q?=E4=B8=8D=E5=85=B7=E5=90=88=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/db/bio_sales_view.py | 2 +- .../src/model/db/pharmacy_product_master.py | 1 + ecs/jskult-webapp/src/model/view/bio_view_model.py | 2 +- .../src/repositories/bio_sales_view_repository.py | 4 ++-- .../pharmacy_product_master_repository.py | 1 + ecs/jskult-webapp/src/services/bio_view_service.py | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 2 +- ecs/jskult-webapp/src/templates/bioSearchList.html | 14 +++++++------- 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_view.py b/ecs/jskult-webapp/src/model/db/bio_sales_view.py index 78297aa4..ff62af4b 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_view.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_view.py @@ -44,7 +44,7 @@ class BioSalesLotDBModel(BaseDBModel): lot_no_err_flg: Optional[str] iko_flg: Optional[str] rec_sts_kbn: Optional[str] - ins_dt: Optional[str] + ins_dt: Optional[datetime] ins_usr: Optional[str] dwh_upd_dt: Optional[datetime] inst_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py index 2f498246..35181012 100644 --- a/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py +++ b/ecs/jskult-webapp/src/model/db/pharmacy_product_master.py @@ -4,4 +4,5 @@ from src.model.db.base_db_model import BaseDBModel class PharmacyProductMasterModel(BaseDBModel): + mkr_cd: Optional[str] mkr_cd_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py index 27f1f851..57f49a15 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -45,7 +45,7 @@ class BioViewModel(BaseModel): '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', - '9': 'エラー(解消済)', + '9': 'エラー(解消済み)', '2': '除外' } ) diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py index 395fe2cb..4eead447 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py @@ -31,7 +31,6 @@ class BioSalesLotRepository(BaseRepository): v_whs_cd, whs_name, nonyu_fcl_cd, - v_inst_cd, product_name, whs_rep_comm_name, whs_rep_nonyu_fcl_name, @@ -42,6 +41,7 @@ class BioSalesLotRepository(BaseRepository): iko_flg, ins_dt, ins_usr, + inst_cd, inst_name_form, address, tel_num, @@ -115,7 +115,7 @@ class BioSalesLotRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ + rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index a430ee67..c2bd95ed 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -9,6 +9,7 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT + t1.mkr_cd, CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index 97f7f22b..c0b3c43c 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -156,7 +156,7 @@ class BioViewService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + output_df.to_csv(output_file_path, index=False, header=False, encoding="utf-8_sig") return output_file_path diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 8ea7c38e..b40eab3d 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -85,7 +85,7 @@ BIO_CSV_HEADER = [ 'Veeva卸組織コード', '卸組織名', 'Veeva取引区分コード', - '移行' + '2017年11月以前データ' ] SLIP_ORG_KBN_FULL_NAME = { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 3a1fa7ab..fa1e004a 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -52,12 +52,12 @@ 処理日: - ~ - @@ -74,7 +74,7 @@
発伝年月日: - ~ - @@ -165,7 +165,7 @@ Veeva卸組織コード 卸組織名 Veeva取引区分コード移行2017年11月以前データ
対象テーブル: -
-
- +

テーブル上書きコピー

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

{% endif %} + {% with progress_message = 'データ上書き中...しばらくお待ち下さい。'%} {% include '_loading.html' %} {% endwith %} + + {% with progress_message = '', id = '_loading_for_back' %} + {% include '_loading.html' %} + {% endwith %} From b6d1b46f48f984dfec0453afcf3bcdb9745626a0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 13:48:35 +0900 Subject: [PATCH 631/962] =?UTF-8?q?feat:=20=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=86=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=83=AD=E3=83=BC=E3=83=87=E3=82=A3=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/templates/masterMainteMenu.html | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 0abc4ec3..fe0f7a93 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -10,16 +10,17 @@

MeDaCA
マスターメンテメニュー



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

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

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

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

- テーブル上書きコピー

- + テーブル上書きコピー

-

メニューへ +

メニューへ
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} From 15950b688e135ab68e5d6b09e9200a6132162228 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 14:04:28 +0900 Subject: [PATCH 632/962] =?UTF-8?q?pipenv=20update=E5=AE=9F=E8=A1=8C?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E3=82=92=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/Pipfile.lock | 332 +++++++++--------- .../check-view-security-option/Pipfile.lock | 132 +++---- 2 files changed, 234 insertions(+), 230 deletions(-) diff --git a/ecs/crm-datafetch/Pipfile.lock b/ecs/crm-datafetch/Pipfile.lock index 37a67585..44dbcaa2 100644 --- a/ecs/crm-datafetch/Pipfile.lock +++ b/ecs/crm-datafetch/Pipfile.lock @@ -26,27 +26,27 @@ }, "boto3": { "hashes": [ - "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", - "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" + "sha256:1ab375c231547db4c9ce760e29cbe90d0341fe44910571b1bc4967a72fd8276f", + "sha256:7b8e7deee9f665612b3cd7412989aaab0337d8006a0490a188c814af137bd32d" ], "index": "pypi", - "version": "==1.28.5" + "version": "==1.28.29" }, "botocore": { "hashes": [ - "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", - "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" + "sha256:71b335a47ee061994ac12f15ffe63c5c783cb055dc48079b7d755a46b9c1918c", + "sha256:d3dc422491b3a30667f188f3434541a1dd86d6f8ed7f98ca26e056ae7d912c85" ], "markers": "python_version >= '3.7'", - "version": "==1.31.5" + "version": "==1.31.29" }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.7.22" }, "cffi": { "hashes": [ @@ -200,32 +200,32 @@ }, "cryptography": { "hashes": [ - "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", - "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", - "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", - "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", - "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", - "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", - "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", - "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", - "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", - "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", - "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", - "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", - "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", - "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", - "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", - "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", - "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", - "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", - "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", - "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", - "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", - "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", - "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" + "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306", + "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84", + "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47", + "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d", + "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116", + "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207", + "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81", + "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087", + "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd", + "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507", + "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858", + "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae", + "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34", + "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906", + "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd", + "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922", + "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7", + "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4", + "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574", + "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1", + "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c", + "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e", + "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de" ], "markers": "python_version >= '3.7'", - "version": "==41.0.2" + "version": "==41.0.3" }, "idna": { "hashes": [ @@ -350,11 +350,11 @@ }, "platformdirs": { "hashes": [ - "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421", - "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f" + "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", + "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" ], "markers": "python_version >= '3.7'", - "version": "==3.9.1" + "version": "==3.10.0" }, "pycparser": { "hashes": [ @@ -411,11 +411,11 @@ }, "s3transfer": { "hashes": [ - "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", - "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", + "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" ], "markers": "python_version >= '3.7'", - "version": "==0.6.1" + "version": "==0.6.2" }, "simple-salesforce": { "hashes": [ @@ -435,11 +435,11 @@ }, "tenacity": { "hashes": [ - "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", - "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" + "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a", + "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c" ], "index": "pypi", - "version": "==8.2.2" + "version": "==8.2.3" }, "urllib3": { "hashes": [ @@ -469,27 +469,27 @@ }, "boto3": { "hashes": [ - "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", - "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" + "sha256:1ab375c231547db4c9ce760e29cbe90d0341fe44910571b1bc4967a72fd8276f", + "sha256:7b8e7deee9f665612b3cd7412989aaab0337d8006a0490a188c814af137bd32d" ], "index": "pypi", - "version": "==1.28.5" + "version": "==1.28.29" }, "botocore": { "hashes": [ - "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", - "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" + "sha256:71b335a47ee061994ac12f15ffe63c5c783cb055dc48079b7d755a46b9c1918c", + "sha256:d3dc422491b3a30667f188f3434541a1dd86d6f8ed7f98ca26e056ae7d912c85" ], "markers": "python_version >= '3.7'", - "version": "==1.31.5" + "version": "==1.31.29" }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.7.22" }, "cffi": { "hashes": [ @@ -641,119 +641,119 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.2.0" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, "coverage": { "extras": [ "toml" ], "hashes": [ - "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" + "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34", + "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e", + "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7", + "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b", + "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3", + "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985", + "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95", + "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2", + "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a", + "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74", + "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd", + "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af", + "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54", + "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865", + "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214", + "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54", + "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe", + "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0", + "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321", + "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446", + "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e", + "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527", + "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12", + "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f", + "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f", + "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84", + "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479", + "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e", + "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873", + "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70", + "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0", + "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977", + "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51", + "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28", + "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1", + "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254", + "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1", + "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd", + "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689", + "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d", + "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543", + "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9", + "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637", + "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071", + "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482", + "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1", + "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b", + "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5", + "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a", + "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393", + "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a", + "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba" ], - "markers": "python_version >= '3.7'", - "version": "==7.2.7" + "markers": "python_version >= '3.8'", + "version": "==7.3.0" }, "cryptography": { "hashes": [ - "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", - "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", - "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", - "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", - "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", - "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", - "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", - "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", - "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", - "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", - "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", - "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", - "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", - "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", - "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", - "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", - "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", - "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", - "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", - "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", - "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", - "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", - "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" + "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306", + "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84", + "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47", + "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d", + "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116", + "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207", + "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81", + "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087", + "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd", + "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507", + "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858", + "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae", + "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34", + "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906", + "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd", + "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922", + "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7", + "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4", + "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574", + "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1", + "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c", + "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e", + "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de" ], "markers": "python_version >= '3.7'", - "version": "==41.0.2" + "version": "==41.0.3" }, "exceptiongroup": { "hashes": [ - "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5", - "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.1.2" + "version": "==1.1.3" }, "flake8": { "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", + "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", - "version": "==6.0.0" + "version": "==6.1.0" }, "idna": { "hashes": [ @@ -853,11 +853,11 @@ }, "moto": { "hashes": [ - "sha256:9650d05d89b6f97043695548fbc0d8fb293f4177daaebbcee00bb0d171367f1a", - "sha256:dd3e2ad920ab8b058c4f62fa7c195b788bd1f018cc701a1868ff5d5c4de6ed47" + "sha256:545afeb4df94dfa730e2d7e87366dc26b4a33c2891f462cbb049f040c80ed1ec", + "sha256:7d3bd748a34641715ba469c761f72fb8ec18f349987c98f5a0f9be85a07a9911" ], "index": "pypi", - "version": "==4.1.13" + "version": "==4.1.14" }, "packaging": { "hashes": [ @@ -885,11 +885,11 @@ }, "pycodestyle": { "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0", + "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8" ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.0" }, "pycparser": { "hashes": [ @@ -900,11 +900,11 @@ }, "pyflakes": { "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", + "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_version >= '3.8'", + "version": "==3.1.0" }, "pytest": { "hashes": [ @@ -1002,19 +1002,19 @@ }, "responses": { "hashes": [ - "sha256:8a3a5915713483bf353b6f4079ba8b2a29029d1d1090a503c70b0dc5d9d0c7bd", - "sha256:c4d9aa9fc888188f0c673eff79a8dadbe2e75b7fe879dc80a221a06e0a68138f" + "sha256:205029e1cb334c21cb4ec64fc7599be48b859a0fd381a42443cdd600bfe8b16a", + "sha256:e6fbcf5d82172fecc0aa1860fd91e58cbfd96cee5e96da5b63fa6eb3caa10dd3" ], "markers": "python_version >= '3.7'", - "version": "==0.23.1" + "version": "==0.23.3" }, "s3transfer": { "hashes": [ - "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", - "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", + "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" ], "markers": "python_version >= '3.7'", - "version": "==0.6.1" + "version": "==0.6.2" }, "six": { "hashes": [ @@ -1034,10 +1034,10 @@ }, "types-pyyaml": { "hashes": [ - "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f", - "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97" + "sha256:7d340b19ca28cddfdba438ee638cd4084bde213e501a3978738543e27094775b", + "sha256:a461508f3096d1d5810ec5ab95d7eeecb651f3a15b71959999988942063bf01d" ], - "version": "==6.0.12.10" + "version": "==6.0.12.11" }, "urllib3": { "hashes": [ @@ -1049,11 +1049,11 @@ }, "werkzeug": { "hashes": [ - "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890", - "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330" + "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8", + "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528" ], "markers": "python_version >= '3.8'", - "version": "==2.3.6" + "version": "==2.3.7" }, "xmltodict": { "hashes": [ diff --git a/lambda/check-view-security-option/Pipfile.lock b/lambda/check-view-security-option/Pipfile.lock index f3ad1a40..ea8a3d53 100644 --- a/lambda/check-view-security-option/Pipfile.lock +++ b/lambda/check-view-security-option/Pipfile.lock @@ -18,44 +18,48 @@ "default": { "awslambdaric": { "hashes": [ - "sha256:059c7a66d4470169e01620d93f07424b80d302e3736cd11e68373f293a41e396", - "sha256:0e90053614f0e5e5d6d6ae6d164412ce95b5d549c6fb0f6ff4290d77c5e9d3e5", - "sha256:11a365164efec105aa670259dfe473d9609da8f6f2e468790b2dfc24969bfff1", - "sha256:19da28e8c892b1c52a9db4d2b986af303932e3a4c4632eb0c5d5eb6a673c6022", - "sha256:2eb2fdb1ae0f84669d37f193f247fa115a282a7777e051ced3a33620d6280646", - "sha256:2efff2292fc8f8484eb094ffd77808a67815353be898a7f0b33ce51b841af691", - "sha256:387b94cb0358662ae2b203f0aa2af25e80c6a2019a6b569f733ecd993a4f53d2", - "sha256:38f8ae67ecb5b4e9f7fc42746ee39765dd7ddab359cb7e8ebfda1de0f0c0b059", - "sha256:3fd0e1b3891987fa7ebb0c08d24c76af5fc17466f6efdfa9a59848dfb23930ec", - "sha256:63a82d21d66146b3fde7eb6086abd058b75bdcab4a02b02afe0e8e4a45edfb5b", - "sha256:676a741ad8f3aa27d651bcf3a2b83d5cee815f99c8b2b9abef3cb22ca7b29698", - "sha256:9b0781bd41c20a2f2a0b018464a1daa376f663bd5eb7b0b6ba78f483681b1519", - "sha256:bad98f2f94cecc90b89ac4e1d4feed96eb664e13c29b7ce232444cc9358e0d36", - "sha256:d64dcba8da9dbea62644133a48c75376a37bfe0f84096ad73bf7fc5b2eb31fc7", - "sha256:d8f280b25d8a7ae6b6ff92a9bbc6567b984264be8ef3e0fcb0402a1247f6c75d", - "sha256:dad646f566aa7ec9b7179f16ca6741a2bea148abec6ed5947f86d00607e0a9a2", - "sha256:dc7072f642fdd215387d4921bbd5ac91b96a4a705bce5e7853622d09fe59f57d", - "sha256:fbbd24446ce2f876335b178f04aa4ec7ec480afc0f9621ebfdd5f55ad4b7c06e", - "sha256:fe76893a1b42bcee4c91c6456092d2a42455818756e8f62d50e8c5adb22fa9e7" + "sha256:0e6d1a52d0e25a705dee8a571e114476a58c1d3f7b0913c7a73253adc2d55c44", + "sha256:13b640cfb7747598ce406577577af8aa534a1b5bafc97045b7e96d573c72bfc1", + "sha256:169b3b6feb4c9bdd0ae7bbfc4cc5da453a6441831e8ab02655d6c7c5a5d3b5b0", + "sha256:17f7a10b181ee96e4699e804781f613daee8946fd13feea0b8ca14090a8f5a8f", + "sha256:2944e3a84765d322c77f5c388586b31e8c811d4caec1bc03d1080cbdcaf87687", + "sha256:2e407d71be101fec534bfb14e4908e0b2af3f0f330eda5768beb7070123ee377", + "sha256:314ceef8c5337ff9f25c57f5ec98d6c07ccf8e7c97228bcd81d13d71d8eb3ba5", + "sha256:5146d0d91a6a1401dd54e012088463e3e8882c1d63423b4e49c3fe13f3b079e8", + "sha256:571e50f085137781ddc48f9a3835f03a62c04b3c026af2e2a73c1d9c98872288", + "sha256:6354c0d1cba02b6d7c821230c1976ae44e2da44ca508664d67ca98d543fdc31c", + "sha256:6a591913a5f05a2bab8a9c7ccfd63290831532c195971280073fe91360727b73", + "sha256:6e2f4d9f887305fc393b4ee97063edf30c322c7e2dc29fbefebe881eb98962e9", + "sha256:81879d067d6edb527f30f7c98ec681bd1cfb4967aa595a343f78f1388eb6a5ba", + "sha256:8e4dcd19e1d81ff7aded963bb48fbda807adc2764ed2a88debc996eaf953cc16", + "sha256:95f0c91f1bf31eef73605678d0e64f97de43b10a45390d9da9519354e47183c9", + "sha256:a742432e22ced3bc4c6397db5b385a28f1c5f10d59aa4e97b434cfa5f9037eab", + "sha256:adb029a672ae7e6ca424576641fd38d82be0dc541f7c07ad8dbd7c4a61bf1afb", + "sha256:cbb472095a57132bdb75bc63d8cd65823981efc15e1867a7983b05512381b597", + "sha256:db654f6147f8a2f0e91767fdcea09accc1a9bcd1173f14604823f6a75b1110d3", + "sha256:f55b39da24a24719319caa6c2f5ac2ad96b644a2d06365182576c915d7be6e31", + "sha256:fe5fb7da9ecd5ff95164b37541db5336260c9f5f2121a99bd2b3d059a6b3b507", + "sha256:fe6b565c660f104c185e0d131a59815aae28c5acf7d2c47ba1e352b49e6f1dff", + "sha256:fe801172574389f40050edec2e84d53a09ea2dc64da8ded83ce211db04d72796" ], "index": "pypi", - "version": "==2.0.4" + "version": "==2.0.5" }, "boto3": { "hashes": [ - "sha256:2c76db4a1208b8d09814261fc5e530fc36b3b952ef807312495e6869fa6eaad5", - "sha256:a5c815ab81219a606f20362c9d9c190f5c224bf33c5dc4c20501036cc4a9034f" + "sha256:1ab375c231547db4c9ce760e29cbe90d0341fe44910571b1bc4967a72fd8276f", + "sha256:7b8e7deee9f665612b3cd7412989aaab0337d8006a0490a188c814af137bd32d" ], "index": "pypi", - "version": "==1.28.5" + "version": "==1.28.29" }, "botocore": { "hashes": [ - "sha256:8aec97512587a5475036a982785e406c52efd260457b809846985f849c3d7cf3", - "sha256:b35114dae9c451895a11fef13d76881e2bb5428e5de8a702cc8589a28fb34c7a" + "sha256:71b335a47ee061994ac12f15ffe63c5c783cb055dc48079b7d755a46b9c1918c", + "sha256:d3dc422491b3a30667f188f3434541a1dd86d6f8ed7f98ca26e056ae7d912c85" ], "markers": "python_version >= '3.7'", - "version": "==1.31.5" + "version": "==1.31.29" }, "cffi": { "hashes": [ @@ -128,32 +132,32 @@ }, "cryptography": { "hashes": [ - "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711", - "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7", - "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd", - "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e", - "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58", - "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0", - "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d", - "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", - "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831", - "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766", - "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b", - "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c", - "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182", - "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f", - "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa", - "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4", - "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a", - "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2", - "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76", - "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5", - "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee", - "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f", - "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14" + "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306", + "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84", + "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47", + "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d", + "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116", + "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207", + "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81", + "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087", + "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd", + "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507", + "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858", + "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae", + "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34", + "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906", + "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd", + "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922", + "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7", + "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4", + "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574", + "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1", + "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c", + "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e", + "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de" ], "index": "pypi", - "version": "==41.0.2" + "version": "==41.0.3" }, "jmespath": { "hashes": [ @@ -188,11 +192,11 @@ }, "s3transfer": { "hashes": [ - "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346", - "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9" + "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", + "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" ], "markers": "python_version >= '3.7'", - "version": "==0.6.1" + "version": "==0.6.2" }, "simplejson": { "hashes": [ @@ -273,11 +277,11 @@ }, "flake8": { "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", + "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", - "version": "==6.0.0" + "version": "==6.1.0" }, "mccabe": { "hashes": [ @@ -289,19 +293,19 @@ }, "pycodestyle": { "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0", + "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8" ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.0" }, "pyflakes": { "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", + "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_version >= '3.8'", + "version": "==3.1.0" }, "tomli": { "hashes": [ From f94593de9169d21cbc68e3bf73975fe0300a2dc6 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 14:32:38 +0900 Subject: [PATCH 633/962] =?UTF-8?q?feat:=20=E5=8C=BB=E5=B8=AB=E8=A9=B3?= =?UTF-8?q?=E7=B4=B0=E7=94=BB=E9=9D=A2=E3=81=AB=E3=83=AD=E3=83=BC=E3=83=87?= =?UTF-8?q?=E3=82=A3=E3=83=B3=E3=82=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/docInfo.html | 18 +++++++++++------- ecs/jskult-webapp/src/templates/docSearch.html | 7 ++----- .../src/templates/instSearch.html | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 59a0f8ba..226a6ab5 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -45,7 +45,7 @@ - + - + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} - @@ -211,7 +212,7 @@ {% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %} {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} - @@ -225,6 +226,9 @@
@@ -58,7 +58,7 @@
+ {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}} {{doctor_wrkplace_data.inst_name_kanji or ''}} {{doctor_wrkplace_data.blng_sec_name or ''}}
+ {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}} {{doctor_wrkplace_his_data.inst_name_kanji or ''}} {{doctor_wrkplace_his_data.blng_sec_name or ''}}
- + + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 3d5c09a5..e8d89083 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -213,15 +213,12 @@ // ページ送りしたときにヘッダがずれるのを修正 FixedMidashi.remove(); FixedMidashi.create(); + // ページ送りしたときに医師情報ボタンを非活性化 + resultBtDisabled(); } }) }); - function OnLinkClick(){ - sessionStorage.clear(); - return true; - } - function transitionWithClearSearchItem(link) { sessionStorage.clear(); transitionTo(link) diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 85c23261..ea1d55de 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -211,7 +211,7 @@ // ページ送りしたときにヘッダがずれるのを修正 FixedMidashi.remove(); FixedMidashi.create(); - // ページ送りしたときに医師情報ボタンを非活性化 + // ページ送りしたときに施設情報ボタンを非活性化 resultBtDisabled(); } }) From 5d9e9720b84f1ff6d98ca5d75da744440c188dd7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 18 Aug 2023 14:37:35 +0900 Subject: [PATCH 634/962] =?UTF-8?q?feat:=20=E6=96=BD=E8=A8=AD=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E7=94=BB=E9=9D=A2=E3=81=AB=E3=83=AD=E3=83=BC=E3=83=87?= =?UTF-8?q?=E3=82=A3=E3=83=B3=E3=82=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/instInfo.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html index 00f8e9ab..6c1fa1ff 100644 --- a/ecs/jskult-webapp/src/templates/instInfo.html +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -41,13 +41,13 @@ - + - +
@@ -86,6 +86,8 @@ }else{ $('#instSearch').attr('method', 'POST'); } + // ローディングを表示 + showLoading(); return true; } @@ -283,5 +285,9 @@
+ + {% with progress_message = ''%} + {% include '_loading.html' %} + {% endwith %} \ No newline at end of file From 2376e6a6026ed60af50bca66b7c416aae0983d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 18 Aug 2023 16:19:41 +0900 Subject: [PATCH 635/962] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/ultmarc_doctor_info_view_model.py | 49 +++++++------------ .../view/ultmarc_doctor_search_view_model.py | 19 ++----- .../static/function/businessLogicScript.js | 6 +-- ecs/jskult-webapp/src/system_var/constants.py | 13 +++++ .../src/templates/docSearch.html | 15 ++---- 5 files changed, 39 insertions(+), 63 deletions(-) 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 index ab9546ad..4f027f2e 100644 --- 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 @@ -11,7 +11,7 @@ from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel from src.model.db.ultmarc_specialist_license import \ UltmarcSpecialistLicenseDBModel from src.model.db.ultmarc_trt_course import UltmarcDrTrtCourseDBModel -from src.system_var import environment +from src.system_var import constants, environment class UltmarcDoctorInfoViewModel(BaseModel): @@ -47,53 +47,40 @@ class UltmarcDoctorInfoViewModel(BaseModel): # 利用停止区分 def is_input_use_stop_div_category_name(self): - if self.doctor_info_data.use_stop_div: - use_stop_div = self.doctor_info_data.use_stop_div - # 利用停止区分の文言設定 - # 01:全面的に利用停止 - # 03:特定の項目について利用停止 - # 04:全てのDM等利用停止 - if (use_stop_div == '01'): - return '全面的に利用停止' - if (use_stop_div == '03'): - return '特定の項目について利用停止' - if (use_stop_div == '04'): - return '全てのDM等利用停止' - return '' - else: + if not self.doctor_info_data.use_stop_div: return '' + return constants.DISPLAY_USER_STOP_DIV.get(self.doctor_info_data.use_stop_div, '') # 開始年月日 def is_input_aply_start_ymd_format(self, aply_start_date: datetime): - if aply_start_date: - return self._format_date(aply_start_date) - else: + if not aply_start_date: return '' + return self._format_date(aply_start_date) # 医師勤務先履歴_開始年月日 def is_input_his_aply_start_ymd_format(self, aply_start_date_string: str): - if aply_start_date_string: - # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す - aply_start_date = datetime.strptime(aply_start_date_string, '%Y%m%d') - return self._format_date(aply_start_date) - else: + if not aply_start_date_string: return '' + # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す + aply_start_date = datetime.strptime(aply_start_date_string, '%Y%m%d') + return self._format_date(aply_start_date) + # 医師勤務先履歴_終了年月日 def is_input_his_aply_end_ymd_format(self, aply_end_date_string: str): - if aply_end_date_string: - # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す - aply_end_date = datetime.strptime(aply_end_date_string, '%Y%m%d') - return self._format_date(aply_end_date) - else: + if not aply_end_date_string: return '' + # 医師勤務先履歴の適用開始年月日は文字列型なので、日付に変換してから渡す + aply_end_date = datetime.strptime(aply_end_date_string, '%Y%m%d') + return self._format_date(aply_end_date) + # DM不可フラグ def is_input_notdm_flg_name(self, notdm_flg: str): - if notdm_flg and notdm_flg == '1': - return '不可' - else: + if not notdm_flg: return '' + if notdm_flg == '1': + return '不可' def is_input_trt_course_data_size(self): return len(self.trt_coursed_data) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py index 01fea27f..cecfd77d 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_search_view_model.py @@ -6,7 +6,7 @@ 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 +from src.system_var import constants, environment class UltmarcDoctorSearchViewModel(BaseModel): @@ -123,21 +123,8 @@ class UltmarcDoctorSearchViewModel(BaseModel): return '' return self.form_data.use_stop_div or '' - def is_input_use_stop_div_category_name(self, use_stop_div: str): - if use_stop_div: - # 利用停止区分の文言設定 - # 01:全面停止 - # 03:特定項目停止 - # 04:全DM停止 - if (use_stop_div == '01'): - return '全面停止' - if (use_stop_div == '03'): - return '特定項目停止' - if (use_stop_div == '04'): - return '全DM停止' - return '' - else: - return '' + def get_use_stop_div_category_name_short(self): + return json.dumps(constants.DISPLAY_USER_STOP_DIV_SHORT, ensure_ascii=False) def disabled_button(self): return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 41db495e..a4b2b6d9 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -12,17 +12,13 @@ function backToMenu(){ function clr() { const formElement = document.search const formInputElements = Array.from(formElement.elements) - const checkBoxArr = ['ikoFlg', 'delFlg_ctrl', 'use_stop_div_ctrl'] for (const formInput of formInputElements) { if (formInput.name.startsWith('ctrl_')) { formInput.value = ""; } - if (checkBoxArr.includes(formInput.name)) { + if (formInput.type === 'checkbox') { formInput.checked = false; } - // if(formInput.name == 'ikoFlg' || formInput.name == 'delFlg_ctrl' || formInput.name == 'use_stop_div_ctrl'){ - // formInput.checked = false; - // } } // 検索ボタンを再度非活性にする diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index e421bd70..ed3d3add 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -194,3 +194,16 @@ MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv' # CSVアップロードの制限サイズ=20MB MENTE_CSV_UPLOAD_MAX_FILE_SIZE_BYTE = 20971520 + +# 利用停止区分 +DISPLAY_USER_STOP_DIV = { + '01': '全面的に利用停止', + '03': '特定の項目について利用停止', + '04': '全てのDM等利用停止' +} + +DISPLAY_USER_STOP_DIV_SHORT = { + '01': '全面停止', + '03': '特定項目利用停止', + '04': '全DM停止' +} diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 7c219571..3342ee9b 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -239,23 +239,16 @@ 'grad_y', 'use_stop_div' ]; + const useStopDivCategoryName = JSON.parse('{{ultmarc.get_use_stop_div_category_name_short()|safe}}'); return datas.map(function (data) { let td = display_keys.map((key) =>{ let inner_content = data[key]; if(key=='dcf_pcf_dr_cd') inner_content = `${data['dcf_pcf_dr_cd'] || ''}`; - if(key=='dcf_dsf_inst_cd') + else if(key=='dcf_dsf_inst_cd') inner_content = `${data['form_inst_name_kanji'] || ''}`; - if(key=='use_stop_div') - if(inner_content == '01'){ - inner_content = '全面停止'; - }else if(inner_content == '03'){ - inner_content = '特定項目停止'; - }else if(inner_content == '04'){ - inner_content = '全DM停止'; - }else{ - inner_content = ''; - } + else if(key=='use_stop_div') + inner_content = useStopDivCategoryName[inner_content] || ''; return `
${inner_content || ''} - - + +

勤務先履歴

-
+
diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index e5f31bc3..b5b6fa15 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -111,8 +111,8 @@ diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index ea1d55de..77c0f31c 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -108,8 +108,8 @@ value="{{ultmarc.is_input_inst_addr()}}" oninput="formBtDisabled()"> From 54d4d09afa97e73a8e71343a133c6689ee8eb2ff Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 21 Aug 2023 17:37:14 +0900 Subject: [PATCH 641/962] =?UTF-8?q?fix:=20DB=E3=81=AE=E3=82=B3=E3=83=8D?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=83=97=E3=83=BC=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=B0=E3=82=92=E3=81=97=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/database.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/db/database.py b/ecs/jskult-webapp/src/db/database.py index 971c859e..b4a54fb8 100644 --- a/ecs/jskult-webapp/src/db/database.py +++ b/ecs/jskult-webapp/src/db/database.py @@ -1,4 +1,4 @@ -from sqlalchemy import (Connection, CursorResult, Engine, QueuePool, +from sqlalchemy import (Connection, CursorResult, Engine, NullPool, create_engine, event, exc, text) from sqlalchemy.engine.url import URL from sqlalchemy.pool import Pool @@ -63,8 +63,7 @@ class Database: self.__engine = create_engine( self.__connection_string, - pool_timeout=5, - poolclass=QueuePool + poolclass=NullPool ) @classmethod @@ -181,7 +180,7 @@ class Database: self.__connection = None def to_jst(self): - self.execute('SET time_zone = "+9:00"') + self.execute('SET time_zone = "+9:00"') def __execute_with_transaction(self, query: str, parameters: dict): # トランザクションを開始してクエリを実行する From aa5bab9f272cd53bd3404e4c35d2e0ce7014cdb1 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 21 Aug 2023 18:15:49 +0900 Subject: [PATCH 642/962] =?UTF-8?q?fix:=20DB=E5=A4=9A=E9=87=8D=E6=8E=A5?= =?UTF-8?q?=E7=B6=9A=E6=99=82=E3=81=AB=E8=A4=87=E6=95=B0=E3=82=B9=E3=83=AC?= =?UTF-8?q?=E3=83=83=E3=83=89=E3=81=8C=E5=87=BA=E6=9D=A5=E4=B8=8A=E3=81=8C?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86=E5=95=8F=E9=A1=8C?= =?UTF-8?q?=E3=81=AE=E5=AF=BE=E5=87=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/core/__init__.py | 0 ecs/jskult-webapp/src/core/tasks.py | 21 ------------------- ecs/jskult-webapp/src/db/tasks.py | 14 ------------- ecs/jskult-webapp/src/depends/database.py | 11 +--------- ecs/jskult-webapp/src/main.py | 5 ----- .../src/router/session_router.py | 17 +++++++++++++-- 6 files changed, 16 insertions(+), 52 deletions(-) delete mode 100644 ecs/jskult-webapp/src/core/__init__.py delete mode 100644 ecs/jskult-webapp/src/core/tasks.py delete mode 100644 ecs/jskult-webapp/src/db/tasks.py diff --git a/ecs/jskult-webapp/src/core/__init__.py b/ecs/jskult-webapp/src/core/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/ecs/jskult-webapp/src/core/tasks.py b/ecs/jskult-webapp/src/core/tasks.py deleted file mode 100644 index 93f4c8f5..00000000 --- a/ecs/jskult-webapp/src/core/tasks.py +++ /dev/null @@ -1,21 +0,0 @@ -"""FastAPIサーバーの起動・終了イベントのラッパー""" - -from typing import Callable - -from fastapi import FastAPI - -from src.db.tasks import close_db, init_db - - -def create_start_app_handler(app: FastAPI) -> Callable: - def start_app() -> None: - init_db(app) - - return start_app - - -def create_stop_app_handler(app: FastAPI) -> Callable: - def stop_app() -> None: - close_db(app) - - return stop_app diff --git a/ecs/jskult-webapp/src/db/tasks.py b/ecs/jskult-webapp/src/db/tasks.py deleted file mode 100644 index da1a6fdc..00000000 --- a/ecs/jskult-webapp/src/db/tasks.py +++ /dev/null @@ -1,14 +0,0 @@ -from fastapi import FastAPI - -from src.db.database import Database - - -def init_db(app: FastAPI) -> None: - # DB接続モジュールを初期化 - database = Database.get_instance() - # FastAPI App内で使える変数として追加 - app.state._db = database - - -def close_db(app: FastAPI) -> None: - app.state._db = None diff --git a/ecs/jskult-webapp/src/depends/database.py b/ecs/jskult-webapp/src/depends/database.py index c5b28042..65a8a967 100644 --- a/ecs/jskult-webapp/src/depends/database.py +++ b/ecs/jskult-webapp/src/depends/database.py @@ -1,17 +1,8 @@ -from typing import Callable, Type - -from fastapi import Depends from starlette.requests import Request from src.db.database import Database -from src.repositories.base_repository import BaseRepository def get_database(request: Request) -> Database: + # medaca_routerでDB接続エンジンが初期化される return request.app.state._db - - -def get_repository(Repo_type: Type[BaseRepository]) -> Callable: - def get_repo(db: Database = Depends(get_database)) -> Type[BaseRepository]: - return Repo_type(db) - return get_repo diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index c63fcb58..6ed9e6da 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -7,7 +7,6 @@ from starlette import status import src.static as static from src.controller import (bio, bio_download, healthcheck, login, logout, master_mainte, menu, root, ultmarc) -from src.core import tasks from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException @@ -41,7 +40,3 @@ app.add_exception_handler(status.HTTP_403_FORBIDDEN, http_exception_handler) # サーバーエラーが発生した場合のハンドラー。HTTPExceptionではハンドリングできないため、個別に設定 app.add_exception_handler(UnexpectedException, http_exception_handler) - -# サーバー起動・終了イベントを登録 -app.add_event_handler('startup', tasks.create_start_app_handler(app)) -app.add_event_handler('shutdown', tasks.create_stop_app_handler(app)) diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index 324c777f..a5ae4b64 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -5,6 +5,7 @@ from fastapi.exceptions import HTTPException from fastapi.routing import APIRoute from starlette import status +from src.db.database import Database from src.depends.auth import (check_session_expired, get_current_session, verify_session) from src.error.exceptions import DBException, UnexpectedException @@ -75,6 +76,18 @@ class MeDaCaRoute(APIRoute): return response +class PrepareDatabaseRoute(MeDaCaRoute): + """事前処理として、データベースのエンジンを作成するルートハンドラー + Args: + MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + """ + async def pre_process_route(self, request: Request): + request = await super().pre_process_route(request) + # DBエンジンを構築して状態にセット + request.app.state._db = Database.get_instance() + return request + + class BeforeCheckSessionRoute(MeDaCaRoute): """事前処理として、セッションチェックを行うルートハンドラー @@ -97,11 +110,11 @@ class BeforeCheckSessionRoute(MeDaCaRoute): return session_request -class AfterSetCookieSessionRoute(MeDaCaRoute): +class AfterSetCookieSessionRoute(PrepareDatabaseRoute): """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー Args: - MeDaCaRoute (MeDaCaRoute): 共通ルートハンドラー + PrepareDatabaseRoute (PrepareDatabaseRoute): DBチェックハンドラー """ async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) From 8c8b5474f7b0da8d3b1377dd29eb2de1960873dd Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 21 Aug 2023 18:16:13 +0900 Subject: [PATCH 643/962] =?UTF-8?q?fix:=20=E7=94=9F=E7=89=A9=E7=94=B1?= =?UTF-8?q?=E6=9D=A5=E7=85=A7=E4=BC=9A=E7=94=BB=E9=9D=A2=E3=81=AE=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E6=99=82=E3=81=AE=E3=83=AD=E3=83=BC=E3=83=87=E3=82=A3?= =?UTF-8?q?=E3=83=B3=E3=82=B0=E5=AF=BE=E5=BF=9C=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/templates/bioSearchList.html | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 08302af9..5dd724f6 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -28,7 +28,7 @@
- - + +
- - + +
- + @@ -473,10 +473,13 @@ {% endwith %} -
-
- 出力中... -
-
+ + {% with progress_message = '出力中...'%} + {% include '_loading.html' %} + {% endwith %} + + {% with progress_message = '', id = '_loading_for_other' %} + {% include '_loading.html' %} + {% endwith %} \ No newline at end of file From ff911ee83edb056ad11266ff5091cb6dae80b9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 22 Aug 2023 10:21:00 +0900 Subject: [PATCH 644/962] =?UTF-8?q?feat:=20=E3=82=B9=E3=82=AF=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E5=B9=85=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/static/css/ultStyle.css | 5 +++++ ecs/jskult-webapp/src/templates/docInfo.html | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 036df4a4..149d3cd8 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -53,6 +53,11 @@ table{ height: 250px; } +.scroll_workhistory{ + width: 95%; + margin: 5px auto; +} + .scroll_table::-webkit-scrollbar { height: 5px; width: 10px; diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 07ab2d6a..0c30f0b8 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -176,7 +176,7 @@

勤務先履歴

-
+
From 04b385117c4e602b4b8ea74c4b705125f29ff1a0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 22 Aug 2023 10:21:20 +0900 Subject: [PATCH 645/962] =?UTF-8?q?style:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/router/session_router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/router/session_router.py b/ecs/jskult-webapp/src/router/session_router.py index a5ae4b64..768c7f87 100644 --- a/ecs/jskult-webapp/src/router/session_router.py +++ b/ecs/jskult-webapp/src/router/session_router.py @@ -114,7 +114,7 @@ class AfterSetCookieSessionRoute(PrepareDatabaseRoute): """事後処理として、セッションキーをcookieに設定するカスタムルートハンドラー Args: - PrepareDatabaseRoute (PrepareDatabaseRoute): DBチェックハンドラー + PrepareDatabaseRoute (PrepareDatabaseRoute): DBエンジンセットアップルートハンドラー """ async def post_process_route(self, request: Request, response: Response): response = await super().post_process_route(request, response) From 077896c0fd90c13c9d4921e290955992a1b49dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 22 Aug 2023 11:22:26 +0900 Subject: [PATCH 646/962] =?UTF-8?q?formBtDisabled=E3=81=AE=E5=91=BC?= =?UTF-8?q?=E3=81=B3=E5=87=BA=E3=81=97=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/templates/docInfo.html | 2 -- ecs/jskult-webapp/src/templates/instInfo.html | 2 -- 2 files changed, 4 deletions(-) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 0c30f0b8..1ffe5360 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -10,8 +10,6 @@ window.onload = function(){ // 見出し固定初期化 FixedMidashi.create(); - // ボタン、テキストボックス初期化 - formBtDisabled(); } diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index a36d85a7..c9e30752 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -32,7 +32,7 @@
日次バッチ処理中のため、データが正しく表示されない可能性があります
{% endif %} - +
- +
- +
- + {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} - +
- + - +